VintaSoft Imaging .NET SDK 15.1: Документация для .NET разработчика
В этом разделе
PDF: PDF портфолио (вложения)
В этом разделе
Начиная с версии PDF 1.7 в PDF документах можно указать, как пользовательский интерфейс приложения для просмотра представляет коллекции вложенных файлов (Portfolio). Такое представление называется переносимой коллекцией. Смысл переносимых коллекций заключается в представлении, сортировке и поиске коллекций связанных документов, таких как архивы электронной почты, коллекции фотографий и т. д. Если вложение присутствует в PDF документе, пользовательский интерфейс представляет документ как коллекцию вложений.

Начиная с версии PDF 1.7 Extension Level 3, коллекция вложений может содержать папки для организации файлов в иерархическую структуру.

VintaSoft PDF .NET Plug-in позволяет:

Управление портфолио с помощью VintaSoft PDF .NET Plug-in

Новая пустая коллекция вложений (портфолио) PDF документа может быть создана с помощью метода PdfDocument.CreateAttachments.

Текущая коллекция вложений (портфолио) PDF документа и связанные с ней структуры данных могут быть удалены с помощью метода PdfDocument.RemoveAttachments.

Доступ к коллекции вложений (портфолио) можно получить с помощью свойства PdfDocument.Attachments.

Ниже приведен список основных свойств и методов, используемых для управления коллекцией вложений:

Настройки внешнего вида PDF просмотрщика, связанные с портфолио

За визуальный вид PDF просмотрщика отвечают следующие свойства:

Схема портфолио

Схема коллекции вложений (PdfAttachmentCollection.Schema) определяет столбцы данных в режиме просмотра DetailsMode.

Схема представлена классом PdfAttachmentCollectionSchema и представляет собой словарь, в котором каждому имени поля схемы ставится в соответствие объект типа PdfAttachmentCollectionSchemaField. Объект класса PdfAttachmentCollectionSchemaField описывает тип и параметры колонки данных в режиме просмотра DetailsMode: Данные, отображаемые в колонке, определяются свойством PdfAttachmentCollectionSchemaField.DataType: Данные полей типов AttachmentCollectionSchemaFieldDataType.String, AttachmentCollectionSchemaFieldDataType.Date и AttachmentCollectionSchemaFieldDataType.Number хранятся в словаре полей данных (PdfAttachmentDataFieldCollection) соответствующей папки или файла: Ключом в словаре полей данных является имя соответствующего поля схемы данных (т.е. ключ находится в словаре PdfAttachmentCollection.Schema).

Данные поля данных можно получить следующими способами: Данные поля данных могут быть заданы следующими способами:
Вот C#/VB.NET код, который демонстрирует, как создать схему портфолио:

/// <summary>
/// Creates new PDF document with portfolio and portfolio schema:
/// </summary>
/// <param name="outputPdfFilename">The output PDF filename.</param>
public static void TestPdfAttachmentCollectionSchema(string outputPdfFilename)
{
    // create PDF document (version 1.7)
    using (Vintasoft.Imaging.Pdf.PdfDocument document =
        new Vintasoft.Imaging.Pdf.PdfDocument(outputPdfFilename, Vintasoft.Imaging.Pdf.PdfFormat.Pdf_17))
    {
        // add page to PDF document
        Vintasoft.Imaging.Pdf.Tree.PdfPage page = document.Pages.Add(Vintasoft.Imaging.PaperSizeKind.A4);

        // draw text on first page
        using (Vintasoft.Imaging.Pdf.Drawing.PdfGraphics g = page.GetGraphics())
        {
            Vintasoft.Imaging.Pdf.Drawing.GraphicsFigures.TextBoxFigure textBox =
                new Vintasoft.Imaging.Pdf.Drawing.GraphicsFigures.TextBoxFigure();
            textBox.Font = document.FontManager.GetStandardFont(
                Vintasoft.Imaging.Pdf.Tree.Fonts.PdfStandardFontType.TimesRoman);
            textBox.FontSize = 30;
            textBox.Location = new System.Drawing.PointF(0, 0);
            textBox.Size = page.MediaBox.Size;
            textBox.TextAlignment =
                Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Top |
                Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Left |
                Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Right;
            textBox.TextBrush = new Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Black);
            textBox.Text = "This document is Portfolio\n(Attachment Collection)\nTo view Portfolio you should use PDF viewer compatible with PDF 1.7 ExtensionLevel 3.";
            textBox.Draw(g);
        }

        // create attachements
        document.CreateAttachments(true);

        // set viewer settings
        document.Attachments.View = Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionViewMode.DetailsMode;
        document.Attachments.SplitterBar = new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSplitterBar(document);
        document.Attachments.SplitterBar.Direction = Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSplitterBarDirection.None;
        document.DocumentViewMode = Vintasoft.Imaging.Pdf.PdfDocumentViewMode.UseAttachments;

        // create folder and files
        Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder folder1 = document.Attachments.RootFolder.AddFolder("Folder1");
        folder1.CreationDate = System.DateTime.Now;
        Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFileSpecification file1 = AddFile(document.Attachments.RootFolder, "File1.txt", "Test File1");
        file1.CreationDate = System.DateTime.Now;
        Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFileSpecification file2 = AddFile(document.Attachments.RootFolder, "File2.txt", "Test File2");
        file2.CreationDate = System.DateTime.Now;


        // create portfolio schema
        document.Attachments.Schema =
            new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchema(document);

        // "File Name" column
        document.Attachments.Schema.Add("Filename",
            new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField(document, "File Name",
                Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSchemaFieldDataType.Filename));
        document.Attachments.Schema["Filename"].Order = 0;

        // "Uncompressed Size" column
        document.Attachments.Schema.Add("UncompressedSize",
            new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField(document, "Uncompressed Size",
                Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSchemaFieldDataType.UncompressedSize));
        document.Attachments.Schema["UncompressedSize"].Order = 1;

        // "Creation Date" column
        document.Attachments.Schema.Add("CreationDate",
            new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField(document, "Creation Date",
                Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSchemaFieldDataType.CreationDate));
        document.Attachments.Schema["CreationDate"].Order = 2;

        // "Description" column
        document.Attachments.Schema.Add("Description",
            new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField(document, "Description",
                Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSchemaFieldDataType.FileDescription));
        document.Attachments.Schema["Description"].Order = 3;
        // set Description field as editable
        document.Attachments.Schema["Description"].IsSupportsEditing = true;

        // "UserName" custom column (string data)
        string userNameFieldName = "adobe:UserName";
        document.Attachments.Schema.Add(userNameFieldName,
            new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField(document, "User Name",
                Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSchemaFieldDataType.String));
        document.Attachments.Schema[userNameFieldName].Order = 4;
        // disable editing of UserName field
        document.Attachments.Schema[userNameFieldName].IsSupportsEditing = false;

        // invisible schema field that is used for sorting attachment collection items
        string orderFieldName = "Order";
        document.Attachments.Schema.Add(orderFieldName,
            new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField(document, "Order",
                Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSchemaFieldDataType.Number));
        document.Attachments.Schema[orderFieldName].Order = 5;
        document.Attachments.Schema[orderFieldName].IsVisible = false;

        // specify the sorting order: first sort by "Order" field, second sort by "Filename" field
        document.Attachments.Sort = new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSort(document);
        document.Attachments.Sort.FieldNames = new string[] { orderFieldName, "Filename" };


        // create data fields of Folder1
        folder1.DataFields = new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentDataFieldCollection(document);
        folder1.DataFields.Add(userNameFieldName, "User of Folder1");
        folder1.DataFields.Add(orderFieldName, 0);

        // create data fields of File1
        file1.DataFields = new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentDataFieldCollection(document);
        file1.DataFields.Add(userNameFieldName, "User of File1");
        file1.DataFields.Add(orderFieldName, 1);

        // create data fields of File2
        file2.DataFields = new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentDataFieldCollection(document);
        file2.DataFields.Add(userNameFieldName, "User of File2");
        file2.DataFields.Add(orderFieldName, 2);

        // set descriptions
        folder1.Description = "Is empty folder.";
        file1.Description = "Description of File1";
        file2.Description = "Description of File2";


        // save changes in PDF document
        document.SaveChanges();
    }
}

