summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChris Liddell <chris.liddell@artifex.com>2019-12-12 14:33:27 +0000
committerChris Liddell <chris.liddell@artifex.com>2019-12-12 14:34:53 +0000
commit76bd0d75823a571130f340ab6231e064d1f997f7 (patch)
tree0b4fb42af0238e5c761ead21e7bb81daf9382b09 /lib
parente39d57f23585b6fe71db5433dc205459be7a3c22 (diff)
downloadghostpdl-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.ps429
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