% 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
% 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 def
systemdict /.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 exit
DSCfile closefile
quit
% end of pdf2dsc.ps