X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=pdf%2Fxpdf%2Fpdfinfo.cc;h=33898375182c5bf198df32fadb07c38b63d3306d;hb=2af881bd90a35b4f1343b027ba7c3c0464930fb1;hp=ea70afe93d8803a3702de673f08e07b0203b6530;hpb=2a393c134fe3fe8eb85bf818cb7ad6ae4396322a;p=evince.git diff --git a/pdf/xpdf/pdfinfo.cc b/pdf/xpdf/pdfinfo.cc index ea70afe9..33898375 100644 --- a/pdf/xpdf/pdfinfo.cc +++ b/pdf/xpdf/pdfinfo.cc @@ -2,7 +2,7 @@ // // pdfinfo.cc // -// Copyright 1998-2002 Glyph & Cog, LLC +// Copyright 1998-2003 Glyph & Cog, LLC // //======================================================================== @@ -28,21 +28,31 @@ #include "CharTypes.h" #include "UnicodeMap.h" #include "Error.h" -#include "config.h" +#include "xpdfconfig.h" static void printInfoString(Dict *infoDict, char *key, char *text, UnicodeMap *uMap); static void printInfoDate(Dict *infoDict, char *key, char *text); +static void printBox(char *text, PDFRectangle *box); +static int firstPage = 1; +static int lastPage = 0; +static GBool printBoxes = gFalse; static GBool printMetadata = gFalse; static char textEncName[128] = ""; -static char ownerPassword[33] = ""; -static char userPassword[33] = ""; +static char ownerPassword[33] = "\001"; +static char userPassword[33] = "\001"; static char cfgFileName[256] = ""; static GBool printVersion = gFalse; static GBool printHelp = gFalse; static ArgDesc argDesc[] = { + {"-f", argInt, &firstPage, 0, + "first page to convert"}, + {"-l", argInt, &lastPage, 0, + "last page to convert"}, + {"-box", argFlag, &printBoxes, 0, + "print the page bounding boxes"}, {"-meta", argFlag, &printMetadata, 0, "print the document metadata (XML)"}, {"-enc", argString, textEncName, sizeof(textEncName), @@ -71,11 +81,18 @@ int main(int argc, char *argv[]) { GString *fileName; GString *ownerPW, *userPW; UnicodeMap *uMap; + Page *page; Object info; - double w, h; + char buf[256]; + double w, h, wISO, hISO; FILE *f; GString *metadata; GBool ok; + int exitCode; + int pg, i; + GBool multiPage; + + exitCode = 99; // parse args ok = parseArgs(argDesc, &argc, argv); @@ -85,7 +102,7 @@ int main(int argc, char *argv[]) { if (!printVersion) { printUsage("pdfinfo", "", argDesc); } - exit(1); + goto err0; } fileName = new GString(argv[1]); @@ -103,12 +120,12 @@ int main(int argc, char *argv[]) { } // open PDF file - if (ownerPassword[0]) { + if (ownerPassword[0] != '\001') { ownerPW = new GString(ownerPassword); } else { ownerPW = NULL; } - if (userPassword[0]) { + if (userPassword[0] != '\001') { userPW = new GString(userPassword); } else { userPW = NULL; @@ -121,32 +138,47 @@ int main(int argc, char *argv[]) { delete ownerPW; } if (!doc->isOk()) { + exitCode = 1; goto err2; } + // get page range + if (firstPage < 1) { + firstPage = 1; + } + if (lastPage == 0) { + multiPage = gFalse; + lastPage = 1; + } else { + multiPage = gTrue; + } + if (lastPage < 1 || lastPage > doc->getNumPages()) { + lastPage = doc->getNumPages(); + } + // print doc info doc->getDocInfo(&info); if (info.isDict()) { - printInfoString(info.getDict(), "Title", "Title: ", uMap); - printInfoString(info.getDict(), "Subject", "Subject: ", uMap); - printInfoString(info.getDict(), "Keywords", "Keywords: ", uMap); - printInfoString(info.getDict(), "Author", "Author: ", uMap); - printInfoString(info.getDict(), "Creator", "Creator: ", uMap); - printInfoString(info.getDict(), "Producer", "Producer: ", uMap); - printInfoDate(info.getDict(), "CreationDate", "CreationDate: "); - printInfoDate(info.getDict(), "ModDate", "ModDate: "); + printInfoString(info.getDict(), "Title", "Title: ", uMap); + printInfoString(info.getDict(), "Subject", "Subject: ", uMap); + printInfoString(info.getDict(), "Keywords", "Keywords: ", uMap); + printInfoString(info.getDict(), "Author", "Author: ", uMap); + printInfoString(info.getDict(), "Creator", "Creator: ", uMap); + printInfoString(info.getDict(), "Producer", "Producer: ", uMap); + printInfoDate(info.getDict(), "CreationDate", "CreationDate: "); + printInfoDate(info.getDict(), "ModDate", "ModDate: "); } info.free(); // print tagging info - printf("Tagged: %s\n", + printf("Tagged: %s\n", doc->getStructTreeRoot()->isDict() ? "yes" : "no"); // print page count - printf("Pages: %d\n", doc->getNumPages()); + printf("Pages: %d\n", doc->getNumPages()); // print encryption info - printf("Encrypted: "); + printf("Encrypted: "); if (doc->isEncrypted()) { printf("yes (print:%s copy:%s change:%s addNotes:%s)\n", doc->okToPrint(gTrue) ? "yes" : "no", @@ -158,20 +190,59 @@ int main(int argc, char *argv[]) { } // print page size - if (doc->getNumPages() >= 1) { - w = doc->getPageWidth(1); - h = doc->getPageHeight(1); - printf("Page size: %g x %g pts", w, h); + for (pg = firstPage; pg <= lastPage; ++pg) { + w = doc->getPageWidth(pg); + h = doc->getPageHeight(pg); + if (multiPage) { + printf("Page %4d size: %g x %g pts", pg, w, h); + } else { + printf("Page size: %g x %g pts", w, h); + } if ((fabs(w - 612) < 0.1 && fabs(h - 792) < 0.1) || (fabs(w - 792) < 0.1 && fabs(h - 612) < 0.1)) { printf(" (letter)"); - } else if ((fabs(w - 595) < 0.1 && fabs(h - 842) < 0.1) || - (fabs(w - 842) < 0.1 && fabs(h - 595) < 0.1)) { - printf(" (A4)"); + } else { + hISO = sqrt(sqrt(2.0)) * 7200 / 2.54; + wISO = hISO / sqrt(2.0); + for (i = 0; i <= 6; ++i) { + if ((fabs(w - wISO) < 1 && fabs(h - hISO) < 1) || + (fabs(w - hISO) < 1 && fabs(h - wISO) < 1)) { + printf(" (A%d)", i); + break; + } + hISO = wISO; + wISO /= sqrt(2.0); + } } printf("\n"); } + // print the boxes + if (printBoxes) { + if (multiPage) { + for (pg = firstPage; pg <= lastPage; ++pg) { + page = doc->getCatalog()->getPage(pg); + sprintf(buf, "Page %4d MediaBox: ", pg); + printBox(buf, page->getMediaBox()); + sprintf(buf, "Page %4d CropBox: ", pg); + printBox(buf, page->getCropBox()); + sprintf(buf, "Page %4d BleedBox: ", pg); + printBox(buf, page->getBleedBox()); + sprintf(buf, "Page %4d TrimBox: ", pg); + printBox(buf, page->getTrimBox()); + sprintf(buf, "Page %4d ArtBox: ", pg); + printBox(buf, page->getArtBox()); + } + } else { + page = doc->getCatalog()->getPage(firstPage); + printBox("MediaBox: ", page->getMediaBox()); + printBox("CropBox: ", page->getCropBox()); + printBox("BleedBox: ", page->getBleedBox()); + printBox("TrimBox: ", page->getTrimBox()); + printBox("ArtBox: ", page->getArtBox()); + } + } + // print file size #ifdef VMS f = fopen(fileName->getCString(), "rb", "ctx=stm"); @@ -179,21 +250,24 @@ int main(int argc, char *argv[]) { f = fopen(fileName->getCString(), "rb"); #endif if (f) { -#if HAVE_FSEEK64 +#if HAVE_FSEEKO + fseeko(f, 0, SEEK_END); + printf("File size: %u bytes\n", (Guint)ftello(f)); +#elif HAVE_FSEEK64 fseek64(f, 0, SEEK_END); - printf("File size: %u bytes\n", (Guint)ftell64(f)); + printf("File size: %u bytes\n", (Guint)ftell64(f)); #else fseek(f, 0, SEEK_END); - printf("File size: %d bytes\n", (int)ftell(f)); + printf("File size: %d bytes\n", (int)ftell(f)); #endif fclose(f); } // print linearization info - printf("Optimized: %s\n", doc->isLinearized() ? "yes" : "no"); + printf("Optimized: %s\n", doc->isLinearized() ? "yes" : "no"); // print PDF version - printf("PDF version: %.1f\n", doc->getPDFVersion()); + printf("PDF version: %.1f\n", doc->getPDFVersion()); // print the metadata if (printMetadata && (metadata = doc->readMetadata())) { @@ -203,18 +277,21 @@ int main(int argc, char *argv[]) { delete metadata; } + exitCode = 0; + // clean up err2: uMap->decRefCnt(); delete doc; err1: delete globalParams; + err0: // check for memory leaks Object::memCheck(stderr); gMemReport(stderr); - return 0; + return exitCode; } static void printInfoString(Dict *infoDict, char *key, char *text, @@ -278,8 +355,9 @@ static void printInfoDate(Dict *infoDict, char *key, char *text) { tmStruct.tm_wday = -1; tmStruct.tm_yday = -1; tmStruct.tm_isdst = -1; - mktime(&tmStruct); // compute the tm_wday and tm_yday fields - if (strftime(buf, sizeof(buf), "%c", &tmStruct)) { + // compute the tm_wday and tm_yday fields + if (mktime(&tmStruct) != (time_t)-1 && + strftime(buf, sizeof(buf), "%c", &tmStruct)) { fputs(buf, stdout); } else { fputs(s, stdout); @@ -291,3 +369,8 @@ static void printInfoDate(Dict *infoDict, char *key, char *text) { } obj.free(); } + +static void printBox(char *text, PDFRectangle *box) { + printf("%s%8.2f %8.2f %8.2f %8.2f\n", + text, box->x1, box->y1, box->x2, box->y2); +}