/// <summary>
/// Adds the file to specified portfolio folder.
/// </summary>
/// <param name="folder">The portfolio folder.</param>
/// <param name="filename">The filename.</param>
/// <param name="fileContent">Content of the file.</param>
/// <returns>Embedded file specification that contains added file.</returns>
private static Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFileSpecification AddFile(
    Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder folder,
    string filename,
    string fileContent)
{
    using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
    {
        using (System.IO.TextWriter writer = new System.IO.StreamWriter(stream))
        {
            writer.Write(fileContent);
            writer.Flush();
            stream.Position = 0;
            Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFile embeddedFile =
                new Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFile(folder.Document, stream);
            return folder.AddFile(embeddedFile, filename);
        }
    }
}
''' <summary>
''' Creates new PDF document with portfolio and portfolio schema:
''' </summary>
''' <param name="outputPdfFilename">The output PDF filename.</param>
Public Shared Sub TestPdfAttachmentCollectionSchema(outputPdfFilename As String)
    ' create PDF document (version 1.7)
    Using document As New Vintasoft.Imaging.Pdf.PdfDocument(outputPdfFilename, Vintasoft.Imaging.Pdf.PdfFormat.Pdf_17)
        ' add page to PDF document
        Dim page As Vintasoft.Imaging.Pdf.Tree.PdfPage = document.Pages.Add(Vintasoft.Imaging.PaperSizeKind.A4)

        ' draw text on first page
        Using g As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics = page.GetGraphics()
            Dim textBox As New Vintasoft.Imaging.Pdf.Drawing.GraphicsFigures.TextBoxFigure()
            textBox.Font = document.FontManager.GetStandardFont(Vintasoft.Imaging.Pdf.Tree.Fonts.PdfStandardFontType.TimesRoman)
            textBox.FontSize = 30
            textBox.Location = New System.Drawing.PointF(0, 0)
            textBox.Size = page.MediaBox.Size
            textBox.TextAlignment = Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Top Or Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Left Or Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Right
            textBox.TextBrush = New Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Black)
            textBox.Text = "This document is Portfolio" & vbLf & "(Attachment Collection)" & vbLf & "To view Portfolio you should use PDF viewer compatible with PDF 1.7 ExtensionLevel 3."
            textBox.Draw(g)
        End Using

        ' create attachements
        document.CreateAttachments(True)

        ' set viewer settings
        document.Attachments.View = Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionViewMode.DetailsMode
        document.Attachments.SplitterBar = New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSplitterBar(document)
        document.Attachments.SplitterBar.Direction = Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSplitterBarDirection.None
        document.DocumentViewMode = Vintasoft.Imaging.Pdf.PdfDocumentViewMode.UseAttachments

        ' create folder and files
        Dim folder1 As Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder = document.Attachments.RootFolder.AddFolder("Folder1")
        folder1.CreationDate = System.DateTime.Now
        Dim file1 As Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFileSpecification = AddFile(document.Attachments.RootFolder, "File1.txt", "Test File1")
        file1.CreationDate = System.DateTime.Now
        Dim file2 As Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFileSpecification = AddFile(document.Attachments.RootFolder, "File2.txt", "Test File2")
        file2.CreationDate = System.DateTime.Now


        ' create portfolio schema
        document.Attachments.Schema = New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchema(document)

        ' "File Name" column
        document.Attachments.Schema.Add("Filename", New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField(document, "File Name", Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSchemaFieldDataType.Filename))
        document.Attachments.Schema("Filename").Order = 0

        ' "Uncompressed Size" column
        document.Attachments.Schema.Add("UncompressedSize", New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField(document, "Uncompressed Size", Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSchemaFieldDataType.UncompressedSize))
        document.Attachments.Schema("UncompressedSize").Order = 1

        ' "Creation Date" column
        document.Attachments.Schema.Add("CreationDate", New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField(document, "Creation Date", Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSchemaFieldDataType.CreationDate))
        document.Attachments.Schema("CreationDate").Order = 2

        ' "Description" column
        document.Attachments.Schema.Add("Description", New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField(document, "Description", Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSchemaFieldDataType.FileDescription))
        document.Attachments.Schema("Description").Order = 3
        ' set Description field as editable
        document.Attachments.Schema("Description").IsSupportsEditing = True

        ' "UserName" custom column (string data)
        Dim userNameFieldName As String = "adobe:UserName"
        document.Attachments.Schema.Add(userNameFieldName, New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField(document, "User Name", Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSchemaFieldDataType.[String]))
        document.Attachments.Schema(userNameFieldName).Order = 4
        ' disable editing of UserName field
        document.Attachments.Schema(userNameFieldName).IsSupportsEditing = False

        ' invisible schema field that is used for sorting attachment collection items
        Dim orderFieldName As String = "Order"
        document.Attachments.Schema.Add(orderFieldName, New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField(document, "Order", Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSchemaFieldDataType.Number))
        document.Attachments.Schema(orderFieldName).Order = 5
        document.Attachments.Schema(orderFieldName).IsVisible = False

        ' specify the sorting order: first sort by "Order" field, second sort by "Filename" field
        document.Attachments.Sort = New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSort(document)
        document.Attachments.Sort.FieldNames = New String() {orderFieldName, "Filename"}


        ' create data fields of Folder1
        folder1.DataFields = New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentDataFieldCollection(document)
        folder1.DataFields.Add(userNameFieldName, "User of Folder1")
        folder1.DataFields.Add(orderFieldName, 0)

        ' create data fields of File1
        file1.DataFields = New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentDataFieldCollection(document)
        file1.DataFields.Add(userNameFieldName, "User of File1")
        file1.DataFields.Add(orderFieldName, 1)

        ' create data fields of File2
        file2.DataFields = New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentDataFieldCollection(document)
        file2.DataFields.Add(userNameFieldName, "User of File2")
        file2.DataFields.Add(orderFieldName, 2)

        ' set descriptions
        folder1.Description = "Is empty folder."
        file1.Description = "Description of File1"
        file2.Description = "Description of File2"


        ' save changes in PDF document
        document.SaveChanges()
    End Using
