- How to add page numbers to your PDF
- Add text field to PDF
- Append multiple PDF documents
- Bulleted list from XML and XSL
- Merge PDF
- Calculate the height of a paragraph in PDF
- Multipage TIFF to PDF
- Convert TXT to PDF
- Convert XHTML to PDF
- Create PDF in C# - Tall Components - Check out our PDF code samples
- Text formatting
- Generate PDF form from XML
- Generate PDF with local images from XML with Xamarin.iOS
- XhtmlParagraph and TrueType fonts
- Add footer with left and right aligned text on same line
- Read and write meta data from PDF
- Stitch PDF documents
- Use multiple licenses
- What is the resulting fontsize in PDF rich text used in SimpleXhtmlShape
Read and write meta data from PDF
This article shows a sample for reading and writing meta data from PDF using C#.
What is meta data
Metadata is used for data about the document like author, creation date …. These are the PDF standard metadata. PDF also supports custom metadata. Custom metadata could hold any kind of information. For example tracking info for a business process that involves the document. Metadata consists of name-value pairs under a metadata schema. The values are of type string. This can be any kind of string, but when it is structured data, it is very common to use XML for it, where the metadata schema holds an url to the schema that describes the structure of the XML.
More info about metadata can be found:
How to read meta data
The structure for meta data in the PDF document is as follows:
- A Document has an attribute MetadataSchemas of type MetadataSchemaCollection.
- The MetadataSchemaCollection is a collection of type MetadataSchema.
- A MetadataSchema has attributes Prefix, NamespaceUri and Names.
- The MetadataSchema holds a collection of name – value pairs.
- The Names attribute contains all the names of name – value pairs that are associated to the MetadataSchema.
- With a name a corresponding value can be retrieved from the MetadataSchema.
C# code sample that reads all the meta data from a PDF document
using (FileStream inputStream = new FileStream(@"..\..\input.pdf", FileMode.Open, FileAccess.Read))
{
Document document = new Document(inputStream);
MetadataSchemaCollection metadataSchemas = document.MetadataSchemas;
Console.WriteLine($"MetadataSchemas.Count = {metadataSchemas.Count}");
foreach (MetadataSchema metadataSchema in metadataSchemas)
{
Console.WriteLine($"MetadataSchema: {metadataSchema.Prefix} --> {metadataSchema.NamespaceUri}");
foreach (string name in metadataSchema.Names)
{
string value = "unknown";
MetadataString metadataString = metadataSchema[name] as MetadataString;
if (null != metadataString)
{
value = metadataString.Value;
}
Console.WriteLine($" - name = '{name}' value = '{value}'");
}
}
}
How to write meta data
Now that you know how to read meta data from a PDF, this section will provide a code sample that shows how to write meta data to PDF
Sample custom metadata XML from DocuSign
<?xml version="1.0" encoding="UTF-8"?>
<DocuSignDocumentTemplate xmlns="http://www.docusign.net/API/3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" canAddTabs="true">
<Header>
<Name>template</Name>
<Version>1.0</Version>
...
</Header>
<Document>
<Name>ADV_AGRMT_DOC_EX1</Name>
<Source requireInstanceDoc="true">C:\Documents and Settings\a331760\Desktop\ADV_AGRMT_DOC_EX1.pdf</Source>
<NumPages>1</NumPages>
<Size>21050</Size>
</Document>
<Recipients>
<Recipient>
...
<RoleName>ESIG_PRIMARY_OWNER</RoleName>
<RoutingOrder>1</RoutingOrder>
<Type>Signer</Type>
<RequireAccessCode>false</RequireAccessCode>
...
<Tabs>
<Tab>
<PageNumber>1</PageNumber>
<XPosition>88</XPosition>
<YPosition>492</YPosition>
<Type>SignHere</Type>
</Tab>
</Tabs>
</Recipient>
...
</Recipients>
</DocuSignDocumentTemplate>
C# sample that writes meta data to a PDF document
Document document = new Document();
document.Pages.Add(new Page(PageSize.A4));
MetadataSchema metadataSchema = document.MetadataSchemas.Add("tc", @"http://test.tallcomponents.com/testschema/");
metadataSchema.Add("Songwriter", "Johansson");
metadataSchema.Add("Songs", "<songs><song>Close to my soul</song><song>Winter is over</song></songs>");
using (FileStream outputStream = new FileStream(@"output.pdf", FileMode.Create, FileAccess.Write))
{
document.Write(outputStream);
}