Allow to have a metadata stream in the document information entry (#322)

This commit is contained in:
Wesley Moret
2021-05-01 11:44:56 -04:00
committed by GitHub
parent d7f7fb5fd0
commit 268947fb5e

View File

@@ -5,6 +5,7 @@
using Parts;
using Tokenization.Scanner;
using Tokens;
using UglyToad.PdfPig.Core;
/// <summary>
/// Parse the dictionary from a PDF file trailer.
@@ -21,19 +22,41 @@
return DocumentInformation.Default;
}
var infoParsed = DirectObjectFinder.Get<DictionaryToken>(trailer.Info.Value, pdfTokenScanner);
var token = DirectObjectFinder.Get<IToken>(trailer.Info.Value, pdfTokenScanner);
if (token is DictionaryToken infoParsed)
{
var title = GetEntryOrDefault(infoParsed, NameToken.Title);
var author = GetEntryOrDefault(infoParsed, NameToken.Author);
var subject = GetEntryOrDefault(infoParsed, NameToken.Subject);
var keywords = GetEntryOrDefault(infoParsed, NameToken.Keywords);
var creator = GetEntryOrDefault(infoParsed, NameToken.Creator);
var producer = GetEntryOrDefault(infoParsed, NameToken.Producer);
var creationDate = GetEntryOrDefault(infoParsed, NameToken.CreationDate);
var modifiedDate = GetEntryOrDefault(infoParsed, NameToken.ModDate);
var title = GetEntryOrDefault(infoParsed, NameToken.Title);
var author = GetEntryOrDefault(infoParsed, NameToken.Author);
var subject = GetEntryOrDefault(infoParsed, NameToken.Subject);
var keywords = GetEntryOrDefault(infoParsed, NameToken.Keywords);
var creator = GetEntryOrDefault(infoParsed, NameToken.Creator);
var producer = GetEntryOrDefault(infoParsed, NameToken.Producer);
var creationDate = GetEntryOrDefault(infoParsed, NameToken.CreationDate);
var modifiedDate = GetEntryOrDefault(infoParsed, NameToken.ModDate);
return new DocumentInformation(infoParsed, title, author, subject,
keywords, creator, producer, creationDate, modifiedDate);
}
else if (token is StreamToken streamToken)
{
var streamDictionary = streamToken.StreamDictionary;
if (!streamDictionary.TryGet(NameToken.Type, out NameToken typeNameToken) || typeNameToken != "Metadata")
{
throw new PdfDocumentFormatException($"Unknown document metadata type was found");
}
return new DocumentInformation(infoParsed, title, author, subject,
keywords, creator, producer, creationDate, modifiedDate);
if (!streamDictionary.TryGet(NameToken.Subtype, out NameToken subtypeToken) || subtypeToken != "XML")
{
throw new PdfDocumentFormatException($"Unknown document metadata subtype was found");
}
// We are not fully supporting XMP Stream so we left the user fully deserialize the stream
return DocumentInformation.Default;
}
else
{
throw new PdfDocumentFormatException($"Unknown document information token was found {token.GetType().Name}");
}
}
private static string GetEntryOrDefault(DictionaryToken infoDictionary, NameToken key)