Set page boxes

This commit is contained in:
Jakub Melka 2020-11-10 19:31:33 +01:00
parent 8167065be5
commit 1382ead109
6 changed files with 484 additions and 27 deletions

View File

@ -23,4 +23,5 @@ int main(int argc, char *argv[])
{ {
QApplication a(argc, argv); QApplication a(argc, argv);
PDFExamplesGenerator::generateAnnotationsExample(); PDFExamplesGenerator::generateAnnotationsExample();
PDFExamplesGenerator::generatePageBoxesExample();
} }

View File

@ -301,3 +301,24 @@ void PDFExamplesGenerator::generateAnnotationsExample()
pdf::PDFDocumentWriter writer(nullptr); pdf::PDFDocumentWriter writer(nullptr);
writer.write("Ex_Annotations.pdf", &document, false); writer.write("Ex_Annotations.pdf", &document, false);
} }
void PDFExamplesGenerator::generatePageBoxesExample()
{
pdf::PDFDocumentBuilder builder;
builder.setDocumentTitle("Test document - Page Boxes");
builder.setDocumentAuthor("Jakub Melka");
builder.setDocumentCreator(QCoreApplication::applicationName());
builder.setDocumentSubject("Testing page boxes");
builder.setLanguage(QLocale::system());
pdf::PDFObjectReference pageReference = builder.appendPage(QRectF(0, 0, 200, 200));
builder.setPageMediaBox(pageReference, QRectF(0, 0, 400, 400));
builder.setPageCropBox(pageReference, QRectF(10, 10, 380, 380));
builder.setPageBleedBox(pageReference, QRectF(20, 20, 360, 360));
builder.setPageTrimBox(pageReference, QRectF(30, 30, 340, 340));
// Write result to a file
pdf::PDFDocument document = builder.build();
pdf::PDFDocumentWriter writer(nullptr);
writer.write("Ex_PageBoxes.pdf", &document, false);
}

View File

@ -24,6 +24,7 @@ public:
explicit PDFExamplesGenerator() = delete; explicit PDFExamplesGenerator() = delete;
static void generateAnnotationsExample(); static void generateAnnotationsExample();
static void generatePageBoxesExample();
}; };
#endif // PDFEXAMPLESGENERATOR_H #endif // PDFEXAMPLESGENERATOR_H

View File

@ -3315,6 +3315,20 @@ void PDFDocumentBuilder::setCatalogAcroForm(PDFObjectReference acroForm)
} }
void PDFDocumentBuilder::setCatalogNames(PDFObjectReference names)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("Names");
objectBuilder << ((names.isValid()) ? PDFObject::createReference(names) : PDFObject());
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedCatalog = objectBuilder.takeObject();
mergeTo(getCatalogReference(), updatedCatalog);
}
void PDFDocumentBuilder::setCatalogOptionalContentProperties(PDFObjectReference ocProperties) void PDFDocumentBuilder::setCatalogOptionalContentProperties(PDFObjectReference ocProperties)
{ {
PDFObjectFactory objectBuilder; PDFObjectFactory objectBuilder;
@ -3494,6 +3508,51 @@ void PDFDocumentBuilder::setLanguage(QString language)
} }
void PDFDocumentBuilder::setPageArtBox(PDFObjectReference page,
QRectF box)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("ArtBox");
objectBuilder << box;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedPageObject = objectBuilder.takeObject();
mergeTo(page, updatedPageObject);
}
void PDFDocumentBuilder::setPageBleedBox(PDFObjectReference page,
QRectF box)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("BleedBox");
objectBuilder << box;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedPageObject = objectBuilder.takeObject();
mergeTo(page, updatedPageObject);
}
void PDFDocumentBuilder::setPageCropBox(PDFObjectReference page,
QRectF box)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("CropBox");
objectBuilder << box;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedPageObject = objectBuilder.takeObject();
mergeTo(page, updatedPageObject);
}
void PDFDocumentBuilder::setPageDocumentPart(PDFObjectReference page, void PDFDocumentBuilder::setPageDocumentPart(PDFObjectReference page,
PDFObjectReference documentPart) PDFObjectReference documentPart)
{ {
@ -3509,6 +3568,36 @@ void PDFDocumentBuilder::setPageDocumentPart(PDFObjectReference page,
} }
void PDFDocumentBuilder::setPageMediaBox(PDFObjectReference page,
QRectF box)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("MediaBox");
objectBuilder << box;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedPageObject = objectBuilder.takeObject();
mergeTo(page, updatedPageObject);
}
void PDFDocumentBuilder::setPageTrimBox(PDFObjectReference page,
QRectF box)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("TrimBox");
objectBuilder << box;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedPageObject = objectBuilder.takeObject();
mergeTo(page, updatedPageObject);
}
void PDFDocumentBuilder::updateTrailerDictionary(PDFInteger objectCount) void PDFDocumentBuilder::updateTrailerDictionary(PDFInteger objectCount)
{ {
PDFObjectFactory objectBuilder; PDFObjectFactory objectBuilder;
@ -3533,20 +3622,6 @@ void PDFDocumentBuilder::updateTrailerDictionary(PDFInteger objectCount)
} }
void PDFDocumentBuilder::setCatalogNames(PDFObjectReference names)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("Names");
objectBuilder << ((names.isValid()) ? PDFObject::createReference(names) : PDFObject());
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject updatedCatalog = objectBuilder.takeObject();
mergeTo(getCatalogReference(), updatedCatalog);
}
/* END GENERATED CODE */ /* END GENERATED CODE */
} // namespace pdf } // namespace pdf

