From 0d1d5413ee71ed547ab20992246bc5a2e3309648 Mon Sep 17 00:00:00 2001 From: vididvidid Date: Tue, 30 Sep 2025 04:52:25 +0000 Subject: [PATCH] pdf/a files must contains special xmp metadata that declares their conformance. so updated the write_metadata --- pdfio-file.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/pdfio-file.c b/pdfio-file.c index 7a45446..a44fa17 100644 --- a/pdfio-file.c +++ b/pdfio-file.c @@ -1328,6 +1328,13 @@ pdfioFileSetPermissions( if (!pdf) return (false); + if (pdf->pdfa != _PDFIO_PDFA_NONE && encryption != PDFIO_ENCRYPTION_NONE) + { + _pdfioFileError(pdf, "Encryption is not allowed for PDF/A files."); + return (false); + } + + if (pdf->num_objs > 3) // First three objects are pages, info, and root { _pdfioFileError(pdf, "You must call pdfioFileSetPermissions before adding any objects."); @@ -2740,6 +2747,59 @@ write_metadata(pdfio_file_t *pdf) // I - PDF file status &= pdfioStreamPuts(st, " \n"); #endif // 0 + if (pdf->pdfa != _PDFIO_PDFA_NONE) + { + const char *part = "1"; // Conformance part number + const char *conformance = "B"; // Conformance level + + switch (pdf->pdfa) + { + case _PDFIO_PDFA_1A: + conformance = "A"; + break; + case _PDFIO_PDFA_1B: + // Default is B + break; + case _PDFIO_PDFA_2A: + part = "2"; + conformance = "A"; + break; + case _PDFIO_PDFA_2B: + part="2"; + break; + case _PDFIO_PDFA_2U: + part = "2"; + conformance = "U"; + break; + case _PDFIO_PDFA_3A: + part = "3"; + conformance = "A"; + break; + case _PDFIO_PDFA_3B: + part = "3"; + break; + case _PDFIO_PDFA_3U: + part = "3"; + conformance = "U"; + break; + case _PDFIO_PDFA_4: + part = "4"; + conformance = ""; // Conformance level is part of GTS_PDFA4 key + break; + case _PDFIO_PDFA_NONE: + break; + } + + status &= pdfioStreamPuts(st, " \n"); + status &= pdfioStreamPrintf(st, " %s\n",part); + if (*conformance) + status &= pdfioStreamPrintf(st, " %s\n", conformance); + status &= pdfioStreamPuts(st, " \n"); + } + + + + status &= pdfioStreamPuts(st, " \n"); status &= pdfioStreamPuts(st, "\n"); status &= pdfioStreamPuts(st, "\n");