From 516c6b9aceb43782a35b3f68010eff44bad39ec8 Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Tue, 4 May 2021 12:24:29 -0400 Subject: [PATCH] Load trailer dict. --- pdfio-file.c | 41 ++++++++++++++++++++++++++++----- pdfio-private.h | 2 ++ pdfio.xcodeproj/project.pbxproj | 29 +++++++++++++++++++++++ 3 files changed, 66 insertions(+), 6 deletions(-) diff --git a/pdfio-file.c b/pdfio-file.c index 5f1273b..373cfc4 100644 --- a/pdfio-file.c +++ b/pdfio-file.c @@ -453,9 +453,10 @@ static bool // O - `true` on success, `false` on failure load_xref(pdfio_file_t *pdf, // I - PDF file off_t xref_offset) // I - Offset to xref { - bool done = false; // Are we done? - char line[1024], // Line from file - *ptr; // Pointer into line + bool done = false; // Are we done? + char line[1024], // Line from file + *ptr; // Pointer into line + _pdfio_value_t trailer; // Trailer dictionary while (!done) @@ -496,7 +497,7 @@ load_xref(pdfio_file_t *pdf, // I - PDF file // Read this group of objects... for (; num_objects > 0; num_objects --, number ++) { - intmax_t offset; // Offset in file + intmax_t offset; // Offset in file int generation; // Generation number pdfio_obj_t *obj; // Object @@ -558,8 +559,36 @@ load_xref(pdfio_file_t *pdf, // I - PDF file return (false); } - // TODO: Read trailer dict... - done = true; + if (!_pdfioValueRead(pdf, &trailer)) + { + _pdfioFileError(pdf, "Unable to read trailer dictionary."); + return (false); + } + else + { + _pdfioFileError(pdf, "Trailer is not a dictionary."); + return (false); + } + + if (!pdf->trailer) + { + // Save the trailer dictionary and grab the root (catalog) and info + // objects... + pdf->trailer = trailer.value.dict; + + if ((pdf->root = pdfioDictGetObject(pdf->trailer, "Root")) == NULL) + { + _pdfioFileError(pdf, "Missing Root object."); + return (false); + } + + pdf->info = pdfioDictGetObject(pdf->trailer, "Info"); + pdf->encrypt = pdfioDictGetObject(pdf->trailer, "Encrypt"); + pdf->id_array = pdfioDictGetArray(pdf->trailer, "ID"); + } + + if ((xref_offset = (off_t)pdfioDictGetNumber(pdf->trailer, "Prev")) <= 0) + done = true; } return (true); diff --git a/pdfio-private.h b/pdfio-private.h index 807fb2a..dc8c0c7 100644 --- a/pdfio-private.h +++ b/pdfio-private.h @@ -127,6 +127,8 @@ struct _pdfio_file_s // PDF file structure pdfio_dict_t *trailer; // Trailer dictionary pdfio_obj_t *root; // Root object/dictionary pdfio_obj_t *info; // Information object/dictionary + pdfio_obj_t *encrypt; // Encryption object/dictionary + pdfio_array_t *id_array; // ID array // Allocated data elements size_t num_arrays, // Number of arrays diff --git a/pdfio.xcodeproj/project.pbxproj b/pdfio.xcodeproj/project.pbxproj index e5f5200..c1cbb3f 100644 --- a/pdfio.xcodeproj/project.pbxproj +++ b/pdfio.xcodeproj/project.pbxproj @@ -20,8 +20,19 @@ 273440CD263D727800FBFD63 /* pdfio-page.c in Sources */ = {isa = PBXBuildFile; fileRef = 273440C2263D727800FBFD63 /* pdfio-page.c */; }; 273440D8263D72E100FBFD63 /* testpdfio.c in Sources */ = {isa = PBXBuildFile; fileRef = 273440D7263D72E100FBFD63 /* testpdfio.c */; }; 273440E4263DD7EA00FBFD63 /* pdfio-token.c in Sources */ = {isa = PBXBuildFile; fileRef = 273440E3263DD7EA00FBFD63 /* pdfio-token.c */; }; + 27ECBD8926419DAB0025312A /* libpdfio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 273440B0263D6FE200FBFD63 /* libpdfio.a */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 27ECBD8626419DA40025312A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 273440A8263D6FE200FBFD63 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 273440AF263D6FE200FBFD63; + remoteInfo = pdfio; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXCopyFilesBuildPhase section */ 273440D0263D72AE00FBFD63 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; @@ -73,6 +84,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 27ECBD8926419DAB0025312A /* libpdfio.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -98,6 +110,7 @@ 273440D7263D72E100FBFD63 /* testpdfio.c */, 273440D9263D72EF00FBFD63 /* Documentation */, 273440B1263D6FE200FBFD63 /* Products */, + 27ECBD8826419DAB0025312A /* Frameworks */, ); sourceTree = ""; }; @@ -125,6 +138,13 @@ name = Documentation; sourceTree = ""; }; + 27ECBD8826419DAB0025312A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -168,6 +188,7 @@ buildRules = ( ); dependencies = ( + 27ECBD8726419DA40025312A /* PBXTargetDependency */, ); name = testpdfio; productName = testpdfio; @@ -237,6 +258,14 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 27ECBD8726419DA40025312A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 273440AF263D6FE200FBFD63 /* pdfio */; + targetProxy = 27ECBD8626419DA40025312A /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ 273440B2263D6FE200FBFD63 /* Debug */ = { isa = XCBuildConfiguration;