End Sub

''' <summary>
''' Adds the file to specified portfolio folder.
''' </summary>
''' <param name="folder">The portfolio folder.</param>
''' <param name="filename">The filename.</param>
''' <param name="fileContent">Content of the file.</param>
''' <returns>Embedded file specification that contains added file.</returns>
Private Shared Function AddFile(folder As Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder, filename As String, fileContent As String) As Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFileSpecification
    Using stream As New System.IO.MemoryStream()
        Using writer As System.IO.TextWriter = New System.IO.StreamWriter(stream)
            writer.Write(fileContent)
            writer.Flush()
            stream.Position = 0
            Dim embeddedFile As New Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFile(folder.Document, stream)
            Return folder.AddFile(embeddedFile, filename)
        End Using
    End Using
End Function



Примеры

Вот C#/VB.NET код, который демонстрирует, как получить информацию о вложениях PDF документа:

/// <summary>
/// Prints the portfolio structure.
/// </summary>
/// <param name="pdfFilename">The PDF filename.</param>
public static void PrintPortfolioStructure(string pdfFilename)
{
    // open PDF document in read-only mode
    using (Vintasoft.Imaging.Pdf.PdfDocument document =
        new Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename, true))
    {
        // if PDF document does not contain portfolio
        if (document.Attachments == null)
        {
            System.Console.WriteLine("Document does not have attachments (portfolio).");
            return;
        }

        // print initial view mode
        System.Console.WriteLine(string.Format("Initial View Mode = {0}", document.Attachments.View));

        // print colors information
        if (document.Attachments.Colors != null)
            PrintPortfolioColors(document.Attachments.Colors);

        // print portfolio schema
        if (document.Attachments.Schema != null)
            PrintPortfolioSchema(document.Attachments.Schema);

        // print portfolio sort settings
        if (document.Attachments.Sort != null)
            PrintPortfolioSort(document.Attachments.Sort);

        // print portfolio splitter bar settings
        if (document.Attachments.SplitterBar != null)
            PrintPortfolioSplitterBar(document.Attachments.SplitterBar);

        // print portfolio folders and files
        if (document.Attachments.RootFolder != null)
        {
            System.Console.WriteLine("Folder structure:");
            PrintFolderStructure(document.Attachments.RootFolder, "  ");
        }
        else
        {
            System.Console.WriteLine("Files:");
            PrintFileInfo(document.Attachments.GetFiles(""), "  ");
        }
    }
}

/// <summary>
/// Prints the folder structure.
/// </summary>
/// <param name="folder">The PDF attachment folder.</param>
/// <param name="padding">Padding.</param>
private static void PrintFolderStructure(
    Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder folder, string padding)
{
    System.Console.WriteLine(string.Format("{0}Folder: {1}", padding, folder.Name));
    padding += "  ";
    PrintFileInfo(folder.Files, padding);
    Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder[] subFolders = folder.Folders;
    if (subFolders != null)
    {
        foreach (Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder subFolder in subFolders)
            PrintFolderStructure(subFolder, padding);
    }
}

/// <summary>
/// Prints the portfolio splitter bar information.
/// </summary>
/// <param name="splitterBar">The splitter bar.</param>
private static void PrintPortfolioSplitterBar(
    Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSplitterBar splitterBar)
{
    System.Console.WriteLine("Splitter Bar:");
    System.Console.WriteLine(string.Format("  Direction = {0}", splitterBar.Direction));
    System.Console.WriteLine(string.Format("  Position  = {0}", splitterBar.Position));
}

/// <summary>
/// Prints an information for specified files.
/// </summary>
/// <param name="fileSpecs">The PDF embedded file specifications.</param>
/// <param name="padding">Padding.</param>
private static void PrintFileInfo(
    Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFileSpecification[] fileSpecs, string padding)
{
    foreach (Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFileSpecification fileSpec in fileSpecs)
    {
        System.Console.WriteLine(string.Format("{0}File: {1}", padding, fileSpec.Filename));
        System.Console.WriteLine(string.Format("{0}  CompressedSize   = {1}", padding, fileSpec.CompressedSize));
        System.Console.WriteLine(string.Format("{0}  UncompressedSize = {1}", padding, fileSpec.UncompressedSize));
        System.Console.WriteLine(string.Format("{0}  Compression      = {1}", padding, fileSpec.Compression));
        System.Console.WriteLine(string.Format("{0}  CreationDate     = {1}", padding, fileSpec.CreationDate));
        System.Console.WriteLine(string.Format("{0}  ModificationDate = {1}", padding, fileSpec.ModificationDate));
        System.Console.WriteLine(string.Format("{0}  Description      = {1}", padding, fileSpec.Description));
        System.Console.WriteLine(string.Format("{0}  HasThumbnail     = {1}", padding, fileSpec.Thumbnail != null));
        if (fileSpec.DataFields != null)
        {
            System.Console.WriteLine("    DataFields:");
            foreach (string name in fileSpec.DataFields.Keys)
            {
                System.Console.WriteLine(string.Format("      {0}={1}", name,
                    fileSpec.DataFields[name].DataAsString));
            }
        }
    }
}

/// <summary>
/// Prints the portfolio sort properties.
/// </summary>
/// <param name="sort">The PDF attachment collection sort properties.</param>
private static void PrintPortfolioSort(
    Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSort sort)
{
    System.Console.WriteLine("Sort:");
    System.Console.WriteLine("  Field names:");
    string[] fieldNames = sort.FieldNames;
    for (int i = 0; i < fieldNames.Length; i++)
        System.Console.WriteLine("    {0}: {1}", i, fieldNames[i]);

    System.Console.WriteLine("  Ascending orders:");
    bool[] ascendingOrders = sort.AscendingOrders;
    for (int i = 0; i < ascendingOrders.Length; i++)
        System.Console.WriteLine("    {0}: {1}", i, ascendingOrders[i]);
}

/// <summary>
/// Prints the portfolio schema.
/// </summary>
/// <param name="schema">The PDF attachment collection schema.</param>
private static void PrintPortfolioSchema(
    Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchema schema)
{
    System.Console.WriteLine("Schema:");
    foreach (string key in schema.Keys)
    {
        System.Console.WriteLine(string.Format("  {0}:", key));
        Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField field = schema[key];
        System.Console.WriteLine("    DataType          = {0}", field.DataType);
        System.Console.WriteLine("    DisplayedName     = {0}", field.DisplayedName);
        System.Console.WriteLine("    IsSupportsEditing = {0}", field.IsSupportsEditing);
        System.Console.WriteLine("    IsVisible         = {0}", field.IsVisible);
        System.Console.WriteLine("    Order             = {0}", field.Order);
    }
}

/// <summary>
/// Prints the portfolio colors information.
/// </summary>
/// <param name="presentationColors">The presentation colors.</param>
private static void PrintPortfolioColors(
    Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfPresentationColors presentationColors)
{
    System.Console.WriteLine("Colors:");
    System.Console.WriteLine(string.Format("  Background     = {0}", presentationColors.Background));
    System.Console.WriteLine(string.Format("  CardBackground = {0}", presentationColors.CardBackground));
    System.Console.WriteLine(string.Format("  CardBorder     = {0}", presentationColors.CardBorder));
    System.Console.WriteLine(string.Format("  PrimaryText    = {0}", presentationColors.PrimaryText));
    System.Console.WriteLine(string.Format("  SecondaryText  = {0}", presentationColors.SecondaryText));
}
''' <summary>
''' Prints the portfolio structure.
''' </summary>
''' <param name="pdfFilename">The PDF filename.</param>
Public Shared Sub PrintPortfolioStructure(pdfFilename As String)
    ' open PDF document in read-only mode
    Using document As New Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename, True)
        ' if PDF document does not contain portfolio
        If document.Attachments Is Nothing Then
            System.Console.WriteLine("Document does not have attachments (portfolio).")
            Return
        End If

        ' print initial view mode
        System.Console.WriteLine(String.Format("Initial View Mode = {0}", document.Attachments.View))

        ' print colors information
        If document.Attachments.Colors IsNot Nothing Then
            PrintPortfolioColors(document.Attachments.Colors)
        End If

        ' print portfolio schema
        If document.Attachments.Schema IsNot Nothing Then
            PrintPortfolioSchema(document.Attachments.Schema)
        End If

        ' print portfolio sort settings
        If document.Attachments.Sort IsNot Nothing Then
            PrintPortfolioSort(document.Attachments.Sort)
        End If

        ' print portfolio splitter bar settings
        If document.Attachments.SplitterBar IsNot Nothing Then
            PrintPortfolioSplitterBar(document.Attachments.SplitterBar)
        End If

        ' print portfolio folders and files
        If document.Attachments.RootFolder IsNot Nothing Then
            System.Console.WriteLine("Folder structure:")
            PrintFolderStructure(document.Attachments.RootFolder, "  ")
        Else
            System.Console.WriteLine("Files:")
            PrintFileInfo(document.Attachments.GetFiles(""), "  ")
        End If
    End Using
End Sub

''' <summary>
''' Prints the folder structure.
''' </summary>
''' <param name="folder">The PDF attachment folder.</param>
''' <param name="padding">Padding.</param>
Private Shared Sub PrintFolderStructure(folder As Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder, padding As String)
    System.Console.WriteLine(String.Format("{0}Folder: {1}", padding, folder.Name))
    padding += "  "
    PrintFileInfo(folder.Files, padding)
    Dim subFolders As Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder() = folder.Folders
    If subFolders IsNot Nothing Then
        For Each subFolder As Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder In subFolders
            PrintFolderStructure(subFolder, padding)
        Next
    End If
