Bugfixing of unite tool

This commit is contained in:
Jakub Melka 2020-11-01 15:00:36 +01:00
parent 5d5973772a
commit d17715b17e
4 changed files with 593 additions and 76 deletions

View File

@ -757,6 +757,47 @@ void PDFDocumentBuilder::setObject(PDFObjectReference reference, PDFObject objec
m_storage.setObject(reference, qMove(object));
}
void PDFDocumentBuilder::createDocumentParts(const std::vector<size_t>& parts)
{
PDFObjectReference root = createDocumentPartRoot();
std::vector<PDFObjectReference> pages = getPages();
PDFObjectFactory objectFactory;
objectFactory.beginDictionary();
objectFactory.beginDictionaryItem("DParts");
objectFactory.beginArray();
size_t start = 0;
for (std::size_t count : parts)
{
if (count == 0)
{
continue;
}
auto itStart = std::next(pages.cbegin(), start);
auto itEnd = std::next(itStart, count);
PDFObjectReference item = createDocumentPartItem(*itStart, *std::prev(itEnd), root);
for (auto it = itStart; it != itEnd; ++it)
{
setPageDocumentPart(*it, item);
}
objectFactory.beginArray();
objectFactory << item;
objectFactory.endArray();
start += count;
}
objectFactory.endArray();
objectFactory.endDictionaryItem();
objectFactory.endDictionary();
mergeTo(root, objectFactory.takeObject());
}
void PDFDocumentBuilder::appendTo(PDFObjectReference reference, PDFObject object)
{
m_storage.setObject(reference, PDFObjectManipulator::merge(m_storage.getObject(reference), qMove(object), PDFObjectManipulator::ConcatenateArrays));
@ -2850,6 +2891,68 @@ PDFObjectReference PDFDocumentBuilder::createCatalogPageTreeRoot()
}
PDFObjectReference PDFDocumentBuilder::createDocumentPartItem(PDFObjectReference startPage,
PDFObjectReference endPage,
PDFObjectReference parent)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("Type");
objectBuilder << WrapName("DPart");
objectBuilder.endDictionaryItem();
objectBuilder.beginDictionaryItem("Parent");
objectBuilder << parent;
objectBuilder.endDictionaryItem();
objectBuilder.beginDictionaryItem("Start");
objectBuilder << startPage;
objectBuilder.endDictionaryItem();
objectBuilder.beginDictionaryItem("End");
objectBuilder << endPage;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObjectReference documentPart = addObject(objectBuilder.takeObject());
return documentPart;
}
PDFObjectReference PDFDocumentBuilder::createDocumentPartRoot()
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("Type");
objectBuilder << WrapName("DPart");
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObjectReference rootNodeReference = addObject(objectBuilder.takeObject());
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("Type");
objectBuilder << WrapName("DPartRoot");
objectBuilder.endDictionaryItem();
objectBuilder.beginDictionaryItem("DPartRootNode");
objectBuilder << rootNodeReference;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObjectReference documentPartReference = addObject(objectBuilder.takeObject());
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("Parent");
objectBuilder << documentPartReference;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedRootNode = objectBuilder.takeObject();
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("DPartRoot");
objectBuilder << documentPartReference;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedCatalog = objectBuilder.takeObject();
mergeTo(rootNodeReference, updatedRootNode);
mergeTo(getCatalogReference(), updatedCatalog);
return rootNodeReference;
}
PDFObject PDFDocumentBuilder::createTrailerDictionary(PDFObjectReference catalog)
{
PDFObjectFactory objectBuilder;
@ -3123,6 +3226,34 @@ void PDFDocumentBuilder::setAnnotationTitle(PDFObjectReference annotation,
}
void PDFDocumentBuilder::setCatalogAcroForm(PDFObjectReference acroForm)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("AcroForm");
objectBuilder << acroForm;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedCatalog = objectBuilder.takeObject();
mergeTo(getCatalogReference(), updatedCatalog);
}
void PDFDocumentBuilder::setCatalogOptionalContentProperties(PDFObjectReference ocProperties)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("OCProperties");
objectBuilder << ocProperties;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedCatalog = objectBuilder.takeObject();
mergeTo(getCatalogReference(), updatedCatalog);
}
void PDFDocumentBuilder::setDocumentAuthor(QString author)
{
PDFObjectFactory objectBuilder;
@ -3288,6 +3419,21 @@ void PDFDocumentBuilder::setLanguage(QString language)
}
void PDFDocumentBuilder::setPageDocumentPart(PDFObjectReference page,
PDFObjectReference documentPart)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("DPart");
objectBuilder << documentPart;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedPage = objectBuilder.takeObject();
mergeTo(page, updatedPage);
}
void PDFDocumentBuilder::updateTrailerDictionary(PDFInteger objectCount)
{
PDFObjectFactory objectBuilder;
@ -3312,20 +3458,6 @@ void PDFDocumentBuilder::updateTrailerDictionary(PDFInteger objectCount)
}
void PDFDocumentBuilder::setCatalogOptionalContentProperties(PDFObjectReference ocProperties)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("OCProperties");
objectBuilder << ocProperties;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedCatalog = objectBuilder.takeObject();
mergeTo(getCatalogReference(), updatedCatalog);
}
/* END GENERATED CODE */
} // namespace pdf

