diff --git a/testpdfacompilance.c b/testpdfacompilance.c new file mode 100644 index 0000000..88bd449 --- /dev/null +++ b/testpdfacompilance.c @@ -0,0 +1,127 @@ +// +// Test program from pdf-a +// +// This file is specifically designed to test the PDF/A creation feature +// + +#include "pdfio.h" +#include "pdfio-content.h" +#include +#include + +// Local Function + +static bool create_pdfa_test_file(const char *filename, const char *pdfa_version); +static int test_pdfa(void); + +// 'create_pdfa_test_file()' -> A helper function to generate a simple +// PDF/A file + + +static bool // 0 - true on success, false on error +create_pdfa_test_file( + const char *filename, // I - Name of the pdf file to create + const char *pdfa_version) // I - PDF/A version string (e.g., "PDF/A-1b") +{ + pdfio_file_t *pdf; // Ouput PDF File + pdfio_rect_t media-box = { 0.0, 0.0, 612.0, 792.0 }; // Media box for US Letter + pdfio_obj_t *font; // Font Object + pdfio_dict_t *page_dict; // Page Dictionary + pdfio_stream_t *st; // Page content stream + char text[256]; // Text to write to page + + // Let the user know what we're doing + snprintf(text, sizeof(text), "This is a compliance test for %s.", pdfa_version); + printf(" Creating '%s' for %s compilance check ... \n", filename, pdfa_version); + + // Create the PDF/A file using the specified version string + if ((pdf = pdfioFileCreate(filename, pdfa_version, &media_box, NULL, NULL, NULL)) == NULL) + { + fprintf(stderr, " ERROR: Unable to create '%s'.\n",filename); + return (false); + } + + // Add some basic content to make it a valid, non-empty PDF + font = pdfioFileCreateFontObjFromBase(pdf,"Helvetica"); + page_dict = pdfioDictCreate(pdf); + pdfioPageDictAddFont(page_dict, "F1", font); + st = pdfioFileCreatePage(pdf, page_dict); + + pdfioContentSetTextFont(st, "F1", 12.0); + pdfioContentTextBegin(st); + pdfioContentTextMoveTo(st, 72.0, 720.0); + pdfioContentTextShow(st, false, text); + pdfioContentTextEnd(st); + + // Close the stream and the file to finalize and save it + pdfioStreamClose(st); + pdfioFileClose(pdf); + + printf(" Successfully created '%s'.\n", filename); + return (true); +} + +// 'test_pdfa()' - The main test runner for the PDF/A feature.' + +static int // 0 - 0 on success, 1 on error +test_pdfa(void) +{ + int status = 0; // Overall test status + pdfio_file_t *fail_pdf; // PDF for failure test + pdfio_rect_t media_box = {0.0, 0.0, 612.0, 792.0 }; + + + puts (" ----- Running PDF/A Generation Tests --- \n"); + + // --- Positive Test Cases: Generate one file for each conformance level --- + if (!create_pdfa_test_file("test-pdfa-1b.pdf", "PDF/A-1b")) status = 1; + if (!create_pdfa_test_file("test-pdfa-2b.pdf", "PDF/A-2b")) status = 1; + if (!create_pdfa_test_file("test-pdfa-2u.pdf", "PDF/A-2u")) status = 1; + if (!create_pdfa_test_file("test-pdfa-3b.pdf", "PDF/A-3b")) status = 1; + if (!create_pdfa_test_file("test-pdfa-3u.pdf", "PDF/A-3u")) status = 1; + if (!create_pdfa_test_file("test-pdfa-4.pdf", "PDF/A-4")) status = 1; + + // --- Navigate test case: Ensure encryption is blocked -- + puts("\n--- Running PDF/A Encryption Block Test ---\n"); + + printf(" Creating PDF/A file to test encryption failure .. \n"); + if ((fail_pdf = pdfioFileCreate("test-pdfa-fail.pdf", "PDF/A-1b", &media_box, NULL,NULL,NULL)) == NULL) + { + fputs(" ERROR: Unable to create temporary file for encryption test.\n", stderr); + return (1); + } + + // This call MUST fail because encryption is not allowed in PDF/A + if (pdfioFileSetPermissions(fail_pdf, PDFIO_PERMISSION_ALL, PDFIO_ENCRYPTION_RC4_128, "owner", "user")) + { + fputs(" ERROR: pdfioFileSetPermission succeeded but should have FAILED!\n",stderr); + status = 1; // Mark the test suite as failed + } + else + { + puts(" SUCCESS: COrrectly blocked encryption for PDF/A file as expected."); + } + pdfioFileClose(fail_pdf); + + //--- Final Summary---- + puts("\n-------------------------"); + if (status == 0) + puts(" All PDF/A test passed."); + else + puts(" One or more PDF/A tests FAILED."); + puts("\n--------------------------------\n"); + + return (status); +} + + +// 'main()' + +int // 0 - Exit status +main(void) +{ + return (test_pdfa()); +} + + +