End Sub

''' <summary>
''' Prints the portfolio splitter bar information.
''' </summary>
''' <param name="splitterBar">The splitter bar.</param>
Private Shared Sub PrintPortfolioSplitterBar(splitterBar As Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSplitterBar)
    System.Console.WriteLine("Splitter Bar:")
    System.Console.WriteLine(String.Format("  Direction = {0}", splitterBar.Direction))
    System.Console.WriteLine(String.Format("  Position  = {0}", splitterBar.Position))
End Sub

''' <summary>
''' Prints an information for specified files.
''' </summary>
''' <param name="fileSpecs">The PDF embedded file specifications.</param>
''' <param name="padding">Padding.</param>
Private Shared Sub PrintFileInfo(fileSpecs As Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFileSpecification(), padding As String)
    For Each fileSpec As Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFileSpecification In fileSpecs
        System.Console.WriteLine(String.Format("{0}File: {1}", padding, fileSpec.Filename))
        System.Console.WriteLine(String.Format("{0}  CompressedSize   = {1}", padding, fileSpec.CompressedSize))
        System.Console.WriteLine(String.Format("{0}  UncompressedSize = {1}", padding, fileSpec.UncompressedSize))
        System.Console.WriteLine(String.Format("{0}  Compression      = {1}", padding, fileSpec.Compression))
        System.Console.WriteLine(String.Format("{0}  CreationDate     = {1}", padding, fileSpec.CreationDate))
        System.Console.WriteLine(String.Format("{0}  ModificationDate = {1}", padding, fileSpec.ModificationDate))
        System.Console.WriteLine(String.Format("{0}  Description      = {1}", padding, fileSpec.Description))
        System.Console.WriteLine(String.Format("{0}  HasThumbnail     = {1}", padding, fileSpec.Thumbnail IsNot Nothing))
        If fileSpec.DataFields IsNot Nothing Then
            System.Console.WriteLine("    DataFields:")
            For Each name As String In fileSpec.DataFields.Keys
                System.Console.WriteLine(String.Format("      {0}={1}", name, fileSpec.DataFields(name).DataAsString))
            Next
        End If
    Next
End Sub

''' <summary>
''' Prints the portfolio sort properties.
''' </summary>
''' <param name="sort">The PDF attachment collection sort properties.</param>
Private Shared Sub PrintPortfolioSort(sort As Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSort)
    System.Console.WriteLine("Sort:")
    System.Console.WriteLine("  Field names:")
    Dim fieldNames As String() = sort.FieldNames
    For i As Integer = 0 To fieldNames.Length - 1
        System.Console.WriteLine("    {0}: {1}", i, fieldNames(i))
    Next

    System.Console.WriteLine("  Ascending orders:")
    Dim ascendingOrders As Boolean() = sort.AscendingOrders
    For i As Integer = 0 To ascendingOrders.Length - 1
        System.Console.WriteLine("    {0}: {1}", i, ascendingOrders(i))
    Next
End Sub

''' <summary>
''' Prints the portfolio schema.
''' </summary>
''' <param name="schema">The PDF attachment collection schema.</param>
Private Shared Sub PrintPortfolioSchema(schema As Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchema)
    System.Console.WriteLine("Schema:")
    For Each key As String In schema.Keys
        System.Console.WriteLine(String.Format("  {0}:", key))
        Dim field As Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField = schema(key)
        System.Console.WriteLine("    DataType          = {0}", field.DataType)
        System.Console.WriteLine("    DisplayedName     = {0}", field.DisplayedName)
        System.Console.WriteLine("    IsSupportsEditing = {0}", field.IsSupportsEditing)
        System.Console.WriteLine("    IsVisible         = {0}", field.IsVisible)
        System.Console.WriteLine("    Order             = {0}", field.Order)
    Next
End Sub

''' <summary>
''' Prints the portfolio colors information.
''' </summary>
''' <param name="presentationColors">The presentation colors.</param>
Private Shared Sub PrintPortfolioColors(presentationColors As Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfPresentationColors)
    System.Console.WriteLine("Colors:")
    System.Console.WriteLine(String.Format("  Background     = {0}", presentationColors.Background))
    System.Console.WriteLine(String.Format("  CardBackground = {0}", presentationColors.CardBackground))
    System.Console.WriteLine(String.Format("  CardBorder     = {0}", presentationColors.CardBorder))
    System.Console.WriteLine(String.Format("  PrimaryText    = {0}", presentationColors.PrimaryText))
    System.Console.WriteLine(String.Format("  SecondaryText  = {0}", presentationColors.SecondaryText))
End Sub



Вот C#/VB.NET код, который демонстрирует, как создать новое портфолио:

/// <summary>
/// Assemblies a portfolio from files and folders from specified path.
/// </summary>
/// <param name="rootPath">The root path to assembly portfolio.</param>
/// <param name="outputPdfFilename">The output PDF filename.</param>
public static void AssemblyPortfolio(string rootPath, string outputPdfFilename)
{
    // create PDF document (version 1.7)
    using (Vintasoft.Imaging.Pdf.PdfDocument document = new Vintasoft.Imaging.Pdf.PdfDocument(
        outputPdfFilename, Vintasoft.Imaging.Pdf.PdfFormat.Pdf_17))
    {
        // add page to document
        Vintasoft.Imaging.Pdf.Tree.PdfPage page = document.Pages.Add(
            Vintasoft.Imaging.PaperSizeKind.A4);

        // draw text on first page
        using (Vintasoft.Imaging.Pdf.Drawing.PdfGraphics g = page.GetGraphics())
        {
            Vintasoft.Imaging.Pdf.Drawing.GraphicsFigures.TextBoxFigure textBox =
                new Vintasoft.Imaging.Pdf.Drawing.GraphicsFigures.TextBoxFigure();
            textBox.Font = document.FontManager.GetStandardFont(Vintasoft.Imaging.Pdf.Tree.Fonts.PdfStandardFontType.TimesRoman);
            textBox.FontSize = 30;
            textBox.Location = new System.Drawing.PointF(0, 0);
            textBox.Size = page.MediaBox.Size;
            textBox.TextAlignment =
                Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Top |
                Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Left |
                Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Right;
            textBox.TextBrush = new Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Black);
            textBox.Text = "This document is Portfolio\n(Attachment Collection)\nTo view Portfolio you should use PDF viewer compatible with PDF 1.7 ExtensionLevel 3.";
            textBox.Draw(g);
        }

        // create attachements
        document.CreateAttachments(true);

        // set viewer settings
        document.Attachments.View = Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionViewMode.TileMode;
        document.Attachments.SplitterBar =
            new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSplitterBar(document);
        document.Attachments.SplitterBar.Direction =
            Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSplitterBarDirection.None;
        document.DocumentViewMode = Vintasoft.Imaging.Pdf.PdfDocumentViewMode.UseAttachments;

        // create field that defines sorting of files and folders in PDF viewer
        string sortFieldName = "Order";
        Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField sortField =
            new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField(
                document, "Order (Sort)",
                Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSchemaFieldDataType.Number);
        sortField.IsVisible = false;
        document.Attachments.Schema = new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchema(document);
        document.Attachments.Schema.Add(sortFieldName, sortField);

        // create sort properties
        document.Attachments.Sort = new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSort(document);
        document.Attachments.Sort.FieldNames = new string[] { sortFieldName };

        // use ZIP compression for files
        Vintasoft.Imaging.Pdf.PdfCompression filesCompression = Vintasoft.Imaging.Pdf.PdfCompression.Zip;

        // add files and folders to portfolio
        AddPathRecursively(
            document.Attachments.RootFolder,
            rootPath,
            false,
            filesCompression,
            true,
            sortFieldName);

        // save changes in PDF document
        document.SaveChanges();
    }
}

/// <summary>
/// Adds the path (all files and sub folders) to specified portfolio folder.
/// </summary>
/// <param name="folder">The portfolio folder.</param>
/// <param name="path">The path that should be added to the portfolio.</param>
/// <param name="addPathAsFolder">Determines that portfolio must contain folder with the path filename.</param>
/// <param name="compression">The compression that should be applied to files and folders.</param>
/// <param name="generateThumbnails">Determines that portfolio must contain thumbnails for files.</param>
/// <param name="sortFieldName">Name of the sort field.</param>
/// <returns>
/// Added folder.
/// </returns>
private static Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder AddPathRecursively(
    Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder folder,
    string path,
    bool addPathAsFolder,
    Vintasoft.Imaging.Pdf.PdfCompression compression,
    bool generateThumbnails,
    string sortFieldName)
{
    // sort order
    int order = 0;

    // folder to which path must be added
    Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder currentFolder;
    // if portfolio must contain folder with the path filename
    if (addPathAsFolder)
    {
        // add new folder to portfolio folder and use it as current folder
        currentFolder = folder.AddFolder(System.IO.Path.GetFileName(path));
        currentFolder.CreationDate = System.DateTime.Now;
    }
    else
    {
        // use root folder as current folder
        currentFolder = folder;
        folder.ModificationDate = System.DateTime.Now;
    }

    // get directories in the specified path
    string[] paths = System.IO.Directory.GetDirectories(path, "*", System.IO.SearchOption.TopDirectoryOnly);
    // for each directory
    foreach (string subPath in paths)
    {
        // if directory is hidden
        if ((System.IO.File.GetAttributes(subPath) & System.IO.FileAttributes.Hidden) != 0)
            // ignore directory
            continue;

        try
        {
            // add the directory (all files and sub folders) to current portfolio folder
            Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder addedSubFolder =
                AddPathRecursively(currentFolder, subPath, true, compression, generateThumbnails, sortFieldName);

            // if sorting must be used
            if (sortFieldName != null)
            {
                // add data field collection to the portfolio folder
                addedSubFolder.DataFields =
                    new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentDataFieldCollection(folder.Document);
                // add data field value which defines sorting
                addedSubFolder.DataFields.Add(sortFieldName,
                    new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentDataField(folder.Document, order));
                // increment sort order
                order++;
            }
        }
        catch (System.Exception ex)
        {
            System.Console.WriteLine(string.Format("{0}: {1}", currentFolder, ex.Message));
        }
    }

    // get files in the specified path
    string[] files = System.IO.Directory.GetFiles(path, "*", System.IO.SearchOption.TopDirectoryOnly);
    // if files are found
    if (files.Length > 0)
    {
        // for each file
        foreach (string filename in files)
        {
            // if file is hidden
            if ((System.IO.File.GetAttributes(filename) & System.IO.FileAttributes.Hidden) != 0)
                // ignore file
                continue;

            try
            {
                // add file
                System.Console.WriteLine(string.Format("Add file {0}...", filename));
                Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFileSpecification file = currentFolder.AddFile(filename, compression);
                file.EmbeddedFile.CreationDate = System.DateTime.Now;

                // if thumbnail must be generated
                if (generateThumbnails)
                    // generate file thumbnail
                    file.Thumbnail = CreateThumbnailResource(file.Document, filename);

                // if sorting must be used
                if (sortFieldName != null)
                {
                    // add data field collection to the portfolio folder
                    file.DataFields =
                        new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentDataFieldCollection(folder.Document);
                    // add data field value which defines sorting
                    file.DataFields.Add(sortFieldName,
                        new Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentDataField(folder.Document, order));
                    // increment sort order
                    order++;
                }

            }
            catch (System.Exception ex)
            {
                System.Console.WriteLine(string.Format("{0}: {1}", filename, ex.Message));
            }
        }
        currentFolder.ModificationDate = System.DateTime.Now;
    }

    return currentFolder;
}

/// <summary>
/// Creates PDF image resource with thumbnail of specified file.
/// </summary>
/// <param name="document">The PDF document.</param>
/// <param name="filename">The name of file for which thumbnail must be generated.</param>
/// <returns>Thumbnail image resource.</returns>
private static Vintasoft.Imaging.Pdf.Tree.PdfImageResource CreateThumbnailResource(
    Vintasoft.Imaging.Pdf.PdfDocument document, string filename)
{
    // get codec for file
    Vintasoft.Imaging.Codecs.Codec codec = Vintasoft.Imaging.Codecs.AvailableCodecs.GetCodecByExtension(
        System.IO.Path.GetExtension(filename));
    // if code is available and codec has decoder
    if (codec != null && codec.CanCreateDecoder)
    {
        try
        {
            // get an image of first page of file
            using (Vintasoft.Imaging.VintasoftImage image = new Vintasoft.Imaging.VintasoftImage(filename))
            {
                // get image thumbnail
                using (Vintasoft.Imaging.VintasoftImage thumbnailImage = image.Thumbnail.GetThumbnailImage(100, 100))
                {
                    Vintasoft.Imaging.Pdf.PdfCompressionSettings compressionSettings =
                        new Vintasoft.Imaging.Pdf.PdfCompressionSettings();
                    compressionSettings.JpegQuality = 90;
                    // return PDF image-resource that contains image thumbnail
                    return new Vintasoft.Imaging.Pdf.Tree.PdfImageResource(document, thumbnailImage,
                        Vintasoft.Imaging.Pdf.PdfCompression.Jpeg, compressionSettings);
                }
            }
        }
        catch
        {
        }
    }
    return null;
}

''' <summary>
''' Assemblies a portfolio from files and folders from specified path.
''' </summary>
''' <param name="rootPath">The root path to assembly portfolio.</param>
''' <param name="outputPdfFilename">The output PDF filename.</param>
Public Shared Sub AssemblyPortfolio(rootPath As String, outputPdfFilename As String)
    ' create PDF document (version 1.7)
    Using document As New Vintasoft.Imaging.Pdf.PdfDocument(outputPdfFilename, Vintasoft.Imaging.Pdf.PdfFormat.Pdf_17)
        ' add page to document
        Dim page As Vintasoft.Imaging.Pdf.Tree.PdfPage = document.Pages.Add(Vintasoft.Imaging.PaperSizeKind.A4)

        ' draw text on first page
        Using g As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics = page.GetGraphics()
            Dim textBox As New Vintasoft.Imaging.Pdf.Drawing.GraphicsFigures.TextBoxFigure()
            textBox.Font = document.FontManager.GetStandardFont(Vintasoft.Imaging.Pdf.Tree.Fonts.PdfStandardFontType.TimesRoman)
            textBox.FontSize = 30
            textBox.Location = New System.Drawing.PointF(0, 0)
            textBox.Size = page.MediaBox.Size
            textBox.TextAlignment = Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Top Or Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Left Or Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Right
            textBox.TextBrush = New Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Black)
            textBox.Text = "This document is Portfolio" & vbLf & "(Attachment Collection)" & vbLf & "To view Portfolio you should use PDF viewer compatible with PDF 1.7 ExtensionLevel 3."
            textBox.Draw(g)
        End Using

        ' create attachements
        document.CreateAttachments(True)

        ' set viewer settings
        document.Attachments.View = Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionViewMode.TileMode
        document.Attachments.SplitterBar = New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSplitterBar(document)
        document.Attachments.SplitterBar.Direction = Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSplitterBarDirection.None
        document.DocumentViewMode = Vintasoft.Imaging.Pdf.PdfDocumentViewMode.UseAttachments

        ' create field that defines sorting of files and folders in PDF viewer
        Dim sortFieldName As String = "Order"
        Dim sortField As New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchemaField(document, "Order (Sort)", Vintasoft.Imaging.Pdf.Tree.FileAttachments.AttachmentCollectionSchemaFieldDataType.Number)
        sortField.IsVisible = False
        document.Attachments.Schema = New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSchema(document)
        document.Attachments.Schema.Add(sortFieldName, sortField)

        ' create sort properties
        document.Attachments.Sort = New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentCollectionSort(document)
        document.Attachments.Sort.FieldNames = New String() {sortFieldName}

        ' use ZIP compression for files
        Dim filesCompression As Vintasoft.Imaging.Pdf.PdfCompression = Vintasoft.Imaging.Pdf.PdfCompression.Zip

        ' add files and folders to portfolio
        AddPathRecursively(document.Attachments.RootFolder, rootPath, False, filesCompression, True, sortFieldName)

        ' save changes in PDF document
        document.SaveChanges()
    End Using
