Index: src/pdf/SkPDFDocument.cpp |
diff --git a/src/pdf/SkPDFDocument.cpp b/src/pdf/SkPDFDocument.cpp |
index 740fa7dd5e89792840a2d7285f7cf1861f9845d5..178b521fbaceb878fd5962579344023fee125913 100644 |
--- a/src/pdf/SkPDFDocument.cpp |
+++ b/src/pdf/SkPDFDocument.cpp |
@@ -238,6 +238,18 @@ SkCanvas* SkPDFDocument::onBeginPage(SkScalar width, SkScalar height, |
// if this is the first page if the document. |
fObjectSerializer.serializeHeader(this->getStream(), fMetadata); |
fDests = sk_make_sp<SkPDFDict>(); |
+ #ifdef SK_PDF_GENERATE_PDFA |
+ SkPDFMetadata::UUID uuid = fMetadata.uuid(); |
+ // We use the same UUID for Document ID and Instance ID since this |
+ // is the first revision of this document (and Skia does not |
+ // support revising existing PDF documents). |
+ // If we are not in PDF/A mode, don't use a UUID since testing |
+ // works best with reproducible outputs. |
+ fID.reset(SkPDFMetadata::CreatePdfId(uuid, uuid)); |
+ fXMP.reset(fMetadata.createXMPObject(uuid, uuid)); |
+ fObjectSerializer.addObjectRecursively(fXMP); |
+ fObjectSerializer.serializeObjects(this->getStream()); |
+ #endif |
} |
SkISize pageSize = SkISize::Make( |
SkScalarRoundToInt(width), SkScalarRoundToInt(height)); |
@@ -297,18 +309,9 @@ bool SkPDFDocument::onClose(SkWStream* stream) { |
return false; |
} |
auto docCatalog = sk_make_sp<SkPDFDict>("Catalog"); |
- sk_sp<SkPDFObject> id, xmp; |
#ifdef SK_PDF_GENERATE_PDFA |
- SkPDFMetadata::UUID uuid = metadata.uuid(); |
- // We use the same UUID for Document ID and Instance ID since this |
- // is the first revision of this document (and Skia does not |
- // support revising existing PDF documents). |
- // If we are not in PDF/A mode, don't use a UUID since testing |
- // works best with reproducible outputs. |
- id.reset(SkPDFMetadata::CreatePdfId(uuid, uuid)); |
- xmp.reset(metadata.createXMPObject(uuid, uuid)); |
- docCatalog->insertObjRef("Metadata", std::move(xmp)); |
- |
+ SkASSERT(fXMP); |
+ docCatalog->insertObjRef("Metadata", fXMP); |
// sRGB is specified by HTML, CSS, and SVG. |
auto outputIntent = sk_make_sp<SkPDFDict>("OutputIntent"); |
outputIntent->insertName("S", "GTS_PDFA1"); |
@@ -321,7 +324,6 @@ bool SkPDFDocument::onClose(SkWStream* stream) { |
// no one has ever asked for this feature. |
docCatalog->insertObject("OutputIntents", std::move(intentArray)); |
#endif |
- |
docCatalog->insertObjRef("Pages", generate_page_tree(&fPages)); |
if (fDests->size() > 0) { |
@@ -340,9 +342,12 @@ bool SkPDFDocument::onClose(SkWStream* stream) { |
fObjectSerializer.addObjectRecursively(docCatalog); |
fObjectSerializer.serializeObjects(this->getStream()); |
- fObjectSerializer.serializeFooter( |
- this->getStream(), docCatalog, std::move(id)); |
- |
+ #ifdef SK_PDF_GENERATE_PDFA |
+ fObjectSerializer.serializeFooter(this->getStream(), docCatalog, fID); |
+ #else |
+ fObjectSerializer.serializeFooter( |
+ this->getStream(), docCatalog, nullptr); |
+ #endif |
SkASSERT(fPages.count() == 0); |
fCanon.reset(); |
renew(&fObjectSerializer); |