PDF: PDF Portfolio (Attachments)
In This Topic
Starting from PDF 1.7 the PDF documents can specify how a viewer application's user interface presents collections of file attachments (Portfolio).
Such presentation is called a portable collection.
The intent of portable collections is to present, sort, and search collections of related documents, such as email archives, photo collections, and etc.
If attachment is present in a PDF document, the user interface presents the document as an attachment collection.
Starting from PDF 1.7 Extension Level 3, an attachment collection can contain the folders for the purpose of organizing files
into a hierarchical structure.
VintaSoft PDF .NET Plug-in allows to:
- Create, change, delete a portfolio of PDF document.
- Obtain full information about a portfolio of PDF document (folder and files structure, portfolio, PDF viewer settings).
- Configure the visual appearance of PDF viewer application while displaying the portfolio.
- Define the schema of data while displaying portfolio in detailed mode.
Porfolio management using VintaSoft PDF .NET Plug-in
The new empty attachment collection (portfolio) of PDF document can be created using
PdfDocument.CreateAttachments method.
The current attachment collection (portfolio) of PDF document and related data structures can be removed using
PdfDocument.RemoveAttachments method.
The attachments collection (portfolio) can be accessed using
PdfDocument.Attachments property.
Here is a list of the main properties and methods used for management of attachment collection:
-
PdfAttachmentCollection.CreateFolder, PdfAttachmentCollection.DeleteFolder, PdfAttachmentCollection.RemoveFolder, PdfAttachmentCollection.MoveFolder, PdfAttachmentCollection.GetSubFolderFullNames, PdfAttachmentCollection.GetFolderFullNames - folder manipulation using full folder name
-
PdfAttachmentCollection.AddFile, PdfAttachmentCollection.DeleteFile, PdfAttachmentCollection.GetFile, PdfAttachmentCollection.GetFiles, PdfAttachmentCollection.MoveFile - file manipulation using full file name
PdfAttachmentCollection.RootFolder - returns the root folder of attachment collection (PdfAttachmentFolder object instance)
PdfAttachmentFolder.Folders, PdfAttachmentFolder.AddFolder, PdfAttachmentFolder.RemoveFolder, PdfAttachmentFolder.DeleteFolder, PdfAttachmentFolder.MoveFolder, PdfAttachmentFolder.GetFolder, PdfAttachmentFolder.GetFolderNames - manipulation of sub folders located in a certain folder
-
PdfAttachmentFolder.Files, PdfAttachmentFolder.AddFile, PdfAttachmentFolder.DeleteFile, PdfAttachmentFolder.GetFile, PdfAttachmentFolder.GetFilenames, PdfAttachmentFolder.RenameFile - manipulation of files located in a certain folder
Visual appearance settings of PDF viewer application related with portfolio
For the visual appearance of PDF viewer application are responsible the following properties:
Portfolio Schema
Schema of attachement collection (
PdfAttachmentCollection.Schema) defines data columns in the DetailsMode view mode.
The schema is represented by
PdfAttachmentCollectionSchema class and is a dictionary, which puts each name of schema field in correspondence with an object of type
PdfAttachmentCollectionSchemaField.
Object of
PdfAttachmentCollectionSchemaField class describes type and parameters of data column in DetailsMode view mode:
Data, displayed in the column, is defined by
PdfAttachmentCollectionSchemaField.DataType property:
The data of field types
AttachmentCollectionSchemaFieldDataType.String,
AttachmentCollectionSchemaFieldDataType.Date and
AttachmentCollectionSchemaFieldDataType.Number is stored in the data field dictionary (
PdfAttachmentDataFieldCollection) of an appropriate folder or file:
The key in the data fields dictionary is the name of the appropriate field of data schema (i.e. the key is in
PdfAttachmentCollection.Schema dictionary).
The data of data field can be obtained using the following methods:
The data of data field can be specified using the following methods:
Here is an example that shows how to create the portfolio schema:
/// <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
Examples
Here is an example that shows how to get information about attachments of PDF document:
/// <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
Here is an example that shows how to create new Portfolio:
/// <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 application
The demo application PdfEditorDemo/WpfPdfEditorDemo includes code, which allows to view, change, create an attachment collection of PDF document.