End Sub

''' <summary>
''' Adds the path (all files and sub folders) to specified portfolio folder.
''' </summary>
''' <param name="folder">The portfolio folder.</param>
''' <param name="path">The path that should be added to the portfolio.</param>
''' <param name="addPathAsFolder">Determines that portfolio must contain folder with the path filename.</param>
''' <param name="compression">The compression that should be applied to files and folders.</param>
''' <param name="generateThumbnails">Determines that portfolio must contain thumbnails for files.</param>
''' <param name="sortFieldName">Name of the sort field.</param>
''' <returns>
''' Added folder.
''' </returns>
Private Shared Function AddPathRecursively(folder As Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder, path As String, addPathAsFolder As Boolean, compression As Vintasoft.Imaging.Pdf.PdfCompression, generateThumbnails As Boolean, sortFieldName As String) As Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder
    ' sort order
    Dim order As Integer = 0

    ' folder to which path must be added
    Dim currentFolder As Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder
    ' if portfolio must contain folder with the path filename
    If addPathAsFolder Then
        ' add new folder to portfolio folder and use it as current folder
        currentFolder = folder.AddFolder(System.IO.Path.GetFileName(path))
        currentFolder.CreationDate = System.DateTime.Now
    Else
        ' use root folder as current folder
        currentFolder = folder
        folder.ModificationDate = System.DateTime.Now
    End If

    ' get directories in the specified path
    Dim paths As String() = System.IO.Directory.GetDirectories(path, "*", System.IO.SearchOption.TopDirectoryOnly)
    ' for each directory
    For Each subPath As String In paths
        ' if directory is hidden
        If (System.IO.File.GetAttributes(subPath) And System.IO.FileAttributes.Hidden) <> 0 Then
            ' ignore directory
            Continue For
        End If

        Try
            ' add the directory (all files and sub folders) to current portfolio folder
            Dim addedSubFolder As Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentFolder = AddPathRecursively(currentFolder, subPath, True, compression, generateThumbnails, sortFieldName)

            ' if sorting must be used
            If sortFieldName IsNot Nothing Then
                ' add data field collection to the portfolio folder
                addedSubFolder.DataFields = New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentDataFieldCollection(folder.Document)
                ' add data field value which defines sorting
                addedSubFolder.DataFields.Add(sortFieldName, New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentDataField(folder.Document, order))
                ' increment sort order
                order += 1
            End If
        Catch ex As System.Exception
            System.Console.WriteLine(String.Format("{0}: {1}", currentFolder, ex.Message))
        End Try
    Next

    ' get files in the specified path
    Dim files As String() = System.IO.Directory.GetFiles(path, "*", System.IO.SearchOption.TopDirectoryOnly)
    ' if files are found
    If files.Length > 0 Then
        ' for each file
        For Each filename As String In files
            ' if file is hidden
            If (System.IO.File.GetAttributes(filename) And System.IO.FileAttributes.Hidden) <> 0 Then
                ' ignore file
                Continue For
            End If

            Try
                ' add file
                System.Console.WriteLine(String.Format("Add file {0}...", filename))
                Dim file As Vintasoft.Imaging.Pdf.Tree.PdfEmbeddedFileSpecification = currentFolder.AddFile(filename, compression)
                file.EmbeddedFile.CreationDate = System.DateTime.Now

                ' if thumbnail must be generated
                If generateThumbnails Then
                    ' generate file thumbnail
                    file.Thumbnail = CreateThumbnailResource(file.Document, filename)
                End If

                ' if sorting must be used
                If sortFieldName IsNot Nothing Then
                    ' add data field collection to the portfolio folder
                    file.DataFields = New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentDataFieldCollection(folder.Document)
                    ' add data field value which defines sorting
                    file.DataFields.Add(sortFieldName, New Vintasoft.Imaging.Pdf.Tree.FileAttachments.PdfAttachmentDataField(folder.Document, order))
                    ' increment sort order
                    order += 1

                End If
            Catch ex As System.Exception
                System.Console.WriteLine(String.Format("{0}: {1}", filename, ex.Message))
            End Try
        Next
        currentFolder.ModificationDate = System.DateTime.Now
    End If

    Return currentFolder