View File

@ -348,6 +348,12 @@ public:
/// \param object Object to be set
void setObject(PDFObjectReference reference, PDFObject object);
/// Creates document parts from given pages. Pages must be flattened
/// by function \p flattenPageTree. \sa flattenPageTree. Each document
/// part has certain page size, sum of \p parts must equal to page count.
/// \param parts Parts (page count of each document part)
void createDocumentParts(const std::vector<size_t>& parts);
/* START GENERATED CODE */
/// Appends a new page after last page.
@ -863,6 +869,19 @@ public:
PDFObjectReference createCatalogPageTreeRoot();
/// Creates document part item (for certain range of pages).
/// \param startPage First page of page range.
/// \param endPage Last page of page range.
/// \param parent Parent node (must be a reference to parent node).
PDFObjectReference createDocumentPartItem(PDFObjectReference startPage,
PDFObjectReference endPage,
PDFObjectReference parent);
/// Creates document part root node (and setups catalog object).
PDFObjectReference createDocumentPartRoot();
/// This function is used to create a new trailer dictionary, when blank document is created. Do not
/// call this function manually.
/// \param catalog Reference to document catalog
@ -970,6 +989,16 @@ public:
QString title);
/// Set AcroForm to catalog.
/// \param acroForm Reference to AcroForm object.
void setCatalogAcroForm(PDFObjectReference acroForm);
/// Set optional content properties to catalog.
/// \param ocProperties Reference to catalog optional content properties.
void setCatalogOptionalContentProperties(PDFObjectReference ocProperties);
/// Set document author.
/// \param author Author
void setDocumentAuthor(QString author);
@ -1040,17 +1069,19 @@ public:
void setLanguage(QString language);
/// Sets document part to page.
/// \param page Page
/// \param documentPart Document part
void setPageDocumentPart(PDFObjectReference page,
PDFObjectReference documentPart);
/// This function is used to update trailer dictionary. Must be called each time the final document is
/// being built.
/// \param objectCount Number of objects (including empty ones)
void updateTrailerDictionary(PDFInteger objectCount);
/// Set optional content properties to catalog.
/// \param ocProperties Reference to catalog optional content properties.
void setCatalogOptionalContentProperties(PDFObjectReference ocProperties);
/* END GENERATED CODE */
private:

View File

