166 lines · 5.0 KB · Text
RawDownload
%    Copyright (C) 1994, 1995, 1996, 1997, 1998 Aladdin Enterprises.  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.% % For more information about licensing, please refer to% http://www.ghostscript.com/licensing/. For information on% commercial licensing, go to http://www.artifex.com/licensing/ or% contact Artifex Software, Inc., 101 Lucas Valley Road #110,% San Rafael, CA  94903, U.S.A., +1(415)492-9861. % $Id: pdf2dsc.ps,v 1.7 2002/03/30 23:39:15 raph Exp $% pdf2dsc.ps% read pdf file and produce DSC "index" file.%% Input  file is named PDFname% Output file is named DSCname%% Run using:%  gs -dNODISPLAY -sPDFname=pdffilename -sDSCname=tempfilename pdf2dsc.ps% Then display the PDF file with%  gs tempfilename%% Modified by Geoff Keating <geoffk@ozemail.com.au> 21/12/98:%	Add DocumentMedia, PageMedia comments%	Use inherited BoundingBox and Orientation%	Reformat, add new macro 'puts', generally clean up% Modified by Johannes Plass <plass@dipmza.physik.uni-mainz.de> 1996-11-05:%	Adds BoundingBox and Orientation if available.% Modified by rjl/lpd 9/19/96%	Updates for compatibility with modified pdf_*.ps code for handling%	  page ranges (i.e., partial files) better.% Modified by Geoff Keating <Geoff.Keating@anu.edu.au> 7/3/96:%	include Title and CreationDate DSC comments (these are displayed by%	  Ghostview);%	reduce the size of typical output files by a factor of about 3.% Modified by L. Peter Deutsch 3/18/96:%	Removes unnecessary and error-prone code duplicated from pdf_main.ps% Modified by L. Peter Deutsch for GS 3.33% Originally by Russell Lang  1995-04-26 /PDFfile PDFname (r) file def/DSCfile DSCname (w) file defsystemdict /.setsafe known { .setsafe } if /puts { DSCfile exch writestring } bind def/DSCstring 255 string def/MediaTypes 10 dict def % (str1) (str2)  concatstr  (str1str2)/concatstr {  2 copy length exch length add string  dup dup 5 2 roll copy length% stack: newstring newstring str2 str1-length  exch putinterval} bind def    GS_PDF_ProcSet begin   pdfdict begin   PDFfile   pdfopen begin   /FirstPage where { pop } { /FirstPage 1 def } ifelse   /LastPage where { pop } { /LastPage pdfpagecount def } ifelse % scan through for media sizes, keep them in the dictionary   FirstPage 1 LastPage {      pdfgetpage /MediaBox pget pop   % MediaBox is a required attribute      aload pop       3 -1 roll sub 3 1 roll exch sub exch      2 array astore       aload 3 1 roll 10 string cvs exch 10 string cvs      (x) exch concatstr concatstr cvn      MediaTypes 3 1 roll exch put   } for % write header and prolog   (%!PS-Adobe-3.0\n) puts   Trailer /Info knownoget    {      dup /Title knownoget       {         (%%Title: ) puts         DSCfile exch write==       }      if      /CreationDate knownoget       {         (%%CreationDate: ) puts         DSCfile exch write==       }      if    }   if   % This is really supposed to be sorted by frequency of usage...   (%%DocumentMedia: )   MediaTypes {       exch pop      1 index puts      (y) puts dup 1 get DSCstring cvs puts      (x) puts dup 0 get DSCstring cvs puts       ( ) puts dup 0 get DSCstring cvs puts      ( ) puts 1 get DSCstring cvs puts       ( 70 white ()\n) puts      pop (%%+ )   } forall   pop    (%%Pages: ) puts   LastPage FirstPage sub 1 add DSCstring cvs puts   (\n%%EndComments\n) puts   (%%BeginProlog\n) puts   (/Page null def\n/Page# 0 def\n/PDFSave null def\n) puts   (/DSCPageCount 0 def\n) puts   (/DoPDFPage {dup /Page# exch store pdfgetpage pdfshowpage } def\n) puts   (GS_PDF_ProcSet begin\npdfdict begin\n) puts   (%%EndProlog\n) puts   (%%BeginSetup\n) puts   DSCfile PDFname write==only   ( \(r\) file { DELAYSAFER { .setsafe } if } stopped pop\n) puts   ( pdfopen begin\n) puts   (%%EndSetup\n) puts   % process each page   FirstPage 1 LastPage {       (%%Page: ) puts       dup DSCstring cvs puts       ( ) puts       dup DSCstring cvs puts       (\n) puts        dup pdfgetpage       dup /MediaBox pget pop         (%%PageMedia: y) puts	 aload pop 3 -1 roll sub DSCstring cvs puts	 (x) puts exch sub DSCstring cvs puts	 (\n) puts       dup /CropBox pget {         (%%PageBoundingBox: ) puts         {DSCfile exch write=only ( ) puts} forall         (\n) puts       } if       /Rotate pget {         (%%PageOrientation: ) puts         90 div cvi 4 mod dup 0 lt {4 add} if         [(Portrait) (Landscape) (UpsideDown) (Seascape)] exch get puts         (\n) puts       } if        DSCfile exch DSCstring cvs writestring       ( DoPDFPage\n) puts    } for   currentdict pdfclose   end   end   end% write trailer(%%Trailer\n) puts(currentdict pdfclose\nend\nend\nend\n) puts(%%EOF\n) puts% close output file and exitDSCfile closefilequit% end of pdf2dsc.ps