End Function

''' <summary>
''' Creates PDF image resource with thumbnail of specified file.
''' </summary>
''' <param name="document">The PDF document.</param>
''' <param name="filename">The name of file for which thumbnail must be generated.</param>
''' <returns>Thumbnail image resource.</returns>
Private Shared Function CreateThumbnailResource(document As Vintasoft.Imaging.Pdf.PdfDocument, filename As String) As Vintasoft.Imaging.Pdf.Tree.PdfImageResource
    ' get codec for file
    Dim codec As Vintasoft.Imaging.Codecs.Codec = Vintasoft.Imaging.Codecs.AvailableCodecs.GetCodecByExtension(System.IO.Path.GetExtension(filename))
    ' if code is available and codec has decoder
    If codec IsNot Nothing AndAlso codec.CanCreateDecoder Then
        Try
            ' get an image of first page of file
            Using image As New Vintasoft.Imaging.VintasoftImage(filename)
                ' get image thumbnail
                Using thumbnailImage As Vintasoft.Imaging.VintasoftImage = image.Thumbnail.GetThumbnailImage(100, 100)
                    Dim compressionSettings As New Vintasoft.Imaging.Pdf.PdfCompressionSettings()
                    compressionSettings.JpegQuality = 90
                    ' return PDF image-resource that contains image thumbnail
                    Return New Vintasoft.Imaging.Pdf.Tree.PdfImageResource(document, thumbnailImage, Vintasoft.Imaging.Pdf.PdfCompression.Jpeg, compressionSettings)
                End Using
            End Using
        Catch
        End Try
    End If
    Return Nothing
End Function




Демо приложение PdfEditorDemo/WpfPdfEditorDemo

Демо приложение PdfEditorDemo/WpfPdfEditorDemo содержит код, который позволяет просматривать, изменять, создавать коллекцию вложений в PDF документе.