@ -70,7 +70,10 @@ int PDFToolUnite::execute(const PDFToolOptions& options)
pdf::PDFDocumentBuilder documentBuilder;
documentBuilder.createDocument();
std::vector<size_t> documentPartPageCounts;
pdf::PDFObjectReference ocPropertiesMerged = documentBuilder.addObject(pdf::PDFObject());
pdf::PDFObjectReference formMerged = documentBuilder.addObject(pdf::PDFObject());
std::vector<pdf::PDFObjectReference> pages;
for (const QString& fileName : files)
@ -154,7 +157,10 @@ int PDFToolUnite::execute(const PDFToolOptions& options)
acroFormReference = references.back();
references.pop_back();
documentPartPageCounts.push_back(references.size());
documentBuilder.appendTo(ocPropertiesMerged, documentBuilder.getObjectByReference(ocPropertiesReference));
documentBuilder.appendTo(formMerged, documentBuilder.getObjectByReference(acroFormReference));
pages.insert(pages.end(), references.cbegin(), references.cend());
}
@ -164,6 +170,14 @@ int PDFToolUnite::execute(const PDFToolOptions& options)
documentBuilder.setCatalogOptionalContentProperties(ocPropertiesMerged);
}
if (!documentBuilder.getObjectByReference(formMerged).isNull())
{
documentBuilder.setCatalogAcroForm(formMerged);
}
// Correct page tree (invalid parents are present)
documentBuilder.flattenPageTree();
documentBuilder.createDocumentParts(documentPartPageCounts);
pdf::PDFDocument mergedDocument = documentBuilder.build();
// Optimize document - remove unused objects and shrink object storage
@ -182,6 +196,11 @@ int PDFToolUnite::execute(const PDFToolOptions& options)
{
finalBuilder.setObject(ocPropertiesReference, pdf::PDFObjectManipulator::removeDuplicitReferencesInArrays(finalBuilder.getObjectByReference(ocPropertiesReference)));
}
pdf::PDFObjectReference acroFormReference = loader.readReferenceFromDictionary(dictionary, "AcroForm");
if (acroFormReference.isValid())
{
finalBuilder.setObject(acroFormReference, pdf::PDFObjectManipulator::removeDuplicitReferencesInArrays(finalBuilder.getObjectByReference(acroFormReference)));
}
}
mergedDocument = finalBuilder.build();

View File

