mirror of
https://github.com/michaelrsweet/pdfio.git
synced 2025-12-24 05:56:25 +01:00
added the enum for the conformance levels in the pdfio-private.h under _pdfio_file_s and updated the create_common() function which is used by pdfiofilecreate to recognize the new pdf/a-.. strings
This commit is contained in:
BIN
examples/create_tagged_pdf
Executable file
BIN
examples/create_tagged_pdf
Executable file
Binary file not shown.
77
examples/create_tagged_pdf.c
Normal file
77
examples/create_tagged_pdf.c
Normal file
@@ -0,0 +1,77 @@
|
||||
#include <pdfio.h>
|
||||
#include <pdfio-content.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
// 1. Basic PDF setup
|
||||
pdfio_file_t *pdf;
|
||||
pdfio_rect_t media_box = {0.0, 0.0, 612.0, 792.0}; // US Letter size
|
||||
|
||||
// Create the PDF file
|
||||
if ((pdf = pdfioFileCreate("tagged_document.pdf", "2.0", &media_box, &media_box, NULL, NULL)) == NULL)
|
||||
{
|
||||
puts("Error: Could not create PDF file.");
|
||||
return (1);
|
||||
}
|
||||
|
||||
// 2. Build the Structure Tree Root (StructTreeRoot)
|
||||
// This is the master "table of contents" for all tags.
|
||||
pdfio_dict_t *struct_tree_root_dict = pdfioDictCreate(pdf);
|
||||
pdfioDictSetName(struct_tree_root_dict, "Type", "StructTreeRoot");
|
||||
|
||||
// Create the top-level document element tag: /Document
|
||||
pdfio_dict_t *doc_elem_dict = pdfioDictCreate(pdf);
|
||||
pdfioDictSetName(doc_elem_dict, "Type", "StructElem");
|
||||
pdfioDictSetName(doc_elem_dict, "S", "Document"); // 'S' is the structure type
|
||||
|
||||
// Create the paragraph element tag: /P
|
||||
pdfio_dict_t *p_elem_dict = pdfioDictCreate(pdf);
|
||||
pdfioDictSetName(p_elem_dict, "Type", "StructElem");
|
||||
pdfioDictSetName(p_elem_dict, "S", "P"); // 'S' is the structure type (Paragraph)
|
||||
pdfioDictSetNumber(p_elem_dict, "K", 0); // 'K' is the content, pointing to MCID 0 on the page
|
||||
|
||||
// Link the paragraph as a child of the document element
|
||||
pdfio_array_t *doc_kids = pdfioArrayCreate(pdf);
|
||||
pdfioArrayAppendDict(doc_kids, p_elem_dict);
|
||||
pdfioDictSetArray(doc_elem_dict, "K", doc_kids);
|
||||
|
||||
// Link the document element as a child of the StructTreeRoot
|
||||
pdfio_array_t *root_kids = pdfioArrayCreate(pdf);
|
||||
pdfioArrayAppendDict(root_kids, doc_elem_dict);
|
||||
pdfioDictSetArray(struct_tree_root_dict, "K", root_kids);
|
||||
|
||||
// Create a PDF object for the StructTreeRoot and link it to the main catalog
|
||||
pdfio_obj_t *struct_tree_root_obj = pdfioFileCreateObj(pdf, struct_tree_root_dict);
|
||||
pdfioDictSetObj(pdfioFileGetCatalog(pdf), "StructTreeRoot", struct_tree_root_obj);
|
||||
|
||||
// 3. Create a page and its content
|
||||
pdfio_dict_t *page_dict = pdfioDictCreate(pdf);
|
||||
pdfio_obj_t *helvetica = pdfioFileCreateFontObjFromBase(pdf, "Helvetica");
|
||||
pdfioPageDictAddFont(page_dict, "F1", helvetica);
|
||||
|
||||
pdfio_stream_t *st = pdfioFileCreatePage(pdf, page_dict);
|
||||
|
||||
// 4. Write the tagged content to the page stream
|
||||
pdfioContentTextBegin(st);
|
||||
pdfioContentSetTextFont(st, "F1", 24.0);
|
||||
pdfioContentTextMoveTo(st, 72.0, 700.0);
|
||||
|
||||
// Create a dictionary for the marked content, specifying the ID
|
||||
pdfio_dict_t *p_mcid_dict = pdfioDictCreate(pdf);
|
||||
pdfioDictSetNumber(p_mcid_dict, "MCID", 0); // This ID must match the 'K' value in the StructElem
|
||||
|
||||
// Use the functions from pdfio-content.c to wrap the text
|
||||
pdfioContentBeginMarked(st, "P", p_mcid_dict); // Start tag for Paragraph
|
||||
pdfioContentTextShow(st, false, "This is a tagged paragraph.");
|
||||
pdfioContentEndMarked(st); // End tag
|
||||
|
||||
pdfioContentTextEnd(st);
|
||||
|
||||
// 5. Finalize and close
|
||||
pdfioStreamClose(st);
|
||||
pdfioFileClose(pdf);
|
||||
|
||||
puts("Successfully created tagged_document.pdf");
|
||||
return (0);
|
||||
}
|
||||
BIN
examples/tagged_document.pdf
Normal file
BIN
examples/tagged_document.pdf
Normal file
Binary file not shown.
58
pdfio-file.c
58
pdfio-file.c
@@ -1514,7 +1514,7 @@ create_common(
|
||||
unsigned char id_value[16]; // File ID value
|
||||
time_t curtime; // Creation date/time
|
||||
_pdfio_sha256_t ctx; // Hashing context
|
||||
|
||||
const char *actual_version; // Actual PDF version string
|
||||
|
||||
PDFIO_DEBUG("create_common(filename=\"%s\", fd=%d, output_cb=%p, output_cbdata=%p, version=\"%s\", media_box=%p, crop_box=%p, error_cb=%p, error_cbdata=%p)\n", filename, fd, (void *)output_cb, (void *)output_cbdata, version, (void *)media_box, (void *)crop_box, (void *)error_cb, (void *)error_cbdata);
|
||||
|
||||
@@ -1522,13 +1522,16 @@ create_common(
|
||||
if (!filename || (fd < 0 && !output_cb))
|
||||
return (NULL);
|
||||
|
||||
if (!version)
|
||||
version = "2.0";
|
||||
//if (!version)
|
||||
//version = "2.0";
|
||||
|
||||
if (!error_cb)
|
||||
{
|
||||
error_cb = _pdfioFileDefaultError;
|
||||
error_cbdata = NULL;
|
||||
error_cbdata = NULL;i
|
||||
(error_cb)(&temp,message,error_cbdata)
|
||||
|
||||
return (NULL)
|
||||
}
|
||||
|
||||
// Allocate a PDF file structure...
|
||||
@@ -1550,7 +1553,52 @@ create_common(
|
||||
pdf->output_cb = output_cb;
|
||||
pdf->output_ctx = output_cbdata;
|
||||
pdf->filename = strdup(filename);
|
||||
pdf->version = strdup(!strncmp(version, "PCLm-", 5) ? "1.4" : version);
|
||||
|
||||
if (!version)
|
||||
{
|
||||
version = "2.0";
|
||||
}
|
||||
|
||||
if (!strncmp(version, "PDF/A-1", 7))
|
||||
{
|
||||
actual_version = "1.4";
|
||||
if (version[7] == 'a')
|
||||
pdf->pdfa = _PDFIO_PDFA_1A;
|
||||
else
|
||||
pdf->pdfa = _PDFIO_PDFA_1B; // Default to 'b'
|
||||
}
|
||||
else if (!strncmp(version, "PDF/A-2", 7))
|
||||
{
|
||||
actual_version = "1.7";
|
||||
if (version[7] == 'a')
|
||||
pdf->pdfa = _PDFIO_PDFA_2A;
|
||||
else if (version[7] == 'u')
|
||||
pdf->pdfa = _PDFIO_PDFA_2U;
|
||||
else
|
||||
pdf->pdfa = _PDFIO_PDFA_2B; // Default to 'b'
|
||||
}
|
||||
else if (!strncmp(version, "PDF/A-3", 7))
|
||||
{
|
||||
actual_version = "1.7";
|
||||
if (version[7] == 'a')
|
||||
pdf->pdfa = _PDFIO_PDFA_3A;
|
||||
else if (version[7] == 'u')
|
||||
pdf->pdfa = _PDFIO_PDFA_3U;
|
||||
else
|
||||
pdf->pdfa = _PDFIO_PDFA_3B; // Default to 'b'
|
||||
}
|
||||
else if (!strncmp(version, "PDF/A-4", 7))
|
||||
{
|
||||
actual_version = "2.0";
|
||||
pdf->pdfa = _PDFIO_PDFA_4;
|
||||
}
|
||||
else
|
||||
{
|
||||
actual_version = version;
|
||||
pdf->pdfa = _PDFIO_PDFA_NONe;
|
||||
}
|
||||
|
||||
pdf->version = strdup(actual_version);
|
||||
pdf->mode = _PDFIO_MODE_WRITE;
|
||||
pdf->error_cb = error_cb;
|
||||
pdf->error_data = error_cbdata;
|
||||
|
||||
@@ -105,6 +105,20 @@ typedef enum _pdfio_mode_e // Read/write mode
|
||||
_PDFIO_MODE_WRITE // Write a PDF file
|
||||
} _pdfio_mode_t;
|
||||
|
||||
typedef enum _pdfio_pdfa_e
|
||||
{
|
||||
_PDFIO_PDFA_NONE = 0, // Not a PDF/A file
|
||||
_PDFIO_PDFA_1A, // PDF/A-1a:2005
|
||||
_PDFIO_PDFA_1B, // PDF/A-1b:2005
|
||||
_PDFIO_PDFA_2A, // PDF/A-2a:2011
|
||||
_PDFIO_PDFA_2B, // PDF/A-2b:20011
|
||||
_PDFIO_PDFA_2U, // PDF/A-2u:2011
|
||||
_PDFIO_PDFA_3A, // PDF/A-3a:2012
|
||||
_PDFIO_PDFA_3B, // PDF/A-3b:2012
|
||||
_PDFIO_PDFA_3U, // PDF/A-3u:2012
|
||||
_PDFIO_PDFA_4, // PDF/A-4:2020
|
||||
} _pdfio_pdfa_t;
|
||||
|
||||
typedef enum _pdfio_predictor_e // PNG predictor constants
|
||||
{
|
||||
_PDFIO_PREDICTOR_NONE = 1, // No predictor (default)
|
||||
@@ -239,6 +253,7 @@ struct _pdfio_file_s // PDF file structure
|
||||
unsigned char file_id[32]; // File identifier bytes
|
||||
struct lconv *loc; // Locale data
|
||||
char *version; // Version number
|
||||
_pdfio_pdfa_t pdfa; // PDF/A conformance
|
||||
pdfio_rect_t media_box, // Default MediaBox value
|
||||
crop_box; // Default CropBox value
|
||||
_pdfio_mode_t mode; // Read/write mode
|
||||
|
||||
Reference in New Issue
Block a user