From 1382ead1090e07805b6f9c8493d94eb330c68e2b Mon Sep 17 00:00:00 2001 From: Jakub Melka Date: Tue, 10 Nov 2020 19:31:33 +0100 Subject: [PATCH] Set page boxes --- PdfExampleGenerator/main.cpp | 1 + PdfExampleGenerator/pdfexamplesgenerator.cpp | 21 ++ PdfExampleGenerator/pdfexamplesgenerator.h | 1 + PdfForQtLib/sources/pdfdocumentbuilder.cpp | 103 +++++- PdfForQtLib/sources/pdfdocumentbuilder.h | 49 ++- generated_code_definition.xml | 336 ++++++++++++++++++- 6 files changed, 484 insertions(+), 27 deletions(-) diff --git a/PdfExampleGenerator/main.cpp b/PdfExampleGenerator/main.cpp index d227e93..88776de 100644 --- a/PdfExampleGenerator/main.cpp +++ b/PdfExampleGenerator/main.cpp @@ -23,4 +23,5 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); PDFExamplesGenerator::generateAnnotationsExample(); + PDFExamplesGenerator::generatePageBoxesExample(); } diff --git a/PdfExampleGenerator/pdfexamplesgenerator.cpp b/PdfExampleGenerator/pdfexamplesgenerator.cpp index 9d24946..9c36024 100644 --- a/PdfExampleGenerator/pdfexamplesgenerator.cpp +++ b/PdfExampleGenerator/pdfexamplesgenerator.cpp @@ -301,3 +301,24 @@ void PDFExamplesGenerator::generateAnnotationsExample() pdf::PDFDocumentWriter writer(nullptr); 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); +} diff --git a/PdfExampleGenerator/pdfexamplesgenerator.h b/PdfExampleGenerator/pdfexamplesgenerator.h index ebbeea0..4ee6382 100644 --- a/PdfExampleGenerator/pdfexamplesgenerator.h +++ b/PdfExampleGenerator/pdfexamplesgenerator.h @@ -24,6 +24,7 @@ public: explicit PDFExamplesGenerator() = delete; static void generateAnnotationsExample(); + static void generatePageBoxesExample(); }; #endif // PDFEXAMPLESGENERATOR_H diff --git a/PdfForQtLib/sources/pdfdocumentbuilder.cpp b/PdfForQtLib/sources/pdfdocumentbuilder.cpp index 7f099b6..f09df3b 100644 --- a/PdfForQtLib/sources/pdfdocumentbuilder.cpp +++ b/PdfForQtLib/sources/pdfdocumentbuilder.cpp @@ -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) { 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, 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) { 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 */ } // namespace pdf diff --git a/PdfForQtLib/sources/pdfdocumentbuilder.h b/PdfForQtLib/sources/pdfdocumentbuilder.h index dd80d59..856c385 100644 --- a/PdfForQtLib/sources/pdfdocumentbuilder.h +++ b/PdfForQtLib/sources/pdfdocumentbuilder.h @@ -1000,6 +1000,11 @@ public: 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. /// \param ocProperties Reference to catalog optional content properties. void setCatalogOptionalContentProperties(PDFObjectReference ocProperties); @@ -1075,6 +1080,30 @@ public: 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. /// \param page Page /// \param documentPart Document part @@ -1082,17 +1111,27 @@ public: 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 /// being built. /// \param objectCount Number of objects (including empty ones) void updateTrailerDictionary(PDFInteger objectCount); - /// Set reference to 'Names' dictionary to catalog. - /// \param names Reference to Names dictionary. - void setCatalogNames(PDFObjectReference names); - - /* END GENERATED CODE */ private: diff --git a/generated_code_definition.xml b/generated_code_definition.xml index d6e56a6..58ba722 100644 --- a/generated_code_definition.xml +++ b/generated_code_definition.xml @@ -6968,6 +6968,63 @@ return rootNodeReference; Set AcroForm to catalog. _void + + + + + + + + + + names + _PDFObjectReference + Reference to Names dictionary. + + + Parameters + + _void + + + + + + + + + + + + Names + DictionaryItemSimple + ((names.isValid()) ? PDFObject::createReference(names) : PDFObject()) + + + + Dictionary + + + + CreateObject + updatedCatalog + _PDFObject + + + + + + Code + + _void + mergeTo(getCatalogReference(), updatedCatalog); + + + Structure + setCatalogNames + Set reference to 'Names' dictionary to catalog. + _void + @@ -7770,6 +7827,70 @@ return rootNodeReference; Sets document part to page. _void + + + + + + + + + + page + _PDFObjectReference + Page + + + + + box + _QRectF + Box + + + Parameters + + _void + + + + + + + + + + + + MediaBox + DictionaryItemSimple + box + + + + Dictionary + + + + CreateObject + updatedPageObject + _PDFObject + + + + + + Code + + _void + mergeTo(page, updatedPageObject); + + + Structure + setPageMediaBox + Sets media box to the page. The media box defines size of physical medium, onto which the page is to be printed. + _void + @@ -7868,9 +7989,16 @@ updateDocumentInfo(qMove(updatedInfoDictionary)); - names + page _PDFObjectReference - Reference to Names dictionary. + Page + + + + + box + _QRectF + Box Parameters @@ -7887,9 +8015,9 @@ updateDocumentInfo(qMove(updatedInfoDictionary)); - Names + CropBox DictionaryItemSimple - ((names.isValid()) ? PDFObject::createReference(names) : PDFObject()) + box @@ -7898,7 +8026,7 @@ updateDocumentInfo(qMove(updatedInfoDictionary)); CreateObject - updatedCatalog + updatedPageObject _PDFObject @@ -7908,12 +8036,204 @@ updateDocumentInfo(qMove(updatedInfoDictionary)); Code _void - mergeTo(getCatalogReference(), updatedCatalog); + mergeTo(page, updatedPageObject); Structure - setCatalogNames - Set reference to 'Names' dictionary to catalog. + setPageCropBox + 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. + _void + + + + + + + + + + + page + _PDFObjectReference + Page + + + + + box + _QRectF + Box + + + Parameters + + _void + + + + + + + + + + + + BleedBox + DictionaryItemSimple + box + + + + Dictionary + + + + CreateObject + updatedPageObject + _PDFObject + + + + + + Code + + _void + mergeTo(page, updatedPageObject); + + + Structure + setPageBleedBox + 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. + _void + + + + + + + + + + + page + _PDFObjectReference + Page + + + + + box + _QRectF + Box + + + Parameters + + _void + + + + + + + + + + + + TrimBox + DictionaryItemSimple + box + + + + Dictionary + + + + CreateObject + updatedPageObject + _PDFObject + + + + + + Code + + _void + mergeTo(page, updatedPageObject); + + + Structure + setPageTrimBox + Sets trim box to the page. Trim box is physical region, of the printed page after trimming. + _void + + + + + + + + + + + page + _PDFObjectReference + Page + + + + + box + _QRectF + Box + + + Parameters + + _void + + + + + + + + + + + + ArtBox + DictionaryItemSimple + box + + + + Dictionary + + + + CreateObject + updatedPageObject + _PDFObject + + + + + + Code + + _void + mergeTo(page, updatedPageObject); + + + Structure + setPageArtBox + Sets art box to the page. Art box defines page's meaningful content. _void