View File

@ -1000,6 +1000,11 @@ public:
void setCatalogAcroForm(PDFObjectReference acroForm); void setCatalogAcroForm(PDFObjectReference acroForm);
/// Set reference to 'Names' dictionary to catalog.
/// \param names Reference to Names dictionary.
void setCatalogNames(PDFObjectReference names);
/// Set optional content properties to catalog. /// Set optional content properties to catalog.
/// \param ocProperties Reference to catalog optional content properties. /// \param ocProperties Reference to catalog optional content properties.
void setCatalogOptionalContentProperties(PDFObjectReference ocProperties); void setCatalogOptionalContentProperties(PDFObjectReference ocProperties);
@ -1075,6 +1080,30 @@ public:
void setLanguage(QString language); void setLanguage(QString language);
/// Sets art box to the page. Art box defines page's meaningful content.
/// \param page Page
/// \param box Box
void setPageArtBox(PDFObjectReference page,
QRectF box);
/// Sets bleed box to the page. Bleed box is, basically, a clipping box for output in a production
/// environment. Default value is the page's crop box.
/// \param page Page
/// \param box Box
void setPageBleedBox(PDFObjectReference page,
QRectF box);
/// Sets crop box to the page. Crop box defines clipping region of the page. Page contents are clipped
/// to this region, graphics outside of clipping box will not be printed. Default value is same, as media
/// box.
/// \param page Page
/// \param box Box
void setPageCropBox(PDFObjectReference page,
QRectF box);
/// Sets document part to page. /// Sets document part to page.
/// \param page Page /// \param page Page
/// \param documentPart Document part /// \param documentPart Document part
@ -1082,17 +1111,27 @@ public:
PDFObjectReference documentPart); PDFObjectReference documentPart);
/// Sets media box to the page. The media box defines size of physical medium, onto which the page
/// is to be printed.
/// \param page Page
/// \param box Box
void setPageMediaBox(PDFObjectReference page,
QRectF box);
/// Sets trim box to the page. Trim box is physical region, of the printed page after trimming.
/// \param page Page
/// \param box Box
void setPageTrimBox(PDFObjectReference page,
QRectF box);
/// This function is used to update trailer dictionary. Must be called each time the final document is /// This function is used to update trailer dictionary. Must be called each time the final document is
/// being built. /// being built.
/// \param objectCount Number of objects (including empty ones) /// \param objectCount Number of objects (including empty ones)
void updateTrailerDictionary(PDFInteger objectCount); void updateTrailerDictionary(PDFInteger objectCount);
/// Set reference to 'Names' dictionary to catalog.
/// \param names Reference to Names dictionary.
void setCatalogNames(PDFObjectReference names);
/* END GENERATED CODE */ /* END GENERATED CODE */
private: private:

View File