@ -5654,6 +5654,220 @@ return annotationObject;</property>
<property name="functionDescription">Creates page tree root for the catalog. This function is only called when new document is being created. Do not call this function manually.</property>
<property name="returnType">_PDFObjectReference</property>
</QObject>
<QObject class="codegen::GeneratedFunction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedParameter">
<property name="objectName"></property>
<property name="items"/>
<property name="parameterName">startPage</property>
<property name="parameterType">_PDFObjectReference</property>
<property name="parameterDescription">First page of page range.</property>
</QObject>
<QObject class="codegen::GeneratedParameter">
<property name="objectName"></property>
<property name="items"/>
<property name="parameterName">endPage</property>
<property name="parameterType">_PDFObjectReference</property>
<property name="parameterDescription">Last page of page range.</property>
</QObject>
<QObject class="codegen::GeneratedParameter">
<property name="objectName"></property>
<property name="items"/>
<property name="parameterName">parent</property>
<property name="parameterType">_PDFObjectReference</property>
<property name="parameterDescription">Parent node (must be a reference to parent node).</property>
</QObject>
</property>
<property name="actionType">Parameters</property>
<property name="variableName"></property>
<property name="variableType">_void</property>
<property name="code"></property>
</QObject>
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items"/>
<property name="dictionaryItemName">Type</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">WrapName("DPart")</property>
</QObject>
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items"/>
<property name="dictionaryItemName">Parent</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">parent</property>
</QObject>
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items"/>
<property name="dictionaryItemName">Start</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">startPage</property>
</QObject>
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items"/>
<property name="dictionaryItemName">End</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">endPage</property>
</QObject>
</property>
<property name="dictionaryItemName"></property>
<property name="objectType">Dictionary</property>
<property name="value"></property>
</QObject>
</property>
<property name="actionType">CreateObject</property>
<property name="variableName">documentPart</property>
<property name="variableType">_PDFObjectReference</property>
<property name="code"></property>
</QObject>
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items"/>
<property name="actionType">Code</property>
<property name="variableName"></property>
<property name="variableType">_void</property>
<property name="code">return documentPart;</property>
</QObject>
</property>
<property name="functionType">Structure</property>
<property name="functionName">createDocumentPartItem</property>
<property name="functionDescription">Creates document part item (for certain range of pages).</property>
<property name="returnType">_PDFObjectReference</property>
</QObject>
<QObject class="codegen::GeneratedFunction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items"/>
<property name="dictionaryItemName">Type</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">WrapName("DPart")</property>
</QObject>
</property>
<property name="dictionaryItemName"></property>
<property name="objectType">Dictionary</property>
<property name="value"></property>
</QObject>
</property>
<property name="actionType">CreateObject</property>
<property name="variableName">rootNodeReference</property>
<property name="variableType">_PDFObjectReference</property>
<property name="code"></property>
</QObject>
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items"/>
<property name="dictionaryItemName">Type</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">WrapName("DPartRoot")</property>
</QObject>
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items"/>
<property name="dictionaryItemName">DPartRootNode</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">rootNodeReference</property>
</QObject>
</property>
<property name="dictionaryItemName"></property>
<property name="objectType">Dictionary</property>
<property name="value"></property>
</QObject>
</property>
<property name="actionType">CreateObject</property>
<property name="variableName">documentPartReference</property>
<property name="variableType">_PDFObjectReference</property>
<property name="code"></property>
</QObject>
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items"/>
<property name="dictionaryItemName">Parent</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">documentPartReference</property>
</QObject>
</property>
<property name="dictionaryItemName"></property>
<property name="objectType">Dictionary</property>
<property name="value"></property>
</QObject>
</property>
<property name="actionType">CreateObject</property>
<property name="variableName">updatedRootNode</property>
<property name="variableType">_PDFObject</property>
<property name="code"></property>
</QObject>
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items"/>
<property name="dictionaryItemName">DPartRoot</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">documentPartReference</property>
</QObject>
</property>
<property name="dictionaryItemName"></property>
<property name="objectType">Dictionary</property>
<property name="value"></property>
</QObject>
</property>
<property name="actionType">CreateObject</property>
<property name="variableName">updatedCatalog</property>
<property name="variableType">_PDFObject</property>
<property name="code"></property>
</QObject>
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items"/>
<property name="actionType">Code</property>
<property name="variableName"></property>
<property name="variableType">_void</property>
<property name="code">mergeTo(rootNodeReference, updatedRootNode);
mergeTo(getCatalogReference(), updatedCatalog);
return rootNodeReference;</property>
</QObject>
</property>
<property name="functionType">Structure</property>
<property name="functionName">createDocumentPartRoot</property>
<property name="functionDescription">Creates document part root node (and setups catalog object).</property>
<property name="returnType">_PDFObjectReference</property>
</QObject>
<QObject class="codegen::GeneratedFunction">
<property name="objectName"></property>
<property name="items">
@ -6697,6 +6911,120 @@ return annotationObject;</property>
<property name="functionDescription">Sets annotation title.</property>
<property name="returnType">_void</property>
</QObject>
<QObject class="codegen::GeneratedFunction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedParameter">
<property name="objectName"></property>
<property name="items"/>
<property name="parameterName">acroForm</property>
<property name="parameterType">_PDFObjectReference</property>
<property name="parameterDescription">Reference to AcroForm object.</property>
</QObject>
</property>
<property name="actionType">Parameters</property>
<property name="variableName"></property>
<property name="variableType">_void</property>
<property name="code"></property>
</QObject>
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items"/>
<property name="dictionaryItemName">AcroForm</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">acroForm</property>
</QObject>
</property>
<property name="dictionaryItemName"></property>
<property name="objectType">Dictionary</property>
<property name="value"></property>
</QObject>
</property>
<property name="actionType">CreateObject</property>
<property name="variableName">updatedCatalog</property>
<property name="variableType">_PDFObject</property>
<property name="code"></property>
</QObject>
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items"/>
<property name="actionType">Code</property>
<property name="variableName"></property>
<property name="variableType">_void</property>
<property name="code">mergeTo(getCatalogReference(), updatedCatalog);</property>
</QObject>
</property>
<property name="functionType">Structure</property>
<property name="functionName">setCatalogAcroForm</property>
<property name="functionDescription">Set AcroForm to catalog.</property>
<property name="returnType">_void</property>
</QObject>
<QObject class="codegen::GeneratedFunction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedParameter">
<property name="objectName"></property>
<property name="items"/>
<property name="parameterName">ocProperties</property>
<property name="parameterType">_PDFObjectReference</property>
<property name="parameterDescription">Reference to catalog optional content properties.</property>
</QObject>
</property>
<property name="actionType">Parameters</property>
<property name="variableName"></property>
<property name="variableType">_void</property>
<property name="code"></property>
</QObject>
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items"/>
<property name="dictionaryItemName">OCProperties</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">ocProperties</property>
</QObject>
</property>
<property name="dictionaryItemName"></property>
<property name="objectType">Dictionary</property>
<property name="value"></property>
</QObject>
</property>
<property name="actionType">CreateObject</property>
<property name="variableName">updatedCatalog</property>
<property name="variableType">_PDFObject</property>
<property name="code"></property>
</QObject>
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items"/>
<property name="actionType">Code</property>
<property name="variableName"></property>
<property name="variableType">_void</property>
<property name="code">mergeTo(getCatalogReference(), updatedCatalog);</property>
</QObject>
</property>
<property name="functionType">Structure</property>
<property name="functionName">setCatalogOptionalContentProperties</property>
<property name="functionDescription">Set optional content properties to catalog.</property>
<property name="returnType">_void</property>
</QObject>
<QObject class="codegen::GeneratedFunction">
<property name="objectName"></property>
<property name="items">
@ -7378,6 +7706,70 @@ return annotationObject;</property>
<property name="functionDescription">Set document language.</property>
<property name="returnType">_void</property>
</QObject>
<QObject class="codegen::GeneratedFunction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedParameter">
<property name="objectName"></property>
<property name="items"/>
<property name="parameterName">page</property>
<property name="parameterType">_PDFObjectReference</property>
<property name="parameterDescription">Page</property>
</QObject>
<QObject class="codegen::GeneratedParameter">
<property name="objectName"></property>
<property name="items"/>
<property name="parameterName">documentPart</property>
<property name="parameterType">_PDFObjectReference</property>
<property name="parameterDescription">Document part</property>
</QObject>
</property>
<property name="actionType">Parameters</property>
<property name="variableName"></property>
<property name="variableType">_void</property>
<property name="code"></property>
</QObject>
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items"/>
<property name="dictionaryItemName">DPart</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">documentPart</property>
</QObject>
</property>
<property name="dictionaryItemName"></property>
<property name="objectType">Dictionary</property>
<property name="value"></property>
</QObject>
</property>
<property name="actionType">CreateObject</property>
<property name="variableName">updatedPage</property>
<property name="variableType">_PDFObject</property>
<property name="code"></property>
</QObject>
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items"/>
<property name="actionType">Code</property>
<property name="variableName"></property>
<property name="variableType">_void</property>
<property name="code">mergeTo(page, updatedPage);</property>
</QObject>
</property>
<property name="functionType">Structure</property>
<property name="functionName">setPageDocumentPart</property>
<property name="functionDescription">Sets document part to page.</property>
<property name="returnType">_void</property>
</QObject>
<QObject class="codegen::GeneratedFunction">
<property name="objectName"></property>
<property name="items">
@ -7467,62 +7859,5 @@ updateDocumentInfo(qMove(updatedInfoDictionary));</property>
<property name="functionDescription">This function is used to update trailer dictionary. Must be called each time the final document is being built.</property>
<property name="returnType">_void</property>
</QObject>
<QObject class="codegen::GeneratedFunction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedParameter">
<property name="objectName"></property>
<property name="items"/>
<property name="parameterName">ocProperties</property>
<property name="parameterType">_PDFObjectReference</property>
<property name="parameterDescription">Reference to catalog optional content properties.</property>
</QObject>
</property>
<property name="actionType">Parameters</property>
<property name="variableName"></property>
<property name="variableType">_void</property>
<property name="code"></property>
</QObject>
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items">
<QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property>
<property name="items"/>
<property name="dictionaryItemName">OCProperties</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">ocProperties</property>
</QObject>
</property>
<property name="dictionaryItemName"></property>
<property name="objectType">Dictionary</property>
<property name="value"></property>
</QObject>
</property>
<property name="actionType">CreateObject</property>
<property name="variableName">updatedCatalog</property>
<property name="variableType">_PDFObject</property>
<property name="code"></property>
</QObject>
<QObject class="codegen::GeneratedAction">
<property name="objectName"></property>
<property name="items"/>
<property name="actionType">Code</property>
<property name="variableName"></property>
<property name="variableType">_void</property>
<property name="code">mergeTo(getCatalogReference(), updatedCatalog);</property>
</QObject>
</property>
<property name="functionType">Structure</property>
<property name="functionName">setCatalogOptionalContentProperties</property>
<property name="functionDescription">Set optional content properties to catalog.</property>
<property name="returnType">_void</property>
</QObject>
</property>
</root>