diff options
author | Chris Liddell <chris.liddell@artifex.com> | 2019-12-12 14:33:27 +0000 |
---|---|---|
committer | Chris Liddell <chris.liddell@artifex.com> | 2019-12-12 14:34:53 +0000 |
commit | 76bd0d75823a571130f340ab6231e064d1f997f7 (patch) | |
tree | 0b4fb42af0238e5c761ead21e7bb81daf9382b09 /lib | |
parent | e39d57f23585b6fe71db5433dc205459be7a3c22 (diff) | |
download | ghostpdl-76bd0d75823a571130f340ab6231e064d1f997f7.tar.gz |
Move pdf_info.ps into lib (from toolbin)
And add it to the list of files to install on Unix systems.
Also, tweak the comments in pdf_info.ps to reflect its new home.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pdf_info.ps | 429 |
1 files changed, 429 insertions, 0 deletions
diff --git a/lib/pdf_info.ps b/lib/pdf_info.ps new file mode 100644 index 000000000..547809c8d --- /dev/null +++ b/lib/pdf_info.ps @@ -0,0 +1,429 @@ +%!PS +% Copyright (C) 2001-2019 Artifex Software, Inc. +% All Rights Reserved. +% +% This software is provided AS-IS with no warranty, either express or +% implied. +% +% This software is distributed under license and may not be copied, +% modified or distributed except as expressly authorized under the terms +% of the license contained in the file LICENSE in this distribution. +% +% Refer to licensing information at http://www.artifex.com or contact +% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato, +% CA 94945, U.S.A., +1(415)492-9861, for further information. +% +% +% $Id: pdf_info.ps 6300 2005-12-28 19:56:24Z alexcher $ + +% Dump some info from a PDF file + +% usage: gs -dNODISPLAY -q -sFile=____.pdf [-dDumpMediaSizes=false] [-dDumpFontsNeeded=false] [-dDumpXML] +% [-dDumpFontsUsed [-dShowEmbeddedFonts] ] lib/pdf_info.ps + +128 dict begin + +/QUIET true def % in case they forgot + +/showoptions { + ( where "options" are:) = + ( -dDumpMediaSizes=false (default true) MediaBox and CropBox for each page) = + ( -dDumpFontsNeeded=false (default true)Fonts used, but not embedded) = + ( -dDumpXML print the XML Metadata from the PDF, if present) = + ( -dDumpFontsUsed List all fonts used) = + ( -dShowEmbeddedFonts only meaningful with -dDumpFontsUsed) = + (\n If no options are given, the default is -dDumpMediaSizes -dDumpFontsNeeded) = + () = + flush +} bind def + +/DumpMediaSizes where { pop } { /DumpMediaSizes true def } ifelse +/DumpFontsNeeded where { pop } { /DumpFontsNeeded true def } ifelse + +[ {.shellarguments} stopped not + { + { counttomark 1 eq { + dup 0 get (-) 0 get ne { + % File specified on the command line using: -- lib/pdf_info.ps infile.pdf + /File exch def + false % don't show usage + } { + true % show usage and quit + } ifelse + } { true } ifelse + { + (\n*** Usage: gs [options] -- lib/pdf_info.ps infile.pdf ***\n\n) print + showoptions + quit + } if + } if + } if +/File where not { + (\n *** Missing input file name \(use -sFile=____.pdf\)\n) = + ( usage: gs -dNODISPLAY -q -sFile=____.pdf [ options ] lib/pdf_info.ps\n) = + showoptions + quit +} if +cleartomark % discard the dict from --where-- + +% ---- No more executable code on the top level after this line ----- +% ---- except 2 lines at the very end ----- + +%% When checking Resources for Font objects, we must ensure that we don't end +%% up following a circular reference. Circular references in Resources should +%% not, of course, be present but we've seen a number of cases. If we do detect +%% a circular reference, then stop checking that chain. + +/oforce_no_circular { + dup type /packedarraytype eq { + dup 0 get + currentdict /ProcessedResources known { + dup ProcessedResources exch known { + pop pop //null + } { + dup ProcessedResources 3 1 roll put + oforce + } ifelse + } { + oforce + } ifelse + } { + oforce + } ifelse +} bind def + +/printXML { % <string> printXML - + % print non-blank lines without trailing spaces + dup dup length 1 sub -1 0 { + 1 index 1 index get 32 eq { + 0 exch getinterval exch + } { + exch = exit % non-blank on this line + } + ifelse + } for + pop pop % clean up +} bind def + +/dump-pdf-info { % (fname) -> - + () = ( ) print print ( has ) print + PDFPageCount dup =print 10 mod 1 eq { ( page.\n) } { ( pages\n) } ifelse = flush + + Trailer /Root oget /AcroForm knownoget { + /XFA knownoget { + (File uses XFA forms.\n\n) print + pop + } if + } if + + /DumpXML where { + pop + Trailer /Root oget /Metadata knownoget { + //false resolvestream + { dup 256 string readline exch printXML not { exit } if } loop + pop % done with the stream + (_____________________________________________________________) = + flush + } if + } if + + % Print out the "Info" dictionary if present + Trailer /Info knownoget { + dup /Title knownoget { (Title: ) print = flush } if + dup /Author knownoget { (Author: ) print = flush } if + dup /Subject knownoget { (Subject: ) print = flush } if + dup /Keywords knownoget { (Keywords: ) print = flush } if + dup /Creator knownoget { (Creator: ) print = flush } if + dup /Producer knownoget { (Producer: ) print = flush } if + dup /CreationDate knownoget { (CreationDate: ) print = flush } if + dup /ModDate knownoget { (ModDate: ) print = flush } if + dup /Trapped knownoget { (Trapped: ) print = flush } if + pop + } if + +} bind def + +% <page index> <page dict> dump-media-sizes - +/dump-media-sizes { + DumpMediaSizes { + () = + % Print out the Page Size info for each page. + (Page ) print =print + dup /UserUnit pget { + ( UserUnit: ) print =print + } if + dup /MediaBox pget { + ( MediaBox: ) print oforce_array ==only + } if + dup /CropBox pget { + ( CropBox: ) print oforce_array ==only + } if + dup /BleedBox pget { + ( BleedBox: ) print oforce_array ==only + } if + dup /TrimBox pget { + ( TrimBox: ) print oforce_array ==only + } if + dup /ArtBox pget { + ( ArtBox: ) print oforce_array ==only + } if + dup /Rotate pget { + ( Rotate = ) print =print + } if + dup /Annots pget { + pop + ( Page contains Annotations) print + } if + pageusestransparency { + ( Page uses transparency features) print + } if + () = flush + } + { + pop pop + } ifelse +} bind def + +% List of standard font names for use when we are showing the FontsNeeded +/StdFontNames [ + /Times-Roman /Helvetica /Courier /Symbol + /Times-Bold /Helvetica-Bold /Courier-Bold /ZapfDingbats + /Times-Italic /Helvetica-Oblique /Courier-Oblique + /Times-BoldItalic /Helvetica-BoldOblique /Courier-BoldOblique +] def + +/res-type-dict 10 dict begin + /Font { + { + exch pop oforce_no_circular + dup //null ne { + dup /DescendantFonts knownoget { + exch pop 0 get oforce_no_circular + %% Check to see if a potentail circular reference was detected. This could be a + %% false positive caused by other fonts using the same DescendantFont(s), but if + %% so then we've already cehcked them anyway. + dup //null eq { pop << >>} if + } if + dup /FontDescriptor knownoget { + dup /FontFile known 1 index /FontFile2 known or exch /FontFile3 known or + /ShowEmbeddedFonts where { pop pop //false } if { + pop % skip embedded fonts + } { + /BaseFont knownoget { % not embedded + 2 index exch //null put + } if + } ifelse + } { + /BaseFont knownoget { % no FontDescriptor, not embedded + 2 index exch //null put + } if + } ifelse + } { + pop + } ifelse + } forall % traverse the dictionary + } bind def + + /XObject { + { + exch pop oforce_no_circular + dup //null ne { + dup /Subtype knownoget { + /Form eq { + /Resources knownoget { + get-fonts-from-res + } if + } { + pop + } ifelse + } { + pop + } ifelse + } { + pop + } ifelse + } forall + } bind def + + /Pattern { + { + exch pop oforce_no_circular + dup //null ne { + /Resources knownoget { + get-fonts-from-res + } if + } { + pop + } ifelse + } forall + } bind def +currentdict end readonly def + +% <dict for fonts> <<res-dict>> get-fonts-from-res - +/get-fonts-from-res { + oforce_no_circular + dup //null ne { + { + oforce_no_circular + dup //null ne { + //res-type-dict 3 -1 roll + .knownget { + exec + } { + pop + } ifelse + } { + pop pop + } ifelse + } forall + } { + pop + } ifelse +} bind def + +currentdict /res-type-dict undef + +/getPDFfonts { % <dict for fonts> <page dict> getPDFfonts - + /ProcessedResources 10 dict def + dup /Resources pget { get-fonts-from-res } if + /Annots knownoget { + { oforce_no_circular + dup //null ne { + /AP knownoget { + { exch pop oforce_no_circular + dup //null ne { + dup /Resources knownoget { + get-fonts-from-res + } if + { exch pop oforce_no_circular + dup type /dicttype eq { + /Resources knownoget { + get-fonts-from-res + } if + } { + pop + } ifelse + } forall + } { + pop + } ifelse + } forall + } if + } { + pop + } ifelse + } forall + } if + pop + currentdict /ProcessedResources undef +} bind def + +/dump-fonts-used { % <dict for fonts> dump-fonts-used - + % If DumpFontsUsed is not true, then remove the 'standard' fonts from the list + systemdict /DumpFontsUsed known not { + StdFontNames { + 1 index 1 index known { 1 index 1 index undef } if + pop + } forall + } if + + % Now dump the FontsUsed dict into an array so we can sort it. + [ 1 index { pop } forall ] + { 100 string cvs exch 100 string cvs exch lt } .sort + + systemdict /DumpFontsUsed known + { + (\nFont or CIDFont resources used (plain name and ASCIIHEX string representation):) = + { 128 string cvs dup print ( ) print (<) print 128 string cvs {16 8 string cvrs print} forall (>) print (\n) print} forall + } { + DumpFontsNeeded { + dup length 0 gt { + (\nFonts Needed that are not embedded \(system fonts required\):) = + { ( ) print 128 string cvs dup print ( ) print (<) print {16 8 string cvrs print} forall (>) print (\n) print} forall + } { + pop + (\nNo system fonts are needed.) = + } ifelse + } { + pop + } ifelse + } ifelse + pop +} bind def + +% Copy selected subfiles to temporary files and return the file names +% as a PostScript names to protect them from restore. +% Currently, all PDF files in the Portfolio are extracted and returned. +% +% - pdf_collection_files [ /temp_file_name ... /temp_file_name +/pdf_collection_files { + mark + Trailer /Root oget + dup /Collection oknown { + /Names knownoget { + /EmbeddedFiles knownoget { + pdf_collection_names + } if + } if + } { + pop + } ifelse +} bind def + +% Output all the info about the file +/dump { % (title) -> - + /PDFPageCount pdfpagecount def + dump-pdf-info + % dict will be populated with fonts through a call to 'getPDFfonts' + % per page, then the contents dumped out in 'dump-fonts-used' + 1000 dict + + 1 1 PDFPageCount + { + dup pdfgetpage dup 3 -1 roll + dump-media-sizes + 1 index exch getPDFfonts + } for + + dump-fonts-used + +} bind def + +% Choose between collection vs plain file. +% Enumerate collections and apply the dump procedure. +/enum-pdfs { % - -> - + File (r) file runpdfbegin + pdf_collection_files + dup mark eq { + pop + File dump + runpdfend + } { + runpdfend + ] 0 1 2 index length 1 sub { + 2 copy get exch % [file ... ] file i + 1 add (0123456789) cvs % [file ... ] file (i+1) + File exch ( part ) exch concatstrings concatstrings + exch % [file ... ] (fname part i+1) file + dup type /filetype eq { + runpdfbegin + dump + runpdfend + closefile + } { + 1024 string cvs % .namestring is deprecated +% .namestring + dup (r) file + runpdfbegin + exch dump + runpdfend + deletefile + } ifelse + } for + pop + } ifelse +} bind def + +enum-pdfs +end +quit |