@ -6968,6 +6968,63 @@ return rootNodeReference;</property>
<property name="functionDescription">Set AcroForm to catalog.</property> <property name="functionDescription">Set AcroForm to catalog.</property>
<property name="returnType">_void</property> <property name="returnType">_void</property>
</QObject> </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">names</property>
<property name="parameterType">_PDFObjectReference</property>
<property name="parameterDescription">Reference to Names dictionary.</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">Names</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">((names.isValid()) ? PDFObject::createReference(names) : PDFObject())</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">setCatalogNames</property>
<property name="functionDescription">Set reference to 'Names' dictionary to catalog.</property>
<property name="returnType">_void</property>
</QObject>
<QObject class="codegen::GeneratedFunction"> <QObject class="codegen::GeneratedFunction">
<property name="objectName"></property> <property name="objectName"></property>
<property name="items"> <property name="items">
@ -7770,6 +7827,70 @@ return rootNodeReference;</property>
<property name="functionDescription">Sets document part to page.</property> <property name="functionDescription">Sets document part to page.</property>
<property name="returnType">_void</property> <property name="returnType">_void</property>
</QObject> </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">box</property>
<property name="parameterType">_QRectF</property>
<property name="parameterDescription">Box</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">MediaBox</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">box</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">updatedPageObject</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, updatedPageObject);</property>
</QObject>
</property>
<property name="functionType">Structure</property>
<property name="functionName">setPageMediaBox</property>
<property name="functionDescription">Sets media box to the page. The media box defines size of physical medium, onto which the page is to be printed. </property>
<property name="returnType">_void</property>
</QObject>
<QObject class="codegen::GeneratedFunction"> <QObject class="codegen::GeneratedFunction">
<property name="objectName"></property> <property name="objectName"></property>
<property name="items"> <property name="items">
@ -7868,9 +7989,16 @@ updateDocumentInfo(qMove(updatedInfoDictionary));</property>
<QObject class="codegen::GeneratedParameter"> <QObject class="codegen::GeneratedParameter">
<property name="objectName"></property> <property name="objectName"></property>
<property name="items"/> <property name="items"/>
<property name="parameterName">names</property> <property name="parameterName">page</property>
<property name="parameterType">_PDFObjectReference</property> <property name="parameterType">_PDFObjectReference</property>
<property name="parameterDescription">Reference to Names dictionary.</property> <property name="parameterDescription">Page</property>
</QObject>
<QObject class="codegen::GeneratedParameter">
<property name="objectName"></property>
<property name="items"/>
<property name="parameterName">box</property>
<property name="parameterType">_QRectF</property>
<property name="parameterDescription">Box</property>
</QObject> </QObject>
</property> </property>
<property name="actionType">Parameters</property> <property name="actionType">Parameters</property>
@ -7887,9 +8015,9 @@ updateDocumentInfo(qMove(updatedInfoDictionary));</property>
<QObject class="codegen::GeneratedPDFObject"> <QObject class="codegen::GeneratedPDFObject">
<property name="objectName"></property> <property name="objectName"></property>
<property name="items"/> <property name="items"/>
<property name="dictionaryItemName">Names</property> <property name="dictionaryItemName">CropBox</property>
<property name="objectType">DictionaryItemSimple</property> <property name="objectType">DictionaryItemSimple</property>
<property name="value">((names.isValid()) ? PDFObject::createReference(names) : PDFObject())</property> <property name="value">box</property>
</QObject> </QObject>
</property> </property>
<property name="dictionaryItemName"></property> <property name="dictionaryItemName"></property>
@ -7898,7 +8026,7 @@ updateDocumentInfo(qMove(updatedInfoDictionary));</property>
</QObject> </QObject>
</property> </property>
<property name="actionType">CreateObject</property> <property name="actionType">CreateObject</property>
<property name="variableName">updatedCatalog</property> <property name="variableName">updatedPageObject</property>
<property name="variableType">_PDFObject</property> <property name="variableType">_PDFObject</property>
<property name="code"></property> <property name="code"></property>
</QObject> </QObject>
@ -7908,12 +8036,204 @@ updateDocumentInfo(qMove(updatedInfoDictionary));</property>
<property name="actionType">Code</property> <property name="actionType">Code</property>
<property name="variableName"></property> <property name="variableName"></property>
<property name="variableType">_void</property> <property name="variableType">_void</property>
<property name="code">mergeTo(getCatalogReference(), updatedCatalog);</property> <property name="code">mergeTo(page, updatedPageObject);</property>
</QObject> </QObject>
</property> </property>
<property name="functionType">Structure</property> <property name="functionType">Structure</property>
<property name="functionName">setCatalogNames</property> <property name="functionName">setPageCropBox</property>
<property name="functionDescription">Set reference to 'Names' dictionary to catalog.</property> <property name="functionDescription">Sets crop box to the page. Crop box defines clipping region of the page. Page contents are clipped to this region, graphics outside of clipping box will not be printed. Default value is same, as media box.</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">box</property>
<property name="parameterType">_QRectF</property>
<property name="parameterDescription">Box</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">BleedBox</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">box</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">updatedPageObject</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, updatedPageObject);</property>
</QObject>
</property>
<property name="functionType">Structure</property>
<property name="functionName">setPageBleedBox</property>
<property name="functionDescription">Sets bleed box to the page. Bleed box is, basically, a clipping box for output in a production environment. Default value is the page's crop box.</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">box</property>
<property name="parameterType">_QRectF</property>
<property name="parameterDescription">Box</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">TrimBox</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">box</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">updatedPageObject</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, updatedPageObject);</property>
</QObject>
</property>
<property name="functionType">Structure</property>
<property name="functionName">setPageTrimBox</property>
<property name="functionDescription">Sets trim box to the page. Trim box is physical region, of the printed page after trimming.</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">box</property>
<property name="parameterType">_QRectF</property>
<property name="parameterDescription">Box</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">ArtBox</property>
<property name="objectType">DictionaryItemSimple</property>
<property name="value">box</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">updatedPageObject</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, updatedPageObject);</property>
</QObject>
</property>
<property name="functionType">Structure</property>
<property name="functionName">setPageArtBox</property>
<property name="functionDescription">Sets art box to the page. Art box defines page's meaningful content.</property>
<property name="returnType">_void</property> <property name="returnType">_void</property>
</QObject> </QObject>
</property> </property>