[poppler] utils/pdfinfo.cc

Albert Astals Cid aacid at kde.org
Tue Mar 1 18:29:55 UTC 2016


This commit forgot to update the man page.

Cheers,
 Albert

El Tuesday 01 March 2016, a les 04:58:43, Carlos Garcia Campos va escriure:
>  utils/pdfinfo.cc |   96
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96
> insertions(+)
> 
> New commits:
> commit a8853b1df0a15570dff6ecc333769257bbf874c3
> Author: Adrian Perez de Castro <aperez at igalia.com>
> Date:   Thu May 9 19:11:26 2013 +0300
> 
>     Tagged-PDF: Modify pdfinfo to show the document structure
> 
>     https://bugs.freedesktop.org/show_bug.cgi?id=64816
> 
> diff --git a/utils/pdfinfo.cc b/utils/pdfinfo.cc
> index 5a9745f..18221c2 100644
> --- a/utils/pdfinfo.cc
> +++ b/utils/pdfinfo.cc
> @@ -3,6 +3,7 @@
>  // pdfinfo.cc
>  //
>  // Copyright 1998-2003 Glyph & Cog, LLC
> +// Copyright 2013 Igalia S.L.
>  //
>  //========================================================================
> 
> @@ -56,11 +57,15 @@
>  #include "Error.h"
>  #include "DateInfo.h"
>  #include "JSInfo.h"
> +#include "StructTreeRoot.h"
> +#include "StructElement.h"
> 
>  static void printInfoString(Dict *infoDict, const char *key, const char
> *text, UnicodeMap *uMap);
>  static void printInfoDate(Dict *infoDict, const char *key, const char
> *text); static void printBox(const char *text, PDFRectangle *box);
> +static void printStruct(const StructElement *element, unsigned indent = 0);
> +static void printIndent(unsigned level);
> 
>  static int firstPage = 1;
>  static int lastPage = 0;
> @@ -74,6 +79,8 @@ static char userPassword[33] = "\001";
>  static GBool printVersion = gFalse;
>  static GBool printHelp = gFalse;
>  static GBool printEnc = gFalse;
> +static GBool printStructure = gFalse;
> +static GBool printStructureText = gFalse;
> 
>  static const ArgDesc argDesc[] = {
>    {"-f",      argInt,      &firstPage,        0,
> @@ -86,6 +93,10 @@ static const ArgDesc argDesc[] = {
>     "print the document metadata (XML)"},
>    {"-js",     argFlag,     &printJS,          0,
>     "print all JavaScript in the PDF"},
> +  {"-struct", argFlag,     &printStructure,   0,
> +   "print the logical document structure (for tagged files)"},
> +  {"-struct-text", argFlag, &printStructureText, 0,
> +   "print text contents along with document structure (for tagged files)"},
> {"-rawdates", argFlag,   &rawDates,         0,
>     "print the undecoded date strings directly from the PDF file"},
>    {"-enc",    argString,   textEncName,    sizeof(textEncName),
> @@ -142,6 +153,9 @@ int main(int argc, char *argv[]) {
>      goto err0;
>    }
> 
> +  if (printStructureText)
> +    printStructure = gTrue;
> +
>    // read config file
>    globalParams = new GlobalParams();
> 
> @@ -401,6 +415,15 @@ int main(int argc, char *argv[]) {
>      jsInfo.scanJS(lastPage - firstPage + 1, stdout, uMap);
>    }
> 
> +  // print the structure
> +  const StructTreeRoot *structTree;
> +  if (printStructure && (structTree =
> doc->getCatalog()->getStructTreeRoot())) { +    fputs("Structure:\n",
> stdout);
> +    for (unsigned i = 0; i < structTree->getNumChildren(); i++) {
> +      printStruct(structTree->getChild(i), 1);
> +    }
> +  }
> +
>    exitCode = 0;
> 
>    // clean up
> @@ -481,3 +504,76 @@ static void printBox(const char *text, PDFRectangle
> *box) { printf("%s%8.2f %8.2f %8.2f %8.2f\n",
>  	 text, box->x1, box->y1, box->x2, box->y2);
>  }
> +
> +static void printIndent(unsigned indent) {
> +  while (indent--) {
> +    putchar(' ');
> +    putchar(' ');
> +  }
> +}
> +
> +static void printAttribute(const Attribute *attribute, unsigned indent)
> +{
> +  printIndent(indent);
> +  printf(" /%s ", attribute->getTypeName());
> +  if (attribute->getType() == Attribute::UserProperty) {
> +    GooString *name = attribute->getName();
> +    printf("(%s) ", name->getCString());
> +    delete name;
> +  }
> +  attribute->getValue()->print(stdout);
> +  if (attribute->getFormattedValue()) {
> +    printf(" \"%s\"", attribute->getFormattedValue());
> +  }
> +  if (attribute->isHidden()) {
> +    printf(" [hidden]");
> +  }
> +}
> +
> +static void printStruct(const StructElement *element, unsigned indent) {
> +  if (element->isObjectRef()) {
> +    printIndent(indent);
> +    printf("Object %i %i\n", element->getObjectRef().num,
> element->getObjectRef().gen); +    return;
> +  }
> +
> +  if (printStructureText && element->isContent()) {
> +    GooString *text = element->getText(gFalse);
> +    printIndent(indent);
> +    if (text) {
> +      printf("\"%s\"\n", text->getCString());
> +    } else {
> +      printf("(No content?)\n");
> +    }
> +    delete text;
> +  }
> +
> +  if (!element->isContent()) {
> +      printIndent(indent);
> +      printf("%s", element->getTypeName());
> +      if (element->getID()) {
> +          printf(" <%s>", element->getID()->getCString());
> +      }
> +      if (element->getTitle()) {
> +          printf(" \"%s\"", element->getTitle()->getCString());
> +      }
> +      if (element->getRevision() > 0) {
> +          printf(" r%u", element->getRevision());
> +      }
> +      if (element->isInline() || element->isBlock()) {
> +          printf(" (%s)", element->isInline() ? "inline" : "block");
> +      }
> +      if (element->getNumAttributes()) {
> +          putchar(':');
> +          for (unsigned i = 0; i < element->getNumAttributes(); i++) {
> +              putchar('\n');
> +              printAttribute(element->getAttribute(i), indent + 1);
> +          }
> +      }
> +
> +      putchar('\n');
> +      for (unsigned i = 0; i < element->getNumChildren(); i++) {
> +          printStruct(element->getChild(i), indent + 1);
> +      }
> +  }
> +}
> _______________________________________________
> poppler mailing list
> poppler at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/poppler



More information about the poppler mailing list