Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extend by adding pdfioGetModDate and extend the pdfioinfo example #88

Merged
merged 2 commits into from
Feb 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 86 additions & 6 deletions examples/pdfioinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,18 @@ main(int argc, // I - Number of command-line arguments
{
const char *filename; // PDF filename
pdfio_file_t *pdf; // PDF file
const char *author; // Author name
time_t creation_date; // Creation date
struct tm *creation_tm; // Creation date/time information
char creation_text[256]; // Creation date/time as a string
const char *author, // Author name
*creator, // Creator name
*producer; // Producer name
time_t creation_date, // Creation date
mod_date; // Modification date
struct tm *creation_tm, // Creation date/time information
*mod_tm; // Mod. date/time information
char creation_text[256], // Creation date/time as a string
mod_text[256]; // Mod. date/time human fmt string
const char *title; // Title
size_t num_pages; // PDF number of pages
bool has_acroform; // AcroForm or not


// Get the filename from the command-line...
Expand All @@ -48,9 +55,12 @@ main(int argc, // I - Number of command-line arguments
if (pdf == NULL)
return (1);

// Get the title and author...
// Get the title, author...
author = pdfioFileGetAuthor(pdf);
title = pdfioFileGetTitle(pdf);
creator = pdfioFileGetCreator(pdf);
producer = pdfioFileGetProducer(pdf);
num_pages = pdfioFileGetNumPages(pdf);

// Get the creation date and convert to a string...
if ((creation_date = pdfioFileGetCreationDate(pdf)) > 0)
Expand All @@ -63,12 +73,82 @@ main(int argc, // I - Number of command-line arguments
snprintf(creation_text, sizeof(creation_text), "-- not set --");
}

// Get the modification date and convert to a string...
if ((mod_date = pdfioFileGetModDate(pdf)) > 0)
{
mod_tm = localtime(&mod_date);
strftime(mod_text, sizeof(mod_text), "%c", mod_tm);
}
else
{
snprintf(mod_text, sizeof(mod_text), "-- not set --");
}

// Detect simply if AcroFrom is a dict in catalog
{
pdfio_dict_t *dict; // some Object dictionary

dict = pdfioFileGetCatalog(pdf);
has_acroform = (dict != NULL && pdfioDictGetObj(dict, "AcroForm") != NULL)?
true : false;
}

// Print file information to stdout...
printf("%s:\n", filename);
printf(" Title: %s\n", title ? title : "-- not set --");
printf(" Author: %s\n", author ? author : "-- not set --");
printf(" Creator: %s\n", creator ? creator : "-- not set --");
printf(" Producer: %s\n", producer ? producer : "-- not set --");
printf(" Created On: %s\n", creation_text);
printf(" Number Pages: %u\n", (unsigned)pdfioFileGetNumPages(pdf));
printf(" Modified On: %s\n", mod_text);
printf(" Version: %s\n", pdfioFileGetVersion(pdf));
printf(" AcroForm: %s\n", has_acroform ? "Yes" : "No");
printf(" Number Pages: %u\n", (unsigned)num_pages);
printf(" MediaBoxes:");
// There can be a different MediaBox per page
// Loop and report MediaBox and number of consecutive pages of this size
{
pdfio_obj_t *obj; // Object
pdfio_dict_t *dict; // Object dictionary
pdfio_rect_t prev, // MediaBox previous
now; // MediaBox now
size_t n, // Page index
nprev; // Number previous prev size

// MediaBox should be set at least on the root
for (n = nprev = 0; n < num_pages; n++)
{
obj = pdfioFileGetPage(pdf, n);
while (obj != NULL)
{
dict = pdfioObjGetDict(obj);
if (pdfioDictGetRect(dict, "MediaBox", &now))
{
if (
nprev == 0
|| (
now.x1 != prev.x1 || now.y1 != prev.y1
|| now.x2 != prev.x2 || now.y2 != prev.y2
)
)
{
if (nprev) printf("(%zd) ", nprev);
prev = now;
printf("[%.7g %.7g %.7g %.7g]", now.x1, now.y1, now.x2, now.y2);
nprev = 1;
}
else
++nprev;
obj = NULL;
}
else
obj = pdfioDictGetObj(dict, "Parent");
}
}
printf("(%zd)", nprev);
}
printf("\n");


// Close the PDF file...
pdfioFileClose(pdf);
Expand Down
12 changes: 12 additions & 0 deletions pdfio-file.c
Original file line number Diff line number Diff line change
Expand Up @@ -801,6 +801,18 @@ pdfioFileGetKeywords(pdfio_file_t *pdf) // I - PDF file
}


//
// 'pdfioFileGetModDate()' - Get the most recent modification date for a PDF file.
//

time_t // O - Modification date or `0` for none
pdfioFileGetModDate(
pdfio_file_t *pdf) // I - PDF file
{
return (pdf && pdf->info_obj ? pdfioDictGetDate(pdfioObjGetDict(pdf->info_obj), "ModDate") : 0);
}


//
// 'pdfioFileGetName()' - Get a PDF's filename.
//
Expand Down
1 change: 1 addition & 0 deletions pdfio.h
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ extern time_t pdfioFileGetCreationDate(pdfio_file_t *pdf) _PDFIO_PUBLIC;
extern const char *pdfioFileGetCreator(pdfio_file_t *pdf) _PDFIO_PUBLIC;
extern pdfio_array_t *pdfioFileGetID(pdfio_file_t *pdf) _PDFIO_PUBLIC;
extern const char *pdfioFileGetKeywords(pdfio_file_t *pdf) _PDFIO_PUBLIC;
extern time_t pdfioFileGetModDate(pdfio_file_t *pdf) _PDFIO_PUBLIC;
extern const char *pdfioFileGetName(pdfio_file_t *pdf) _PDFIO_PUBLIC;
extern size_t pdfioFileGetNumObjs(pdfio_file_t *pdf) _PDFIO_PUBLIC;
extern size_t pdfioFileGetNumPages(pdfio_file_t *pdf) _PDFIO_PUBLIC;
Expand Down
1 change: 1 addition & 0 deletions pdfio1.def
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,7 @@ pdfioFileGetCreationDate
pdfioFileGetCreator
pdfioFileGetID
pdfioFileGetKeywords
pdfioFileGetModDate
pdfioFileGetName
pdfioFileGetNumObjs
pdfioFileGetNumPages
Expand Down
Loading