texlive[60648] Master: Upgrade gs-9.54.0 -> gs-9.55.0
commits+reinhardk at tug.org
commits+reinhardk at tug.org
Wed Sep 29 03:02:39 CEST 2021
Revision: 60648
http://tug.org/svn/texlive?view=revision&revision=60648
Author: reinhardk
Date: 2021-09-29 03:02:39 +0200 (Wed, 29 Sep 2021)
Log Message:
-----------
Upgrade gs-9.54.0 -> gs-9.55.0
Modified Paths:
--------------
trunk/Master/tlpkg/tlgs/README.TEXLIVE
trunk/Master/tlpkg/tlgs/Resource/Font/README
trunk/Master/tlpkg/tlgs/Resource/Init/gs_cmap.ps
trunk/Master/tlpkg/tlgs/Resource/Init/gs_epsf.ps
trunk/Master/tlpkg/tlgs/Resource/Init/gs_init.ps
trunk/Master/tlpkg/tlgs/Resource/Init/gs_lev2.ps
trunk/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps
trunk/Master/tlpkg/tlgs/Resource/Init/gs_pdfwr.ps
trunk/Master/tlpkg/tlgs/Resource/Init/gs_res.ps
trunk/Master/tlpkg/tlgs/Resource/Init/gs_setpd.ps
trunk/Master/tlpkg/tlgs/Resource/Init/gs_statd.ps
trunk/Master/tlpkg/tlgs/Resource/Init/gs_ttf.ps
trunk/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps
trunk/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps
trunk/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps
trunk/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps
trunk/Master/tlpkg/tlgs/lib/Fontmap
trunk/Master/tlpkg/tlgs/lib/Fontmap.TeXLive
trunk/Master/tlpkg/tlgs/lib/PDFA_def.ps
trunk/Master/tlpkg/tlgs/lib/afmdiff.awk
trunk/Master/tlpkg/tlgs/lib/cidfmap
trunk/Master/tlpkg/tlgs/lib/cidfmap.TeXLive
trunk/Master/tlpkg/tlgs/lib/gslp.ps
trunk/Master/tlpkg/tlgs/lib/viewgif.ps
trunk/Master/tlpkg/tlgs/lib/zugferd.ps
Added Paths:
-----------
trunk/Master/source/ghostscript-9.55.0.tar.xz
Removed Paths:
-------------
trunk/Master/source/ghostscript-9.54.0.tar.xz
Deleted: trunk/Master/source/ghostscript-9.54.0.tar.xz
===================================================================
(Binary files differ)
Added: trunk/Master/source/ghostscript-9.55.0.tar.xz
===================================================================
(Binary files differ)
Index: trunk/Master/source/ghostscript-9.55.0.tar.xz
===================================================================
--- trunk/Master/source/ghostscript-9.55.0.tar.xz 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/source/ghostscript-9.55.0.tar.xz 2021-09-29 01:02:39 UTC (rev 60648)
Property changes on: trunk/Master/source/ghostscript-9.55.0.tar.xz
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/x-xz
\ No newline at end of property
Modified: trunk/Master/tlpkg/tlgs/README.TEXLIVE
===================================================================
--- trunk/Master/tlpkg/tlgs/README.TEXLIVE 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/README.TEXLIVE 2021-09-29 01:02:39 UTC (rev 60648)
@@ -1,17 +1,8 @@
-This directory contains a subset of the Ghostscript 9.54.0 distribution
+This directory contains a subset of the Ghostscript 9.55.0 distribution
for Windows. The only purpose of this package is to support programs
shipped with TeX Live. It's not intended for general use.
-The following patch is applied:
-
-From 50dd527e638463fe036fec4b38915151aab9f940 Mon Sep 17 00:00:00 2001
-From: Ken Sharp <ken.sharp at artifex.com>
-Date: Mon, 19 Apr 2021 10:59:02 +0100
-Subject: [PATCH] pdfwrite - defer freeing annotations which are named objects
-
-Bug 703783 "Segmentation fault with named ANN pdfmark"
-
Changes:
* The directories "doc", "examples", "libpng", "trio", "zlib",
Modified: trunk/Master/tlpkg/tlgs/Resource/Font/README
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Font/README 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Font/README 2021-09-29 01:02:39 UTC (rev 60648)
@@ -1 +1 @@
-This otherwise-empty directory is needed.
+This otherwise-empty directory is needed.
Modified: trunk/Master/tlpkg/tlgs/Resource/Init/gs_cmap.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/gs_cmap.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/gs_cmap.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -224,11 +224,19 @@
/beginbfchar { % <count> beginbfchar -
pop mark
} bind def
-/endbfchar { % <code> <to_code|charname> ... endbfchar
- counttomark 2 idiv {
- counttomark -2 roll % process in correct order
- .addbfchar
- } repeat 1 .appendmap
+/endbfchar { % [ <code> <to_code|charname> ... endbfchar
+ ] [ //true % [<da><ta>] [ true
+ 3 -1 roll % [ true [<da><ta>]
+ {
+ exch {
+ //false % [ <da> false
+ } { % [ <da> <ta>
+ .addbfchar % [ prefix params key value font_index
+ //true
+ } ifelse
+ } forall
+ pop
+ 1 .appendmap
} bind def
/beginbfrange { % <count> beginbfrange -
@@ -236,26 +244,35 @@
} bind def
/endbfrange { % <code_lo> <code_hi> <to_code|(charname*)> ...
% endbfrange -
- counttomark 3 idiv {
- counttomark -3 roll % process in correct order
- dup type dup /arraytype eq exch /packedarraytype eq or {
+ ] [ 0 % [<da><ta><set>] [ 0
+ 3 -1 roll % [ 0 [<da><ta><set>]
+ {
+ exch % [ <da> 0
+ { 1 2
+ {
+ dup type dup /arraytype eq exch /packedarraytype eq or {
% Array value, split up.
- exch pop {
+ exch pop {
% Stack: code to_code|charname
- 1 index exch .addbfchar
+ 1 index exch .addbfchar
% Increment the code. As noted above, we require
% that only the last byte vary, but we still must
% mask it after incrementing, in case the last
% value was 0xff.
% Stack: code prefix params key value fontindex
- 6 -1 roll dup length string copy
- dup dup length 1 sub 2 copy get 1 add 255 and put
- } forall pop
- } {
+ 6 -1 roll dup length string copy
+ dup dup length 1 sub 2 copy get 1 add 255 and put
+ } forall pop
+ } {
% Single value, handle directly.
- .addbfrange
- } ifelse
- } repeat 1 .appendmap
+ .addbfrange
+ } ifelse
+ 0
+ }
+ } exch get exec
+ } forall
+ pop
+ 1 .appendmap
} bind def
/.addbfchar { % <code> <to_code|charname> .addbfchar
@@ -349,7 +366,7 @@
4 -1 roll % <prefix> <param'> <key> <cid>
.endmapvalue % <prefix> <param'> <key> <hex_cid> <font_idx>
% prefix params keys value fontindex
- counttomark 5 gt { % 2 (or more) ranges (1 range = 5 item)
+ counttomark 9 gt { % 2 (or more) ranges (1 range = 5 item)
4 index 10 index eq % compare prefix
4 index 10 index eq and % compare params
1 index 7 index eq and % compare fontindex
@@ -462,7 +479,7 @@
% See if we can merge with the previous value.
% The prefix, params, and font index must match.
% prefix params keys value fontindex
- counttomark 5 gt { % 2 (or more) ranges (1 range = 5 item)
+ counttomark 9 gt { % 2 (or more) ranges (1 range = 5 item)
4 index 10 index eq % compare prefix
4 index 10 index eq and % compare params
1 index 7 index eq and % compare fontindex
Modified: trunk/Master/tlpkg/tlgs/Resource/Init/gs_epsf.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/gs_epsf.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/gs_epsf.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -270,13 +270,14 @@
/.runNoEPS /run load def
/.runEPS { % file OR string --
+ .updatematrices
/runEPS_save save def
/runEPS_dict_count countdictstack def
/runEPS_op_count count 2 sub def
- /runEPS_page_count currentpagedevice /PageCount get def
+ /runEPS_page_count .currentshowpagecount not {0} if def
0 EPSBoundingBoxSetState
//.runNoEPS
- currentpagedevice /PageCount get runEPS_page_count sub 0 eq
+ .currentshowpagecount not {0} if runEPS_page_count sub 0 eq
{ /showpage load exec } if
count runEPS_op_count sub {pop} repeat
countdictstack runEPS_dict_count sub {end} repeat
Modified: trunk/Master/tlpkg/tlgs/Resource/Init/gs_init.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/gs_init.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/gs_init.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -34,7 +34,7 @@
% Interpreter library version number
% NOTE: the interpreter code requires that the first non-comment token
% in this file be an integer, and that it match the compiled-in version!
-9540
+9550
% Check the interpreter revision.
dup revision ne
@@ -476,6 +476,7 @@
% We have to guard against the BeginPage procedure not popping its operand.
% This is really stupid, but the Genoa CET does it.
/.beginpage { % - .beginpage -
+ .updatematrices
.currentshowpagecount {
.currentpagedevice pop
dup //null ne { /BeginPage .knownget } { pop //false } ifelse {
@@ -491,6 +492,7 @@
% Guard similarly against EndPage not popping its operand.
/.endpage { % <reason> .endpage <print_bool>
+ .updatematrices
.currentshowpagecount {
1 index .currentpagedevice pop
dup //null ne { /EndPage .knownget } { pop //false } ifelse {
@@ -2415,7 +2417,7 @@
[
/.bitadd /.charboxpath /.cond /.runandhide /.popdevicefilter
/.execfile /.filenamesplit /.file_name_parent
- /.setdefaultmatrix /.isprocfilter /.unread /.psstringencode
+ /.setdefaultmatrix /.updatematrices /.isprocfilter /.unread /.psstringencode
/.buildsampledfunction /.isencapfunction /.currentaccuratecurves /.currentcurvejoin /.currentdashadapt /.currentdotlength
/.currentlimitclamp /.dotorientation /.setaccuratecurves /.setcurvejoin /.setdashadapt /.setdotorientation
/.setlimitclamp /.currentscreenlevels /.dashpath /.pathbbox /.identeq /.identne /.tokenexec /.forgetsave /.pantonecallback
Modified: trunk/Master/tlpkg/tlgs/Resource/Init/gs_lev2.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/gs_lev2.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/gs_lev2.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -201,7 +201,7 @@
[ /GenericResourceDir /FontResourceDir /GenericResourcePathSep ] {
2 copy .knownget {
exch //pssystemparams exch .knownget {
- ne { /setsystemparams /invalidaccess signalerror } if
+ ne { /setsystemparams cvx /invalidaccess signalerror } if
} {
pop
} ifelse
@@ -279,7 +279,7 @@
/.checkFilePermitparams {
type /arraytype eq {
currentuserparams /LockFilePermissions get {
- 5 { pop } repeat /setuserparams /invalidaccess signalerror
+ 5 { pop } repeat /setuserparams cvx /invalidaccess signalerror
}{
% in addition to validating the value, ensure the value is read/only
dup { readonly exch } forall
@@ -288,7 +288,7 @@
}
ifelse
} {
- 5 { pop } repeat /setuserparams /typecheck signalerror
+ 5 { pop } repeat /setuserparams cvx /typecheck signalerror
}
ifelse
//true
@@ -534,7 +534,7 @@
/exitserver { % <password> exitserver -
//true exch { .startnewjob } .startjob not {
- /exitserver /invalidaccess signalerror
+ /exitserver cvx /invalidaccess signalerror
} if
} bind def
@@ -621,13 +621,13 @@
.dicttomark setpagedevice
} bind def
/setresolution
- { count 1 lt { /setresolution /stackunderflow signalerror } if
+ { count 1 lt { /setresolution cvx /stackunderflow signalerror } if
dup type dup /integertype eq exch /realtype eq or not
{
- /setresolution /typecheck signalerror
+ /setresolution cvx /typecheck signalerror
} if
dup 2 array astore /HWResolution //.pair2dict exec { setpagedevice } stopped {
- pop /setresolution $error /errorname get signalerror
+ pop /setresolution cvx $error /errorname get signalerror
} if
} bind def
%END PAGEDEVICE
@@ -1139,13 +1139,14 @@
}{
% Check that the tint is a number between 0 and 1
dup type dup /integertype eq exch /realtype eq or not {
- /setcustomcolor /typecheck cvx signalerror
+ /setcustomcolor cvx /typecheck signalerror
} if
+ % Bug 703869. Apparently Adobe (at least Acrobat Pro) silently clamps values
dup 1 le not {
- /setcustomcolor /rangecheck cvx signalerror
+ pop 1
} if
dup 0 ge not {
- /setcustomcolor /rangecheck cvx signalerror
+ pop 0
} if
% The array is supposed to be the result of fundcmykcustomcolor. Our
@@ -1157,20 +1158,20 @@
{
1 index exch get dup
type dup /integertype eq exch /realtype eq or not {
- /setcustomcolor /typecheck cvx signalerror
+ /setcustomcolor cvx /typecheck signalerror
} if
dup
1 le not {
- /setcustomcolor /rangecheck cvx signalerror
+ /setcustomcolor cvx /rangecheck signalerror
} if
0 ge not {
- /setcustomcolor /rangecheck cvx signalerror
+ /setcustomcolor cvx /rangecheck signalerror
} if
} for
% Finally, check the last element of the array, which must be a string.
dup length 1 sub get type /stringtype eq not {
- /setcustomcolor /typecheck cvx signalerror
+ /setcustomcolor cvx /typecheck signalerror
} if
exch //buildcolorspacearray exec
Modified: trunk/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -113,9 +113,9 @@
} bind def
/.bigstring { % <size> .bigstring <string|bytestring>
- count 1 lt { /.bigstring /stackunderflow signalerror } if
+ count 1 lt { /.bigstring cvx /stackunderflow signalerror } if
dup type /integertype ne {
- /.bigstring /typecheck signalerror
+ /.bigstring cvx /typecheck signalerror
} if
dup 65400 gt { .bytestring } { string } ifelse
} bind def
Modified: trunk/Master/tlpkg/tlgs/Resource/Init/gs_pdfwr.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/gs_pdfwr.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/gs_pdfwr.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -102,6 +102,7 @@
/UseFlateCompression //true
/UsePrologue //false
/PassThroughJPEGImages //true
+ /PassThroughJPXImages //true
.dicttomark readonly def
/.distillersettings mark
@@ -573,10 +574,10 @@
/pdfmark { % -mark- <key> <value> ... <markname> pdfmark -
counttomark 0 eq {
- /pdfmark /stackunderflow signalerror
+ /pdfmark cvx /stackunderflow signalerror
} if
dup type /nametype eq not {
- /pdfmark /typecheck signalerror
+ /pdfmark cvx /typecheck signalerror
} if
dup /SP eq {
% A hack for synchronizing the clipping path.
@@ -823,6 +824,7 @@
/SubsetFonts { }
/DSCEncodingToUnicode { }
/PassThroughJPEGImages { }
+ /PassThroughJPXImages { }
/PSDocOptions { }
/PSPageOptions { }
.dicttomark readonly def
@@ -873,7 +875,7 @@
//true
}ifelse
{
- /setdistillerparams /undefined signalerror
+ /setdistillerparams cvx /undefined signalerror
} if
.setdistillerparams
} bind odef
@@ -885,7 +887,7 @@
//true
}ifelse
{
- /currentdistillerparams /undefined signalerror
+ /currentdistillerparams cvx /undefined signalerror
} if
.currentdistillerparams
} bind odef
Modified: trunk/Master/tlpkg/tlgs/Resource/Init/gs_res.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/gs_res.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/gs_res.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -1075,7 +1075,7 @@
% but it still needs to restore the stacks reliably if it fails.
/.findfontop {
{ /Font findresource } stopped {
- pop /findfont $error /errorname get signalerror
+ pop /findfont cvx $error /errorname get signalerror
} if
} bind executeonly odef
/findfont {
@@ -1100,7 +1100,7 @@
} forall
/.findencoding {
{ /Encoding findresource } stopped {
- pop /findencoding $error /errorname get signalerror
+ pop /findencoding cvx $error /errorname get signalerror
} if
} bind def
/findencoding /.findencoding load def % must be a procedure
Modified: trunk/Master/tlpkg/tlgs/Resource/Init/gs_setpd.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/gs_setpd.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/gs_setpd.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -919,7 +919,7 @@
.currentpagedevice pop exch
{ .setdevice } stopped {
cleartomark exch pop
- /setpagedevice $error /errorname get
+ /setpagedevice cvx $error /errorname get
signalerror
} if
pop
Modified: trunk/Master/tlpkg/tlgs/Resource/Init/gs_statd.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/gs_statd.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/gs_statd.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -269,10 +269,10 @@
% (a Level 1 operator) as accepting the values 0 and 1,
% so we do too.
dup type /integertype ne {
- /setpage /typecheck signalerror
+ /setpage cvx /typecheck signalerror
} {
dup 0 ne 1 index 1 ne or {
- /setpage /rangecheck signalerror
+ /setpage cvx /rangecheck signalerror
} {
{/letter /note} 1 index get
//systemdict /userdict get exch get cvx exec
Modified: trunk/Master/tlpkg/tlgs/Resource/Init/gs_ttf.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/gs_ttf.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/gs_ttf.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -240,11 +240,25 @@
% <nametable> <nameid> findname false
/findname {
TTFDEBUG { (findname: ) print dup =only } if
- //false 3 1 roll
- 1 index length 0 gt { % check for zero length name table
+ [ //false 4 2 roll
+ {
0 1 3 index 2 getu16 1 sub {
% Stack: false table id index
- 12 mul 6 add 2 index exch 12 getinterval
+ 12 mul 6 add 2 index exch 12
+ % Check the table is actually long enough to contain the requested index
+ 1 index add 2 index length gt
+ {
+ /pdfformaterror where
+ {
+ ( **** TrueType font has malformed name table.\n) exch /pdfformaterror get exec
+ PDFSTOPONERROR {
+ /.loadpdfttfont cvx /invalidfont signalerror
+ } if
+ } if
+ pop pop
+ exit
+ } if
+ 12 getinterval
dup 6 getu16 2 index eq 1 index 8 getu16 0 ne and {
% We found the name we want.
exch pop
@@ -265,8 +279,12 @@
} ifelse
} if pop
} for
- } if
- pop pop
+ } stopped {
+ cleartomark //false
+ } {
+ pop pop
+ counttomark 1 add -1 roll pop
+ } ifelse
TTFDEBUG {
dup { ( = ) print 1 index //== exec } { ( not found) = } ifelse
} if
Modified: trunk/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -92,10 +92,10 @@
exch dup length dict copy % filepos stream fndict2
dup /Function undef % filepos stream fndict2
exch dup token not {
- () /rangecheck cvx signalerror
+ () /rangecheck signalerror
} if
exch token {
- /rangecheck cvx signalerror
+ /rangecheck signalerror
} if
% Use .bind to avoid idiom recognition.
.bind
@@ -529,7 +529,7 @@
pdfformaterror
( Output may be incorrect.\n) pdfformaterror
//pdfdict /.gs_warning_issued //true .forceput
- PDFSTOPONERROR { /gs /undefined signalerror } if
+ PDFSTOPONERROR { /gs cvx /undefined signalerror } if
} executeonly if
} executeonly
ifelse
@@ -1758,7 +1758,7 @@
% <resdict> <key> <value> -> <resdict>
/add-to-last-param {
2 index /DecodeParms knownoget {
- dup {} eq {
+ dup type /dicttype ne 1 index type /arrratype ne and 1 index length 1 lt or {
pop //false
} {
//true
@@ -1765,7 +1765,9 @@
} ifelse
} {
//false
- } ifelse {
+ }
+ ifelse
+ {
dup type /arraytype eq {
[ exch { oforce } forall
dup //null eq { pop 1 dict } if
@@ -2180,33 +2182,48 @@
%% and don't exhaust memory. Note that we have to copy the actual colour space array too, copying
%% the dictionary just copies the opriginal array as well.
%%
- dup /ColorSpace known {
- dup /ColorSpace get dup type /arraytype eq {
- exch dup length dict copy exch
- dup length array copy /ColorSpace exch 2 index 3 1 roll put
- } {pop} ifelse
- } if
+ 1 dict begin
+ /.ImageDictStackDepth countdictstack def
+ /.ImageOpStackDepth count 2 sub def
+ {
+ dup /ColorSpace known {
+ dup /ColorSpace get dup type /arraytype eq {
+ exch dup length dict copy exch
+ dup length array copy /ColorSpace exch 2 index 3 1 roll put
+ } {pop} ifelse
+ } if
- checkaltimage dup length 6 add dict % <<image>> <<>>
- 1 index /SMask knownoget { % <<image>> <<>> <<sm>>
- dup 3 index ne { % <<image>> <<>> <<sm>> <<sm>>
- 1 index exch /SMask exch put
- } {
- pop
- ( **** Error: ignoring recursive /SMask attribute.\n) pdfformaterror
- ( Output may be incorrect.\n) pdfformaterror
- } ifelse
+ checkaltimage dup length 6 add dict % <<image>> <<>>
+ 1 index /SMask knownoget { % <<image>> <<>> <<sm>>
+ dup 3 index ne { % <<image>> <<>> <<sm>> <<sm>>
+ 1 index exch /SMask exch put
+ } {
+ pop
+ ( **** Error: ignoring recursive /SMask attribute.\n) pdfformaterror
+ ( Output may be incorrect.\n) pdfformaterror
+ } ifelse
+ } if
+ 1 index /Mask knownoget {
+ dup type dup /dicttype eq exch /arraytype eq or { % Bug #703681
+ 1 index exch /Mask exch put
+ } {
+ pop
+ ( **** Error: Ignoring Mask attribute that is not an array or a dictionary.\n)
+ pdfformaterror
+ } ifelse
+ } if
+ makeimagedict doimagesmask
+ } PDFSTOPONERROR {exec false}{stopped} ifelse
+ {
+ (\n **** Error: File encountered ')
+ $error /errorname get dup length string cvs concatstrings
+ (' error while processing an image.\n) concatstrings
+ ( Output may be incorrect.\n) concatstrings
+ pdfformaterror
} if
- 1 index /Mask knownoget {
- dup type dup /dicttype eq exch /arraytype eq or { % Bug #703681
- 1 index exch /Mask exch put
- } {
- pop
- ( **** Error: Ignoring Mask attribute that is not an array or a dictionary.\n)
- pdfformaterror
- } ifelse
- } if
- makeimagedict doimagesmask
+ count .ImageOpStackDepth sub {pop} repeat
+ countdictstack .ImageDictStackDepth sub {end} repeat
+ end
} bind executeonly def
/makemaskimage { % <datasource> <imagemask> <Mask> makemaskimage
% <datasource> <imagemask>, updates currentdict =
@@ -2852,6 +2869,7 @@
{
%% We are behaving as a printer, check the Print state
/Print .knownget {
+ oforce
/PrintState .knownget {
oforce
/OFF eq {
@@ -2871,6 +2889,7 @@
/View .knownget {
oforce
/ViewState .knownget {
+ oforce
/OFF eq {
//false
}{
@@ -4331,7 +4350,7 @@
scale
dup /InkList knownoget {
{ oforce
- mark exch { oforce } forall
+ [ exch { oforce } forall ]
.pdfinkpath
stroke
} forall
@@ -4695,6 +4714,21 @@
/K {setcmykcolor}
>> def
+ % Set some sane defaults, in case the /DA does not.
+ 0 setgray
+ /Helvetica findfont
+ % re-encode the font to PDFDocEncoding
+ dup length dict begin
+ {
+ 1 index /FID ne 2 index /UniqueID ne and { def } { pop pop } ifelse
+ } forall
+ /Encoding /PDFDocEncoding /Encoding findresource def
+ /FontName /Helvetica-PDFDocEncoding def
+ currentdict
+ end
+ /Helvetica-PDFDocEncoding exch definefont
+ 12 scalefont setfont
+
dup /DA knownoget {
length string /tempstr exch def
dup /DA get tempstr copy pop
@@ -4729,21 +4763,7 @@
} stopped
{cleartomark setgstate}
{cleartomark pop} ifelse
- } {
- 0 setgray
- /Helvetica findfont
- % re-encode the font to PDFDocEncoding
- dup length dict begin
- {
- 1 index /FID ne 2 index /UniqueID ne and { def } { pop pop } ifelse
- } forall
- /Encoding /PDFDocEncoding /Encoding findresource def
- /FontName /Helvetica-PDFDocEncoding def
- currentdict
- end
- /Helvetica-PDFDocEncoding exch definefont
- 12 scalefont setfont
- }ifelse
+ } if
%% draw the border, if we don't have a border style dictionary, draw a default one.
dup /BS knownoget
Modified: trunk/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -1246,7 +1246,7 @@
{
3 index /CharStrings eq
currentdict 3 index known and
- { pstack flush pop pop }
+ { pop pop }
{ systemdict /def get exec }
ifelse
} bind executeonly def
@@ -1301,7 +1301,7 @@
/Resources 1 index /Resources knownoget {
oforce
} {
- LocalResources
+ 0 dict
} ifelse def
/FontBBox 1 index /FontBBox get cvx def
/FontMatrix 1 index /FontMatrix oget def
@@ -1339,8 +1339,9 @@
0 0 0 0 0 0
pdfopdict /d1 get exec
}{
- { //false resolvestream
- % Stack: filepos stream
+ {
+ dup //false resolvestream
+ % Stack: filepos streamdict stream
% Don't let setgcolor set the color inside the BuildGlyph
% procedure, because this causes an /undefined error.
q
@@ -1351,7 +1352,17 @@
%% we use 'nodict'[ to store other PDF state stuff that isn't gstate, and we
%% probably always will, so it may well be more trouble than its worth.
/Dummy //false gput
- Font /Resources get exch pdfopdict
+ Font /Resources get % Stack: filepos streamdict stream resdict
+ dup length 0 eq {
+ 3 -1 roll /Resources knownoget {
+ exch pop
+ ( **** Warning: Type 3 font has resource dictionary in glyph stream.\n)
+ pdfformatwarning
+ } if
+ } {
+ 3 -1 roll pop
+ } ifelse
+ exch pdfopdict
/BuildCharDictDepth countdictstack def
.pdfruncontext
countdictstack BuildCharDictDepth sub
@@ -2740,7 +2751,7 @@
{
PDFSTOPONERROR
{
- /typecheck cvx signalerror
+ /typecheck signalerror
}
{
% Bug 689450
@@ -2758,7 +2769,7 @@
{
PDFSTOPONERROR
{
- pop /undefined cvx signalerror
+ pop /undefined signalerror
}
{
% Bug 689037
Modified: trunk/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -19,7 +19,7 @@
/.setlanguagelevel where { pop 2 .setlanguagelevel } if
.currentglobal //true .setglobal
pdfdict begin
-/GS_PDF_ProcSet dup load def % keep in pdfdict to hide it
+/GS_PDF_ProcSet dup load def % keep in pdfdict to hide it
userdict /GS_PDF_ProcSet undef
% Patch in an obsolete variable used by some third-party software.
@@ -26,7 +26,7 @@
/#? //false def
% Test whether the current output device handles pdfmark.
-/.writepdfmarks { % - .writepdfmarks <bool>
+/.writepdfmarks { % - .writepdfmarks <bool>
/PdfmarkCapable /GetDeviceParam .special_op {
exch pop
}{
@@ -41,7 +41,7 @@
objopdict { } forall
drawopdict { } forall
/endstream { exit } bind executeonly
- (%%EOF) cvn { exit } bind executeonly % for filters
+ (%%EOF) cvn { exit } bind executeonly % for filters
/obj { ( **** Error: Content stream is not terminated by 'endstream'.\n)
pdfformaterror
( Output may be incorrect.\n) pdfformaterror
@@ -49,7 +49,7 @@
% PDF 1.1 operators
/BX { /BXlevel BXlevel 1 add store } bind executeonly
/EX { /BXlevel BXlevel 1 sub store } bind executeonly
- /PS { DOPS { cvx exec } { pop } ifelse } bind executeonly % PS disabled by default, as in pdf_draw.ps DoPS
+ /PS { DOPS { cvx exec } { pop } ifelse } bind executeonly % PS disabled by default, as in pdf_draw.ps DoPS
% PDF 1.2 operators
/BMC {
/BMClevel BMClevel 1 add store
@@ -204,7 +204,7 @@
% ======================== Main program ======================== %
-end % pdfdict
+end % pdfdict
userdict begin
/defaultfontname /Times-Roman def
@@ -217,6 +217,864 @@
% Redefine 'run' so it recognizes PDF files.
systemdict begin
+
+systemdict /NEWPDF known not {/NEWPDF //false def} if
+
+% PostScript interface to the ghostpdf C-based interpreter
+%
+% Promised or documented as used by customers
+% ===========================================
+% runpdf <file> runpdf -
+% Called from the modified run operator (which copies stdin to a temp
+% file if required). Calls runpdfbegin, check for PDF collections. Then
+% calls process_trailer_attrs, runpdfpagerange, dopdfpages and runpdfend
+% to process all the required pages.
+%
+% runpdfbegin <file> runpdfbegin -
+% creates /pdfdict in userdict set userparmas (ProcessDSCComment
+% setobjectformat to 0 /Page# /Page to null DSCPageCount to 0
+% /PDFSave /null.
+% calls pdfopen and then 'begin's the returned dictionary.
+% Also disables page handler device.
+%
+% pdfgetpage <int> pdfgetpage <pagedict> | <null>
+% int is a number from 1 to N indicating the desired page number from
+% the PDF file. Returns a dictionary, apparently the /Page dictionary. Probably
+% we only need the Boxes and Rotate key ? If this fails, returns a null object.
+%
+% pdfshowpage_init <int> pdfshowpage_init <dict>
+% This simply adds 1 to the /DSCPageCount value in the supplied dictioanry
+%
+% pdfshowpage_setpage <pagedict> pdfshowpage_setpage <pagedict>
+% Takes a dictionary as returned from pdfgetpage, extracts various
+% parameters from it, and sets the media size for the page, taking into
+% account the boxes, and requested Box, Rotate value and PDFFitPage.
+%
+% pdfshowpage_finish <pagedict> pdfshowpage_finish -
+% Takes a dictionary as returned from pdfgetpage, renders the page content
+% executes showpage to transfer the rendered content to the device.
+%
+% runpdfend -
+% Uses currentdict as an argument to pdfclose, which closes /PDFfile. Also
+% executes restore and various cleanup activities.
+%
+% Also Used by gsview 5
+% =====================
+% pdfopen <file> pdfopen <dict>
+% According to the comments; open a PDF file and read the header, trailer
+% and cross-reference. Calls pdfopenfile and 'begin's the returned dictionary
+% calls pdfopencache and then closes the current dictionary.
+% pdfopenfile appears to create a dictionary containing a load of stuff but
+% most importantly, sets /PDFfile to the passed-in file. Probably also contains
+% the Trailer dictionary.
+%
+% pdfclose <dict> pdfclose -
+% The supplied dictionary contains /PDFfile and it executes closefile on that
+% supplied file.
+%
+% Supplied by Ray to customer
+% ============================
+% pdfshowpage <pagedict> pdfshowpage
+% Takes a dictionary returned from pdfgetpage and calls the pdfshowpage_init
+% pdfshowpage_setpage, pdfshowpage_finish trio to start the page, set up the
+% media and render the page.
+%
+% dopdfpages <int> <int> dopdfpages -
+% The integers are the first and last pages to be run from the file. Runs a loop from
+% the fist integer to the last. NOTE! If the current dictionary contains a PDFPageList
+% array then we 'get' the entry from the array corresponding to the current loop
+% index, and use that to determine whether we should draw the page. Otherwise we
+% simply draw the page. Uses pdfshowpage to actually render the page.
+%
+% Additionallly useful ?
+% =======================
+% runpdfpagerange - runpdfpagerange <int> <int>
+% Processes the PostScript /FirstPage, /LastPage and /PageList parameters to build an array
+% of page numbers to run (if PageList is present) and a FirstPage and LastPage value.
+% There seems no point in rewriting this, may as well use it to control page processing.
+%
+% Normal operation
+% =================
+% runpdf - runpdfbegin - pdfopen
+% - process_trailer_attrs
+% - runpdfpagerange
+% - dopdfpages - pdfgetpage
+% - pdfshowpage - pdfshowpage_init
+% - pdfshowpage_setpage
+% - pdfshowpage_finish
+% - runpdfend - pdfclose
+%
+
+/DisablePageHandlerDevice
+{
+ systemdict /FirstPage known
+ systemdict /LastPage known or
+ systemdict /PageList known or
+ {
+ <</DisablePageHandler //true>> setpagedevice
+ } if
+} bind def
+
+/EnablePageHandlerDevice
+{
+ systemdict /FirstPage known
+ systemdict /LastPage known or
+ systemdict /PageList known or
+ {
+ <</DisablePageHandler //false>> setpagedevice
+ } if
+} bind def
+
+/newpdf_pdfformaterror { % <string> pdfformaterror -
+ (%stdout) (w) file
+ dup 3 -1 roll writestring flushfile
+} bind executeonly def
+
+% This routine sets up the transparency compositor requirement, and
+% number of spot channels required (if any) in the device. This needs
+% to be done before we set the media size, so that the erasepage is
+% correct. Called with the dictionary returned from .PDFPageInfo
+/newpdf_device_setup
+{
+ 2 dict exch % <<page dict>> << >>
+ dup /UsesTransparency get % << >> <<page dict>> bool
+ /PageUsesTransparency exch % << >> <<page dict>> /PageUsesTransparency bool
+ 3 index 3 1 roll % << >> <<page dict>> <<info dict>> << >> /PageUsesTransparency bool
+ put % <</PageUsesTransparency bool>> <<page dict>>
+ /NumSpots get % <</PageUsesTransparency bool>> int
+ /PageSpotColors exch % <</PageUsesTransparency bool>> /PageSpotColors int
+ 2 index 3 1 roll % <</PageUsesTransparency bool>> <<page dict>> /PageSpotColors int
+ put % <</PageUsesTransparency bool /PageSpotColors int >>
+ setpagedevice
+}bind def
+
+% Takes the selected Box as a parameter and scales it to fit the current media.
+% If the amount of scaling would be reduced by rotating the content, then
+% rotate the content.
+% Caters for the box non-zero lower left x and y (ie cropping)
+/NewPDF_FitPage
+{
+ dup 2 get 1 index 0 get sub %urx -llx = width
+ 1 index 3 get 2 index 1 get sub %ury - lly = height
+
+ currentpagedevice /PageSize get aload pop % Stack - box boxwidth boxheight mediawidth mediaheight
+
+ % Start by deciding if we should rotate the page to better fit the media.
+ 4 copy eq
+ 3 1 roll eq
+ or % square media or square page, no point in rotating
+ {
+ //false
+ }
+ {
+ gt
+ { % landscape media
+ ge
+ { % landscape media, landscape box, no rotation
+ //false
+ }
+ { % landscape media, portrait box, rotate it to landscape
+ //true
+ } ifelse
+ }
+ { % portrait media
+ ge
+ { % portrait media, landscape box, rotate it to portrait
+ //true
+ }
+ { % portrait media, portrait box, no rotation
+ //false
+ } ifelse
+ }ifelse
+ } ifelse
+
+ % Store values for calculating scale, we do this here because we want to
+ % swap the media width and height (for the scale calculation) if we are
+ % rotating the page
+ 1 index 2 get 2 index 0 get sub % urx -llx = width
+ 2 index 3 get 3 index 1 get sub % ury - lly = height
+ currentpagedevice /PageSize get aload pop % Stack - box rotate boxwidth boxheight mediawidth mediaheight
+ 5 -1 roll % Stack - box boxwidth boxheight mediawidth mediaheight rotate
+
+ % If we need to rotate, recalculate the box
+ {
+ 90 rotate
+ 0 2 index neg translate % move 0,0 to bottom right of media to account for rotation
+ exch % swap media width/height for scaling calculation
+ }if
+
+ % Stack - box boxwidth boxheight mediawidth mediaheight
+ % Incorporate up any offset from 0,0
+ 4 index aload pop pop pop neg exch neg exch
+ 2 copy exch
+ translate
+
+ % Now use the box and media values to calculate the required x/y scale factors
+ 3 -1 roll div % box boxwidth mediawidth (mediaheight / boxheight)
+ 3 1 roll % box (mediaheight / boxheight) boxwidth mediawidth
+ exch % box (mediaheight / boxheight) mediawidth boxwidth
+ div % box (mediaheight / boxheight) (mediawidth / boxwidth)
+
+ 2 copy % box Yscale Xscale Yscale Xscale
+ gt {exch} if % select smallest scale factor
+ pop %
+ dup scale % and scale page isomorphically
+ pop pop
+} bind def
+
+/newpdf_get_media_box { % <pagedict> get_media_box <box> <bool>
+ dup /MediaBox known {
+ /MediaBox get
+ dup length 4 eq {
+ //true
+ }
+ {
+ pop
+ ( **** Error: Page has an invalid /MediaBox attribute. Using the current page size.\n)
+ newpdf_pdfformaterror
+ ( Output may be incorrect.\n) pdfformaterror
+ [ 0 0 currentpagedevice /PageSize get aload pop ]
+ //false
+ }ifelse
+ }
+ {
+ pop
+ ( **** Error: Page has no /MediaBox attribute. Using the current page size.\n)
+ newpdf_pdfformaterror
+ ( Output may be incorrect.\n) newpdf_pdfformaterror
+ [ 0 0 currentpagedevice /PageSize get aload pop ] //false
+ } ifelse
+%(newpdf_get_media_box end) == flush
+} bind executeonly def
+
+/newpdf_get_any_box { % <pagedict> get_any_box <box name> <box>
+%(newpdf_get_any_box start) == flush
+ //systemdict /UseBleedBox .knownget dup { and } if {
+ dup /BleedBox get {
+ /BleedBox exch
+ } if
+ } if
+ //systemdict /UseTrimBox .knownget dup { and } if {
+ dup /TrimBox get {
+ /TrimBox exch
+ } if
+ } if
+ dup type /arraytype ne {
+ //systemdict /UseArtBox .knownget dup { and } if {
+ dup /ArtBox get {
+ /ArtBox exch
+ } if
+ } if
+ } if
+ dup type /arraytype ne {
+ //systemdict /UseCropBox .knownget dup { and } if {
+ dup /CropBox get {
+ /CropBox exch
+ } if
+ } if
+ } if
+ dup type /arraytype ne {
+ /MediaBox exch newpdf_get_media_box pop
+ } {
+ %% Complicated stuff. We need to use the 'Box' we identified (if any), but we
+ %% need to clamp the boundaries of the 'Box' to the MediaBox. This appears to
+ %% be what Acrobat does. The complication arises because the Box values don't
+ %% have to be sensibly positive, its permissible to have the MediaBox set up
+ %% so that it extends down and left instead of up and right. We take care of the
+ %% content when we st up the CTM, but we do need to make sure that we clamp
+ %% the BoundingBox, and that means we need to take direcitonality into account...
+
+ 6 -1 roll newpdf_get_media_box { % /SomeBox x0 y0 x1 y1 [MediaBox]
+ aload pop % /SomeBox x0 y0 x1 y1 X0 Y0 X1 Y1
+
+ %% Start with the width, get the X0 and X1 values of the MediaBox
+ 3 index % /SomeBox x0 y0 x1 y1 X0 Y0 X1 Y1 X0
+ 2 index % /SomeBox x0 y0 x1 y1 X0 Y0 X1 Y1 X0 X1
+ gt {
+ %% Media extends to left
+ 4 -1 roll % /SomeBox x0 y0 x1 y1 Y0 X1 Y1 X0
+ 8 -1 roll % /SomeBox y0 x1 y1 Y0 X1 Y1 X0 x0
+ .min % /SomeBox y0 x1 y1 Y0 X1 Y1 mX0
+ 7 1 roll % /SomeBox mX0 y0 x1 y1 Y0 X1 Y1
+ exch % /SomeBox mX0 y0 x1 y1 Y0 Y1 X1
+ 5 -1 roll % /SomeBox mX0 y0 y1 Y0 Y1 X1 x1
+ .max % /SomeBox mX0 y0 y1 Y0 Y1 mX1
+ 5 1 roll % /SomeBox mX0 mX1 y0 y1 Y0 Y1
+ }{
+ %% Media extends to right
+ 4 -1 roll % /SomeBox x0 y0 x1 y1 Y0 X1 Y1 X0
+ 8 -1 roll % /SomeBox y0 x1 y1 Y0 X1 Y1 X0 x0
+ .max % /SomeBox y0 x1 y1 Y0 X1 Y1 mX0
+ 7 1 roll % /SomeBox mX0 y0 x1 y1 Y0 X1 Y1
+ exch % /SomeBox mX0 y0 x1 y1 Y0 Y1 X1
+ 5 -1 roll % /SomeBox mX0 y0 y1 Y0 Y1 X1 x1
+ .min % /SomeBox mX0 y0 y1 Y0 Y1 mX1
+ 5 1 roll % /SomeBox mX0 mX1 y0 y1 Y0 Y1
+ } ifelse
+
+ %% Now deal with the height
+ 2 copy % /SomeBox mX0 mX1 y0 y1 Y0 Y1 Y0 Y1
+ gt {
+ %% Media extends down
+ exch % /SomeBox mX0 mX1 y0 y1 Y1 Y0
+ 4 -1 roll % /SomeBox mX0 mX1 y1 Y1 Y0 y0
+ .min % /SomeBox mX0 mX1 y1 Y1 mY0
+ 3 1 roll % /SomeBox mX0 mX1 mY0 y1 Y1
+ .max % /SomeBox mX0 mX1 mY0 mY1
+ }{
+ %% Media extends up
+ exch % /SomeBox mX0 mX1 y0 y1 Y1 Y0
+ 4 -1 roll % /SomeBox mX0 mX1 y1 Y1 Y0 y0
+ .max % /SomeBox mX0 mX1 y1 Y1 mY0
+ 3 1 roll % /SomeBox mX0 mX1 mY0 y1 Y1
+ .min % /SomeBox mX0 mX1 mY0 mY1
+ } ifelse
+ exch % /SomeBox mX0 mX1 mY1 mY0
+ 3 1 roll % /SomeBox mX0 mY0 mX1 mY1
+ } {
+ pop
+ } ifelse
+ 4 array astore % /SomeBox [mX0 mY0 mX1 mY1]
+ } ifelse
+} bind executeonly def
+
+% This routine is used to set the PostScript /PageSize from the requested Box of the
+% PDF file. Much of this is copied from the old pdfshowpage_setpage routine which
+% is used for the PDF interpreter written in PostScript.
+%
+% Called with a dictionary containing the PDF page information.
+%
+/newpdf_set_pagesize
+{
+ % Stack: pdfpagedict
+
+ % Don't understand this at all, removed for now replace if we ever figure out
+ % what it's for.
+ % Only lock in Orientation if we need to for pdfmarks
+% .writepdfmarks { /Orientation 0 def } if
+
+ dup
+ dup newpdf_get_any_box % Stack: pdfpagedict pdfpagedict /BoxName [box]
+
+ //systemdict /PDFFitPage known {
+ NewPDF_FitPage
+ } {
+ 6 dict begin % for setpagedevice
+
+ % Set the page size.
+ 2 index /UserUnit known
+ {
+ systemdict /NoUserUnit .knownget not {//false} if
+ {
+ 2 index /UserUnit undef
+ % No scaling required, calculate PageSize as the width and height of the box
+ aload 5 1 roll % box llx lly urx ury
+ 2 index sub % box llx lly urx (ury - lly)
+ exch 3 index sub % box llx lly (ury - lly) (urx - llx)
+ exch
+ }
+ {
+ 2 index /UserUnit get
+ % The PageSize needs to be multiplied too
+ exch aload 5 1 roll % UserUnit box llx lly urx ury
+ 2 index sub exch % UserUnit box llx lly (ury - lly) urx
+ 3 index sub % UserUnit box llx lly boxheight boxwidth
+ 5 index mul % UserUnit box llx lly boxheight (Boxwidth*UserUnit)
+ exch
+ 5 index mul % UserUnit box llx lly (Boxwidth*UserUnit) (boxheight*UserUnit)
+ 4 -2 roll
+ 5 index mul exch % UserUnit box (Boxwidth*UserUnit) (boxheight*UserUnit) (lly*UserUnit) llx
+ 5 index mul exch % UserUnit box (Boxwidth*UserUnit) (boxheight*UserUnit) (llx*UserUnit) (lly*UserUnit)
+ 4 2 roll % UserUnit box (llx*UserUnit) (lly*UserUnit) (Boxwidth*UserUnit) (boxheight*UserUnit)
+ 6 -1 roll pop % box (llx*UserUnit) (lly*UserUnit) (Boxwidth*UserUnit) (boxheight*UserUnit)
+ } ifelse
+ }
+ {
+ /PassUserUnit /GetDeviceParam .special_op {
+ exch pop {
+ [ /UserUnit 1 .pdfputparams pop pop
+ } if
+ }if
+ % No scaling required, calculate PageSize as the width and height of the box
+ aload 5 1 roll % box llx lly urx ury
+ 2 index sub % box llx lly urx (ury - lly)
+ exch 3 index sub % box llx lly (ury - lly) (urx - llx)
+ exch
+ } ifelse
+
+ % handle page rotation here
+ 6 index /Rotate known {
+ % PDF page rotation runs clockwise and must be a multiple of 90, unlike PostScript.....
+ % convert Rotate into a quadrant number
+ 6 index /Rotate get 90 div cvi
+ % Make sure quadrant is 0-3
+ dup 0 lt {
+ % Negative rotation... Turn it into a positive rotation
+ % Again, limit the quadrant to -0 to -3
+ dup -4 lt {4 mod} if
+ % Adding 360 degrees results in the same positive rotation
+ 4 add
+ } if
+ dup 3 gt {4 mod} if
+ dup 0 eq
+ {
+ pop
+ 2 array astore /PageSize exch def
+ currentdict end setpagedevice
+ neg exch neg exch
+ translate
+ }
+ {
+ dup 1 eq
+ {
+ pop
+ exch 4 2 roll exch 4 2 roll
+ 2 array astore dup /PageSize exch def
+ currentdict end setpagedevice
+ 270 rotate
+ 1 get add neg exch neg
+ translate
+ }
+ {
+ 2 eq
+ {
+ 2 array astore dup /PageSize exch def
+ currentdict end setpagedevice
+ 180 rotate
+ aload pop 3 -1 roll add neg 3 1 roll add neg exch
+ translate
+ }
+ {
+ exch 4 2 roll exch 4 2 roll
+ 2 array astore dup /PageSize exch def
+ currentdict end setpagedevice
+ 90 rotate
+ 0 get 3 -1 roll add
+ neg exch neg exch
+ translate
+ } ifelse
+ } ifelse
+ } ifelse
+ }
+ {
+ 2 array astore /PageSize exch def
+ currentdict end setpagedevice
+ neg exch neg exch
+ translate
+ }ifelse
+
+ % scale the co-ordinate system by the UserUnit
+ % We have to do this after setting the PageSize, because
+ % setpagedevice does an implicit initgraphics, resetting the CTM.
+ %
+ //systemdict /NoUserUnit .knownget not { //false } if not
+ {
+ 2 index /UserUnit known {
+ 2 index /UserUnit get
+ dup scale
+ } if
+ } if
+ } ifelse
+
+ pop % The box
+
+ % If we are using the MediaBox (and only the MediaBox) then we
+ % want to clip to the CropBox, if there s one present
+
+ /MediaBox eq {
+ dup /CropBox known {
+ /CropBox get
+ aload pop 2 index sub exch 3 index sub exch rectclip
+ } {
+ pop
+ } ifelse
+ } if
+
+ pop
+} bind executeonly def
+
+% This routine checks a list of known/implemented command line switches to see if they
+% have been defined in the PostScript environment. If they have we construct a dictionary
+% containing the names and their values, and return it. That dictionary can then be
+% passed to a custom PostScript operator and used to configure the PDF interpreter.
+%
+% NB device parameters will already have been sent to the device and used to configure it
+% so here we should only handle parameters which control the behaviour of the interpreter.
+%
+/newpdf_gather_parameters
+{
+ 10 dict begin
+ /PDFSwitches [ /PDFPassword /PDFDEBUG /PDFSTOPONERROR /PDFSTOPONWARNING /NOTRANSPARENCY /FirstPage /LastPage
+ /NOCIDFALLBACK /NO_PDFMARK_OUTLINES /NO_PDFMARK_DESTS /PDFFitPage /Printed
+ /UseBleedBox /UseCropBox /UseArtBox /UseTrimBox /ShowAcroForm /ShowAnnots /PreserveAnnots
+ /NoUserUnit /RENDERTTNOTDEF /DOPDFMARKS /PDFINFO /SHOWANNOTTYPES /PRESERVEANNOTTYPES] def
+
+ 0 1 PDFSwitches length 1 sub {
+ PDFSwitches exch get dup where {
+ exch dup 3 1 roll get def
+ }
+ {
+ pop
+ } ifelse
+ } for
+ currentdict /PDFSwitches undef
+ currentdict end
+} bind executeonly def
+
+/newpdf_pagecount
+{
+ PDFFile //null eq not
+ {
+ PDFFile {.PDFInfo} stopped not
+ {
+ dup /NumPages known
+ {
+ /NumPages get
+ }
+ {
+ pop 0
+ } ifelse
+ }
+ {
+ pop 0
+ } ifelse
+ }
+ {
+ 0
+ } ifelse
+}bind def
+
+/newpdf_runpdfpagerange
+{
+ /PageList where {
+ pop PageList
+ (even) anchorsearch {
+ pop length 0 gt {
+ /runpdfpagerange cvx /syntaxerror signalerror
+ } if
+ /PDFPageList pdfpagecount 1 add array def
+ 2 2 pdfpagecount {
+ PDFPageList exch 1 put
+ } for
+ QUIET not {
+ (Processing even-numbered pages\n) print (1 through ) print pdfpagecount =only
+ (.) = flush
+ } if
+ } {
+ (odd) anchorsearch {
+ pop length 0 gt {
+ /runpdfpagerange cvx /syntaxerror signalerror
+ } if
+ /PDFPageList pdfpagecount 1 add array def
+ 1 2 pdfpagecount {
+ PDFPageList exch 1 put
+ } for
+ QUIET not {
+ (Processing odd-numbered pages\n) print (1 through ) print pdfpagecount =only
+ (.) = flush
+ } if
+ } {
+ %% validate string contents, check for digit comma or minus
+ dup
+ {
+ dup 44 eq not {
+ dup 45 eq not {
+ dup 48 lt 1 index 57 gt or {
+ /runpdfpagerange cvx /syntaxerror signalerror
+ } if
+ } if
+ } if
+ pop
+ }
+ forall
+ /PDFPageList pdfpagecount 1 add array def
+ {
+ (,) search {
+ %% We now have (post) (,) (pre)
+ exch pop %% get rid of the (,), leave the (post) as the string for the next iteration, deal with the section up to the comma
+ (-) search {
+ %% Now we have (end) (-) (start)
+ exch pop %% get rid of the minus (end) (start)
+ 0 exch {48 sub exch 10 mul add} forall
+ %% Make sure the start of the range is inside the number of available pages
+ dup pdfpagecount le {
+ exch
+ %% deal with a trailing '-' by replacing it with the number of pages in the file
+ dup length 0 eq {
+ pop pdfpagecount
+ }{
+ 0 exch {48 sub exch 10 mul add} forall
+ } ifelse
+ 1 exch %% start 1 end
+ %% Make sure the end of the range is inside the number of available pages
+ dup pdfpagecount gt {pop pdfpagecount} if
+ {PDFPageList exch 1 put} for
+ } {
+ %% start of range invalid, drop this range.
+ pop pop
+ }ifelse
+ }{
+ %% no minus signs, must be a simple page number
+ 0 exch {48 sub exch 10 mul add} forall
+ %% ensure its in the valid range of pages
+ dup pdfpagecount le {
+ PDFPageList exch 1 put
+ } {
+ pop
+ } ifelse
+ } ifelse
+ }{
+ %% no commas separating pages, just the original string (), deal with its as a section, then exit the loop
+ (-) search {
+ %% Now we have (end) (-) (start)
+ exch pop %% get rid of the minus (end) (start)
+ 0 exch {48 sub exch 10 mul add} forall
+ %% Make sure the start of the range is inside the number of available pages
+ dup pdfpagecount le {
+ exch
+ %% deal with a trailing '-' by replacing it with the number of pages in the file
+ dup length 0 eq {
+ pop pdfpagecount
+ }{
+ 0 exch {48 sub exch 10 mul add} forall
+ } ifelse
+ 1 exch %% start 1 end
+ %% Make sure the end of the range is inside the number of available pages
+ dup pdfpagecount gt {pop pdfpagecount} if
+ {PDFPageList exch 1 put} for
+ } {
+ %% start of range invalid, drop this range.
+ pop pop
+ }ifelse
+ }{
+ %% no minus signs, must be a simple page number
+ 0 exch {48 sub exch 10 mul add} forall
+ %% ensure its in the valid range of pages
+ dup pdfpagecount le {
+ PDFPageList exch 1 put
+ } {
+ pop
+ } ifelse
+ } ifelse
+ exit %% done all the sections.
+ } ifelse
+ } loop
+ QUIET not {
+ (Processing pages ) print PageList =only
+ (.) = flush
+ } if
+ } ifelse
+ } ifelse
+ 1 pdfpagecount
+ }{
+ /FirstPage where {
+ pop FirstPage dup pdfpagecount gt {
+ (\nRequested FirstPage is greater than the number of pages in the file: ) print
+ pdfpagecount = flush
+ } if
+ } {
+ 1
+ } ifelse
+ /LastPage where {pop LastPage pdfpagecount .min } { pdfpagecount } ifelse
+ 1 index 1 index gt {
+ ( No pages will be processed \(FirstPage > LastPage\).) = flush
+ } {
+ QUIET not {
+ (Processing pages ) print 1 index =only ( through ) print dup =only
+ (.) = flush
+ } if
+ } ifelse
+ } ifelse
+} bind def
+
+% <file> runpdf -
+/newpdf_runpdf
+{
+ runpdfbegin % <file> runpdfbegin -
+ PDFInfo /Collection known
+ {
+ PDFInfo /Collection get
+ pdfclose
+ dup length 1 sub 0 2 3 -1 roll
+ {
+ 1 index exch get (r) file runpdf
+ } for
+ pop
+ }
+ {
+ process_trailer_attrs % - process_trailer_attrs -
+ runpdfpagerange % - runpdfpagerange <int> <int>
+ dopdfpages % <int> <int> dopdfpages -
+ runpdfend % - runpdfend -
+ } ifelse
+} bind def
+
+/newpdf_runpdfbegin
+{
+ /pdfdict 10 dict def
+ pdfdict begin
+
+ % This is for the benefit of pdf2dsc which assumes it will be present
+ /Trailer << >> def
+ /PDFSave save def
+ % Define these in the current dictionary, if anyone uses
+ % systemdict then this will be defeated so we'll add extra
+ % code to the systemdict definitions as well.
+ /pdfpagecount /newpdf_pagecount load def
+ /pdfgetpage /newpdf_pdfgetpage load def
+ /pdfshowpage /newpdf_pdfshowpage load def
+ /pdfshowpage_init /newpdf_pdfshowpage_init load def
+ /pdfshowpage_setpage /newpdf_pdfshowpage_setpage load def
+ /pdfshowpage_finish /newpdf_pdfshowpage_finish load def
+ /pdfopen /newpdf_pdfopen load def
+ /pdfclose /newpdf_pdfclose load def
+ /dopdfpages /newpdf_dopdfpages load def
+ /runpdfend /newpdf_runpdfend load def
+ /runpdfpagerange /newpdf_runpdfpagerange load def
+ /process_trailer_attrs /newpdf_process_trailer_attrs load def
+
+ % These are also for the benefit of pdf2dsc, which assumes they
+ % are available.
+ /knownoget {2 copy known {get //true}{pop //false}ifelse} bind def
+ /pget {2 copy known {get //true}{pop //false}ifelse}bind def
+
+ newpdf_gather_parameters
+ {.PDFInit} stopped
+ {
+ /PDFFile //null def
+ /PDFInfo //null def
+ }
+ {
+ /PDFFile exch def
+ pdfopen
+ /PDFInfo exch def
+ pop
+ }ifelse
+} bind def
+
+/newpdf_pdfgetpage
+{
+ PDFFile exch 1 sub {.PDFPageInfo} stopped
+ {
+ pop pop
+ ( **** Error: Couldn't get page info.\n) newpdf_pdfformaterror
+ ( Output may be incorrect.\n) newpdf_pdfformaterror
+ //null
+ } if
+} bind def
+
+/newpdf_process_trailer_attrs
+{
+}bind def
+
+/newpdf_pdfshowpage_init
+{
+ gsave
+} bind def
+
+/newpdf_pdfshowpage_setpage
+{
+ dup newpdf_device_setup
+ dup newpdf_set_pagesize
+} bind def
+
+/newpdf_pdfshowpage_finish
+{
+ /Page# get PDFFile exch 1 sub {.PDFDrawPage} stopped
+ {
+ pop pop
+ ( **** Error: Page drawing error occured.\n) newpdf_pdfformaterror
+ ( Output may be incorrect.\n) newpdf_pdfformaterror
+ } if
+ showpage
+ grestore
+} bind def
+
+/newpdf_pdfshowpage
+{
+ pdfshowpage_init
+ pdfshowpage_setpage
+ pdfshowpage_finish
+} bind def
+
+/newpdf_runpdfend
+{
+ pdfclose
+ PDFSave restore
+ end % pdfdict
+} bind def
+
+/newpdf_pdfopen
+{
+ dup PDFFile //null ne
+ {
+ PDFFile {.PDFStream} stopped
+ {
+ pop pop
+ ( **** Error: Couldn't initialise file.\n) newpdf_pdfformaterror
+ ( Output may be incorrect.\n) newpdf_pdfformaterror
+ <</NumPages 0>>
+ }
+ {
+ PDFFile {.PDFInfo} stopped
+ {
+ pop
+ ( **** Error: Couldn't get page information.\n) newpdf_pdfformaterror
+ ( Output may be incorrect.\n) newpdf_pdfformaterror
+ <</NumPages 0>>
+ } if
+ } ifelse
+ }
+ {
+ pop
+ <</NumPages 0>>
+ } ifelse
+} bind def
+
+/newpdf_pdfclose
+{
+ PDFFile {.PDFClose} stopped
+ {
+ pop
+ } if
+} bind def
+
+% <int> <int> dopdfpages -
+% First Page and then LastPage
+/newpdf_dopdfpages
+{
+ //DisablePageHandlerDevice exec
+ 1 exch
+ {
+ %% If we have a array of pages to render, use it.
+ /PDFPageList where {
+ pop dup PDFPageList exch get 1 eq
+ }
+ {//true} ifelse
+
+ {
+ QUIET not { (Page ) print dup //== exec flush } if
+ dup pdfgetpage
+ dup //null ne {
+ exch 1 index
+ /Page# 3 -1 roll put
+ pdfshowpage
+ } {
+ PDFSTOPONERROR {
+ /dopdfpages cvx /syntaxerror signalerror
+ } {
+ pop pop
+ ( **** Error: page) newpdf_pdfformaterror
+ ( not found.\n) newpdf_pdfformaterror
+ } ifelse
+ } ifelse
+ }{
+ pop
+ }ifelse
+ } for
+ //EnablePageHandlerDevice exec
+} bind def
+
/.runps /run load def
/run {
dup type /filetype ne { (r) file } if
@@ -280,27 +1138,12 @@
} bind odef
currentdict /runpdfstring .undef
-/DisablePageHandlerDevice
-{
- systemdict /FirstPage known
- systemdict /LastPage known or
- systemdict /PageList known or
+/runpdfbegin { % <file> runpdfbegin -
+ /NEWPDF where {/NEWPDF get} {//true} ifelse
{
- <</DisablePageHandler //true>> setpagedevice
- } if
-} bind def
-
-/EnablePageHandlerDevice
-{
- systemdict /FirstPage known
- systemdict /LastPage known or
- systemdict /PageList known or
+ newpdf_runpdfbegin
+ }
{
- <</DisablePageHandler //false>> setpagedevice
- } if
-} bind def
-
-/runpdfbegin { % <file> runpdfbegin -
userdict begin
% It turns out that the PDF interpreter uses memory more
% effectively if it is run under at least one level of save.
@@ -335,10 +1178,16 @@
//pdfdict begin
pdfopen begin
/CumulativePageCount currentpagedevice /PageCount get def
+ } ifelse
} bind executeonly def
-/runpdfpagerange { % - runpdfpagerange <firstpage#> <lastpage#>
+/runpdfpagerange { % - runpdfpagerange <firstpage#> <lastpage#>
+ /NEWPDF where {/NEWPDF get} {//true} ifelse
+ {
+ newpdf_runpdfpagerange
+ }
+ {
/PortfolioPage where {
pop
PortfolioPage cvi dup pdfpagecount add % a b+1
@@ -382,7 +1231,7 @@
pop PageList
(even) anchorsearch {
pop length 0 gt {
- /runpdfpagerange /syntaxerror cvx signalerror
+ /runpdfpagerange cvx /syntaxerror signalerror
} if
/PDFPageList pdfpagecount 1 add array def
2 2 pdfpagecount {
@@ -395,7 +1244,7 @@
} {
(odd) anchorsearch {
pop length 0 gt {
- /runpdfpagerange /syntaxerror cvx signalerror
+ /runpdfpagerange cvx /syntaxerror signalerror
} if
/PDFPageList pdfpagecount 1 add array def
1 2 pdfpagecount {
@@ -412,7 +1261,7 @@
dup 44 eq not {
dup 45 eq not {
dup 48 lt 1 index 57 gt or {
- /runpdfpagerange /syntaxerror cvx signalerror
+ /runpdfpagerange cvx /syntaxerror signalerror
} if
} if
} if
@@ -518,12 +1367,18 @@
} ifelse
} ifelse
}ifelse
+ }ifelse
} bind executeonly def
/dopdfpages { % firstpage# lastpage# dopdfpages -
- << /PDFScanRules //true >> setuserparams % set scanning rules for PDF vs. PS
+ /NEWPDF where {/NEWPDF get} {//true} ifelse
+ {
+ newpdf_dopdfpages
+ }
+ {
+ << /PDFScanRules //true >> setuserparams % set scanning rules for PDF vs. PS
<< /RenderTTNotdef systemdict
- /RENDERTTNOTDEF get >> setuserparams % Should we render TT /.notdef
+ /RENDERTTNOTDEF get >> setuserparams % Should we render TT /.notdef
1 exch
{
%% If we have a array of pages to render, use it.
@@ -554,10 +1409,16 @@
% Indicate that the number of spot colors is unknown in case the next page
% imaged is a PS file.
currentpagedevice /PageSpotColors known { << /PageSpotColors -1 >> setpagedevice } if
- << /PDFScanRules //null >> setuserparams % restore scanning rules for PS
+ << /PDFScanRules //null >> setuserparams % restore scanning rules for PS
+ } ifelse
} bind executeonly def
/runpdfend {
+ /NEWPDF where {/NEWPDF get} {//true} ifelse
+ {
+ newpdf_runpdfend
+ }
+ {
RepairedAnError
{
printrepairederror
@@ -565,13 +1426,14 @@
Repaired { printrepaired } if
} ifelse
currentdict pdfclose
- end % temporary dict
- end % pdfdict
- end % GS_PDF_ProcSet
+ end % temporary dict
+ end % pdfdict
+ end % GS_PDF_ProcSet
PDFTopSave restore
- end % userdict
- 2 vmreclaim % couldn't hurt
+ end % userdict
+ 2 vmreclaim % couldn't hurt
//EnablePageHandlerDevice exec
+ } ifelse
} bind executeonly def
currentdict /DisablePageHandlerDevice undef
@@ -657,52 +1519,55 @@
} if
} bind executeonly def
-/runpdf { % <file> runpdf -
- %% Get the PDF filename (it *must* be a file even if it came from stdin it gets
- %% copied to a temporary file) and store it in pdfdict. We will use this for
- %% hashing fonts to detect if fonts with the same name are from different files.
- %%
- dup currentglobal exch //true setglobal .getfilename exch setglobal /InputPDFFileName exch //pdfdict 3 1 roll .forceput
-
- //runpdfbegin exec
- //pdf_collection_files exec
- dup mark eq {
- pop
- process_trailer_attrs
- //runpdfpagerange exec
- //dopdfpages exec
- //runpdfend exec
- } {
- //runpdfend exec
- ]
- (1 ) 10 string copy exch
- {
- dup type /filetype eq {
- //runpdfbegin exec
- dup /PortfolioPage exch def
- process_trailer_attrs
- //runpdfpagerange exec
- //dopdfpages exec
- //runpdfend exec
- closefile
- } {
- .namestring dup (r) file
- //runpdfbegin exec
- /PortfolioPage 2 index def
- process_trailer_attrs
- //runpdfpagerange exec
- //dopdfpages exec
- //runpdfend exec
- deletefile
- } ifelse
- } forall
- pop
+/runpdf { % <file> runpdf -
+ /NEWPDF where {/NEWPDF get} {//true} ifelse
+ {newpdf_runpdf}
+ {
+ %% Get the PDF filename (it *must* be a file even if it came from stdin it gets
+ %% copied to a temporary file) and store it in pdfdict. We will use this for
+ %% hashing fonts to detect if fonts with the same name are from different files.
+ %%
+ dup currentglobal exch //true setglobal .getfilename exch setglobal /InputPDFFileName exch //pdfdict 3 1 roll .forceput
+ //runpdfbegin exec
+ //pdf_collection_files exec
+ dup mark eq {
+ pop
+ process_trailer_attrs
+ //runpdfpagerange exec
+ //dopdfpages exec
+ //runpdfend exec
+ } {
+ //runpdfend exec
+ ]
+ (1 ) 10 string copy exch
+ {
+ dup type /filetype eq {
+ //runpdfbegin exec
+ dup /PortfolioPage exch def
+ process_trailer_attrs
+ //runpdfpagerange exec
+ //dopdfpages exec
+ //runpdfend exec
+ closefile
+ } {
+ .namestring dup (r) file
+ //runpdfbegin exec
+ /PortfolioPage 2 index def
+ process_trailer_attrs
+ //runpdfpagerange exec
+ //dopdfpages exec
+ //runpdfend exec
+ deletefile
+ } ifelse
+ } forall
+ pop
+ } ifelse
} ifelse
} bind executeonly odef
currentdict /pdf_collection_files .undef
-end % systemdict
+end % systemdict
% Redefine the procedure that the C code uses for running piped input.
% It is OK to use { (%stdin) run } here, because a startjob cannot occur.
/.runstdin {
@@ -709,7 +1574,7 @@
{ (%stdin) run } execute0
} bind executeonly def
-end % userdict
+end % userdict
pdfdict begin
% ======================== File parsing ======================== %
@@ -731,11 +1596,11 @@
/dictlevelcount dictlevelcount 1 sub def
dictlevelcount 0 eq { exit } if
} bind executeonly
- ([) cvn { mark } bind executeonly % ditto
+ ([) cvn { mark } bind executeonly % ditto
(]) cvn dup load
-% /true true % see .pdfexectoken in pdf_base.ps
-% /false false % ibid.
-% /null null % ibid.
+% /true true % see .pdfexectoken in pdf_base.ps
+% /false false % ibid.
+% /null null % ibid.
/R {
1 index type /integertype eq 1 index type /integertype eq and {
/resolveR cvx 3 packedarray cvx
@@ -743,7 +1608,7 @@
( **** Error: indirect object reference \(R\) encountered with invalid arguments.) pdfformaterror
( Output may be incorrect.\n) pdfformaterror
} ifelse
- } bind executeonly % see Objects below
+ } bind executeonly % see Objects below
.dicttomark readonly def
% After reading entry count: skip whitespace, exit on a digit
@@ -783,9 +1648,9 @@
% Read original version (pre PDF 1.5) of the xref table.
% Note: The position is the location of 'xref'. The current PDFfile
% position is just after the 'XREF'.
-/readorigxref % <pos> readorigxref <trailerdict>
+/readorigxref % <pos> readorigxref <trailerdict>
{
- pop % We do not need the position.
+ pop % We do not need the position.
% First we search this (and any Previous) trailers, looking for
% the /Size of the xref. We use ths to initialise our storage
@@ -825,9 +1690,9 @@
% Initialise the objects with the detected Size.
TrailerSize growPDFobjects
PDFfile exch setfileposition
- 0 % Initialize xref table error counter
+ 0 % Initialize xref table error counter
//false % Have we seen at least one section entry in this xref ? Bug #694342
- { PDFfile token pop % first object # or trailer
+ { PDFfile token pop % first object # or trailer
dup /trailer eq {
%% check to see if we have seen at least an empty section for this xref
pop {exit}
@@ -841,7 +1706,7 @@
%% remove the boolean telling us if we have a section or not, leaving the first object number
exch pop
} ifelse
- PDFfile token pop % entry count
+ PDFfile token pop % entry count
% remaining must be whitespace only (otherwise this xref Size was invalid.
{ PDFfile (0) .peekstring not { pop exit } if
@@ -864,7 +1729,7 @@
PDFSTOPONERROR not {
(**** Warning: Discovered more entries in xref than declared in trailer /Size\n) pdfformatwarning
} {
- /readorigxref cvx /rangecheckerror signalerror
+ /readorigxref cvx /rangecheck signalerror
} ifelse
} if
% We now know that the /Size was wrong. We could read the whole table
@@ -875,13 +1740,13 @@
1 index 65534 add dup /TrailerSize exch def
growPDFobjects
} if
- { % stack: <err count> <obj num>
+ { % stack: <err count> <obj num>
% Read xref line
PDFfile 20 string readstring pop % always read 20 chars.
- token pop % object position
- exch token pop % generation #
- exch token pop % n or f
- exch % stack: <err count> <obj#> <loc> <gen#> <tag> <remainder of line>
+ token pop % object position
+ exch token pop % generation #
+ exch token pop % n or f
+ exch % stack: <err count> <obj#> <loc> <gen#> <tag> <remainder of line>
% check to make sure trailing garbage is just white space
//false 1 index { 32 gt or } forall {
6 -1 roll 1 add 6 1 roll % bump error count on garbage
@@ -895,20 +1760,20 @@
length
PDFfile fileposition exch sub PDFfile exch setfileposition
} if
- pop % Stack: <err count> <obj#> <loc> <gen#> <tag>
- dup /n eq { % xref line tag is /n
- pop % pop dup of line tag
+ pop % Stack: <err count> <obj#> <loc> <gen#> <tag>
+ dup /n eq { % xref line tag is /n
+ pop % pop dup of line tag
1 index 0 eq {
( **** Warning: considering '0000000000 XXXXX n' as a free entry.\n)
pdfformatwarning
} {
- 0 3 1 roll % Set ObjectStream object number = 0
- //false setxrefentry % Save xref entry, don't change existing entries
- 3 -1 roll pop % Remove ObjectStream object onumber
+ 0 3 1 roll % Set ObjectStream object number = 0
+ //false setxrefentry % Save xref entry, don't change existing entries
+ 3 -1 roll pop % Remove ObjectStream object onumber
} ifelse
}
- { % xref line tag was not /n
- /f ne % verify that the tag was /f
+ { % xref line tag was not /n
+ /f ne % verify that the tag was /f
{ /setxrefentry cvx /syntaxerror signalerror
} {
% Bug #703214 has a invalid initial xref table. The table entries are correct
@@ -930,11 +1795,11 @@
}if
}ifelse
} ifelse
- pop pop % pop <obj location> and <gen num>
+ pop pop % pop <obj location> and <gen num>
% stack: <err count> <obj num>
- 1 add % increment object number
+ 1 add % increment object number
} repeat
- pop % pop <obj #>
+ pop % pop <obj #>
//true % We have seen at least one entry in an xref section Bug #694342
} loop
0 ne {
@@ -952,50 +1817,50 @@
(<<) cvn { /dictlevelcount dictlevelcount 1 add def mark } bind executeonly
(>>) cvn { .dicttomark /dictlevelcount dictlevelcount 1 sub def
dictlevelcount 0 eq { exit} if } bind executeonly
- ([) cvn { mark } bind executeonly % ditto
+ ([) cvn { mark } bind executeonly % ditto
(]) cvn dup load
-% /true true % see .pdfexectoken in pdf_base.ps
-% /false false % ibid.
-% /null null % ibid.
- /R { /resolveR cvx 3 packedarray cvx } bind executeonly % see Objects below
+% /true true % see .pdfexectoken in pdf_base.ps
+% /false false % ibid.
+% /null null % ibid.
+ /R { /resolveR cvx 3 packedarray cvx } bind executeonly % see Objects below
.dicttomark readonly def
% Get a variable length positive integer value from a stream. A value
% of zero is returned if the count is zero.
-/getintn { % <stream> <count> getintn int
+/getintn { % <stream> <count> getintn int
0 exch { 256 mul 1 index read pop add } repeat
- exch pop % Discard stream
+ exch pop % Discard stream
} bind executeonly def
% This array contains handlers for processing the different types of
% entries in the XRef stream.
% Stack: <Xrefdict> <xref stream> <Index array> <pair loc> <obj num>
-% <field 2> <field 3>
+% <field 2> <field 3>
% The handlers leave the stack unchanged.
/xref15entryhandlers [
- { % XRef entry type 0 - free or f type xref entry
+ { % XRef entry type 0 - free or f type xref entry
% (free ) print
% (obj num: ) print 2 index pdfstring cvs print ( ) print
% (loc: ) print 1 index pdfstring cvs print ( ) print
% (gen: ) print dup === flush
- } bind executeonly % Do nothing for free xref entries
+ } bind executeonly % Do nothing for free xref entries
% XRef entry type 1 - normal or n type xref entry
- { % field 2 = obj loc, field 3 = gen num
+ { % field 2 = obj loc, field 3 = gen num
% (normal ) print
% (obj num: ) print 2 index pdfstring cvs print ( ) print
% (loc: ) print 1 index pdfstring cvs print ( ) print
% (gen: ) print dup === flush
- 0 3 1 roll % set stream number = 0
+ 0 3 1 roll % set stream number = 0
//false setxrefentry
- 3 -1 roll pop % remove stream number
+ 3 -1 roll pop % remove stream number
} bind executeonly
% XRef entry type 2 - compressed object type xref entry
- { % field 2 = object stream num, field 3 = index into object stream
+ { % field 2 = object stream num, field 3 = index into object stream
% (Compressed objects: ) print
% (obj num: ) print 2 index pdfstring cvs print ( ) print
% (field 2: ) print 1 index pdfstring cvs print ( ) print
% (field 3: ) print dup === flush
- 0 //false setxrefentry pop % set generation number = 0
+ 0 //false setxrefentry pop % set generation number = 0
} bind executeonly
] def
@@ -1002,10 +1867,10 @@
% Read the PDF 1.5 version of the xref table.
% Note: The position is the location of the start of the dictionary object
% In PDF 1.5, the XRef dictionary also serves as the trailer dictionary
-/readpdf15xref % <pos> readpdf15xref <trailerdict>
+/readpdf15xref % <pos> readpdf15xref <trailerdict>
{
/Classic-xref //false store
- PDFfile exch setfileposition % move to start of object
+ PDFfile exch setfileposition % move to start of object
% Get object number, revision, and 'obj' and discard
//false PDFfile token {
type /integertype eq {
@@ -1043,7 +1908,7 @@
} if
growPDFobjects
% Create a stream for the XRef data
- PDFfile token pop pop % Skip over 'stream'
+ PDFfile token pop pop % Skip over 'stream'
dup stream //false resolvestream
% Stack: <XRefdict> <xref stream>
% The Index array defines the ranges of object numbers in the
@@ -1050,20 +1915,20 @@
% XRef stream. Each value pair is consists of starting object
% number and the count of consecutive objects.
% Get the Index array, if present
- 1 index /Index .knownget not { % If no Index array ...
- [ 0 3 index /Size get ] % Default = [ 0 Size ]
+ 1 index /Index .knownget not { % If no Index array ...
+ [ 0 3 index /Size get ] % Default = [ 0 Size ]
} if
% Loop through the Index array
0 2 2 index length 1 sub {
% Get start and end of object range
- 2 copy get % Start of the range
- dup 3 index 3 index 1 add get % Number of entries in range
+ 2 copy get % Start of the range
+ dup 3 index 3 index 1 add get % Number of entries in range
% Loop through the range of object numbers
- add 1 sub 1 exch { % Form end of range, set increment = 1
+ add 1 sub 1 exch { % Form end of range, set increment = 1
% Stack: <Xrefdict> <xref stream> <Index array> <pair loc> <obj num>
% Get xref parameters. Note: The number of bytes for each parameter
% is defined by the entries in the W array.
- 4 index /W get aload pop % Get W array values
+ 4 index /W get aload pop % Get W array values
% The first field indicates type of entry. Get first field value.
% If the num. of bytes for field 1 is 0 then default field value is 1
3 -1 roll dup 0 eq { pop 1 } { 6 index exch getintn } ifelse
@@ -1070,20 +1935,20 @@
% Get the handler for the xref entry type. We will execute the
% handler after we get the other two field values.
xref15entryhandlers exch get
- 3 -1 roll 6 index exch getintn % Get second field
- 3 -1 roll 6 index exch getintn % Get third field
- 3 -1 roll exec % Execute Xref entry handler
- pop pop pop % Remove field values and obj num
- } for % Loop through Xref entries
- pop % Remove Index array pair loc
- } for % Loop through Index array entries
- pop pop % Remove Index array and xref stream
+ 3 -1 roll 6 index exch getintn % Get second field
+ 3 -1 roll 6 index exch getintn % Get third field
+ 3 -1 roll exec % Execute Xref entry handler
+ pop pop pop % Remove field values and obj num
+ } for % Loop through Xref entries
+ pop % Remove Index array pair loc
+ } for % Loop through Index array entries
+ pop pop % Remove Index array and xref stream
} bind executeonly def
% Read the cross-reference table.
% <pos> is the position either from the startxref statement or the /Prev
% entry in the prior trailer dictionary.
-/readxref % <pos> readxref <trailerdict>
+/readxref % <pos> readxref <trailerdict>
{
PDFoffset add PDFfile exch
% Check that the given location is within the file.
@@ -1098,7 +1963,7 @@
{
PDFfile fileposition PDFfile read pop 32 gt { exit } if pop
} loop
- dup % Make copy of the file position (before last char was read).
+ dup % Make copy of the file position (before last char was read).
PDFfile exch setfileposition
% The PDF specification says that the 'xref' must be on a line
% by itself. The code here formerly used readline and linene to
@@ -1108,7 +1973,7 @@
PDFfile pdfstring 0 4 getinterval readstring pop
(xref) eq
{
- readorigxref % 'xref' -> original xref table
+ readorigxref % 'xref' -> original xref table
% if hybrid-reference PDF, also fetch the entries
% found in the XRef stream pointed by /XRefStm
dup /XRefStm knownoget {
@@ -1130,12 +1995,17 @@
}ifelse
} if
}
- { readpdf15xref } % otherwise assume PDF 1.5 xref stream
+ { readpdf15xref } % otherwise assume PDF 1.5 xref stream
ifelse
} bind executeonly def
% Open a PDF file and read the header, trailer, and cross-reference.
-/pdfopen { % <file> pdfopen <dict>
+/pdfopen { % <file> pdfopen <dict>
+ /NEWPDF where {/NEWPDF get} {//true} ifelse
+ {
+ newpdf_pdfopen
+ }
+ {
% Color space substitution in PDF is handled somewhat differently
% than in PostScript. A given device color space will be substituted
% if the corresponding "Default..." entry exists in the Page's
@@ -1151,7 +2021,7 @@
% respectively. This is not done if UseCIEColor is true by default,
% as in that case color substitution is presumably desired even
% if the file does not request it.
- currentpagedevice /UseCIEColor .knownget dup { pop } if not
+ currentpagedevice /UseCIEColor .knownget dup { pop } if not
{ .currentglobal //false .setglobal
/DefaultGray { /DeviceGray } cvlit /ColorSpace defineresource pop
/DefaultRGB { /DeviceRGB } cvlit /ColorSpace defineresource pop
@@ -1158,10 +2028,11 @@
/DefaultCMYK { /DeviceCMYK } cvlit /ColorSpace defineresource pop
.setglobal
}
- if
- pdfopenfile begin
- pdfopencache
- currentdict end
+ if
+ pdfopenfile begin
+ pdfopencache
+ currentdict end
+ } ifelse
} bind executeonly def
/process_trailer_attrs { % - process_trailer_attrs -
@@ -1396,38 +2267,38 @@
% Verify that each entry in the xref table is pointing at an object with
% the correct object number and generation number.
-/verify_xref % - verify_xref -
+/verify_xref % - verify_xref -
{ PDFfilelen
- 1 1 Objects length 1 sub % stack: filesize 1 1 <number of objects - 1>
- { % Check if the object is free (i.e. not used). The values in
+ 1 1 Objects length 1 sub % stack: filesize 1 1 <number of objects - 1>
+ { % Check if the object is free (i.e. not used). The values in
% Generations is the generation number plus 1. If the value in
% Generations is zero then the object is free.
% Stack: <filesize> <obj num>
- Generations 1 index get % Get the genration number
- 0 ne { % Skip if object number is free
- ObjectStream 1 index get % Check if object is in objectstream
- 0 eq { % We only check objects not in an objectstream
- { % Use stop context since we may get an error if object is invalid
- dup Objects exch get % Get the object location
- PDFoffset add dup 3 index ge % Compare object location to file size
- { pop //true } % Rebuild if location not in file
+ Generations 1 index get % Get the genration number
+ 0 ne { % Skip if object number is free
+ ObjectStream 1 index get % Check if object is in objectstream
+ 0 eq { % We only check objects not in an objectstream
+ { % Use stop context since we may get an error if object is invalid
+ dup Objects exch get % Get the object location
+ PDFoffset add dup 3 index ge % Compare object location to file size
+ { pop //true } % Rebuild if location not in file
{ PDFfile exch setfileposition % Go to the object location
- //true % Stack: <filesize> <obj num> <true>
- PDFfile token pop % Read object number from file
- 2 index eq { % Verify object number
- PDFfile token pop % Read generation number from file
- Generations 3 index % Get specified generaton number
- get 1 sub % Gen numbs are stored with 1 added.
- eq { % Verify generation number
+ //true % Stack: <filesize> <obj num> <true>
+ PDFfile token pop % Read object number from file
+ 2 index eq { % Verify object number
+ PDFfile token pop % Read generation number from file
+ Generations 3 index % Get specified generaton number
+ get 1 sub % Gen numbs are stored with 1 added.
+ eq { % Verify generation number
PDFfile token pop
/obj eq { % Verify 'obj' text
- pop //false % We have valid object, do not rebuild
+ pop //false % We have valid object, do not rebuild
} if
} if
} if
} ifelse
} //.internalstopped exec
- { //true } if % If we stop then we need to rebuild
+ { //true } if % If we stop then we need to rebuild
% Stack: <filesize> <obj num> <need rebuild flag>
{
( **** Warning: File has an invalid xref entry: )
@@ -1436,20 +2307,20 @@
(. Rebuilding xref table.\n) pdfformatwarning
search_objects
exit
- } if % If the entry is invalid
+ } if % If the entry is invalid
} {
% The object is in an object stream. We currently do not rebuild
% objects in an object stream. So If we find one, then abort the
% verification of the xref table entries.
- pop exit % Pop object number and then exit loop
- } ifelse % If not in an object stream
- } if % If object entry is not free
- pop % Remove object number
+ pop exit % Pop object number and then exit loop
+ } ifelse % If not in an object stream
+ } if % If object entry is not free
+ pop % Remove object number
} for
- pop % Remove the size of the file
+ pop % Remove the size of the file
} bind odef
-/pdfopencache { % - pdfopencache -
+/pdfopencache { % - pdfopencache -
% Create and initialize some caches.
/PageCount pdfpagecount def
/PageNumbers PageCount 65534 .min dict def
@@ -1456,11 +2327,11 @@
/PageIndex PageCount 65534 .min array def
} bind executeonly def
-/pdfopenfile { % <file> pdfopenfile <dict>
- //pdfdict readonly pop % can't do it any earlier than this
+/pdfopenfile { % <file> pdfopenfile <dict>
+ //pdfdict readonly pop % can't do it any earlier than this
32 dict begin
/LocalResources 0 dict def
- /DefaultQstate //null def % establish binding
+ /DefaultQstate //null def % establish binding
/Printed where { pop } {
% Guess whether the output device is a printer.
/Printed currentpagedevice /OutputFile known def
@@ -1497,11 +2368,11 @@
% some badly formed PDF's (Visioneer) have something other than EOL
% after the version number. If we get an error, shorten the string
% and try again.
- //false exch % error encountered
+ //false exch % error encountered
{ { cvr } stopped
{ exch pop //true exch 0 1 index length 1 sub dup 0 eq
- { pop 0 exit } if % exit if string now empty
- getinterval % trim character from right end and retry
+ { pop 0 exit } if % exit if string now empty
+ getinterval % trim character from right end and retry
}
{ exch {
( **** Warning: PDF version number not followed by EOL.\n)
@@ -1516,12 +2387,12 @@
/PDFversion exch def
% Read the last cross-reference table.
count /pdfemptycount exch def
- /Trailer << >> def % Initialize to an emptry dict.
+ /Trailer << >> def % Initialize to an emptry dict.
{initPDFobjects findxref readxref}
PDFSTOPONERROR not {
//.internalstopped exec {
- recover_xref_data % Read failed. Attempt to recover xref data.
- search_trailer % Search for the primary trailer
+ recover_xref_data % Read failed. Attempt to recover xref data.
+ search_trailer % Search for the primary trailer
//false % search_trailer sets up /Trailer, so don't run the code to do that...
} {
//true
@@ -1531,7 +2402,7 @@
} ifelse
{
- /Trailer exch def % Save trailer dict after first xref table
+ /Trailer exch def % Save trailer dict after first xref table
% Read any previous cross-reference tables. When we are done,
% verify that the entries in the xref tables are valid if NoVerifyXref
% is not defined.
@@ -1538,7 +2409,7 @@
/PrevArray [] def % Empty array, we use this to detect circular /Prev entries in xref (see below)
% For some reqason, leaving this on the stack messes up seom files.
Trailer
- { /Prev knownoget not { % If no previous xref table then ...
+ { /Prev knownoget not { % If no previous xref table then ...
Classic-xref {
/NoVerifyXref where { pop } { verify_xref } ifelse
} if
@@ -1563,7 +2434,7 @@
(\n **** Error: Circular /Prev entry while reading xref.\n Aborting xref read, output may be incorrect.\n)
pdfformaterror
PDFSTOPONERROR {
- /readxref /syntaxerror cvx signalerror
+ /readxref cvx /syntaxerror signalerror
} if
pop exit %% [...] and then exit this loop
} if
@@ -1579,10 +2450,10 @@
{ readxref }
PDFSTOPONERROR not {
//.internalstopped exec {
- recover_xref_data % Read failed. Attempt to recover xref data.
+ recover_xref_data % Read failed. Attempt to recover xref data.
/PrevArray where {/PrevArray undef} if %% remove the array we were using to detect circular references
- exit % Exit loop since recover gets all obj data.
- } if % If readxref stopped
+ exit % Exit loop since recover gets all obj data.
+ } if % If readxref stopped
} {
exec
} ifelse
@@ -1598,7 +2469,7 @@
Trailer 3 1 roll put % add key if not present
} ifelse
} forall
- } loop % Loop to previous trailer
+ } loop % Loop to previous trailer
/PrevArray where {/PrevArray undef} if %% remove the array we were using to detect circular references
} if
@@ -1609,7 +2480,7 @@
<< /PDFScanUnsigned //true >> setuserparams
{ Trailer /Encrypt knownoget {
pop
- pdf_process_Encrypt % signal error
+ pdf_process_Encrypt % signal error
} if
} stopped
<< /PDFScanUnsigned //false >> setuserparams
@@ -1668,7 +2539,7 @@
% appended to the PDF file. Current record (60K) belongs to
% PDF-Out (v 2.0 - 35). We start the search from the last 1024
% bytes and continue from the beginning of the file.
-/findxref { % - findxref <xrefpos>
+/findxref { % - findxref <xrefpos>
PDFfile dup dup dup 0 setfileposition bytesavailable
dup /PDFfilelen exch def
% Find the last %%EOF string (within 1024 bytes)
@@ -1704,13 +2575,13 @@
//stdoutfile dup 3 -1 roll writestring flushfile
} bind executeonly def
-/pdfformaterror { % <string> pdfformaterror -
+/pdfformaterror { % <string> pdfformaterror -
stdoutprint
/Repaired //true store
/RepairedAnError //true store
} bind executeonly def
-/pdfformatwarning { % <string> pdfformaterror -
+/pdfformatwarning { % <string> pdfformaterror -
QUIET not {stdoutprint}{pop}ifelse
/Repaired //true store
PDFSTOPONWARNING {/warning cvx /undefined signalerror} if
@@ -1789,7 +2660,7 @@
% Write the outline structure for a file. Uses linkdest (below).
% omit links to pages that don't exist.
-/writeoutline % <outlinedict> writeoutline -
+/writeoutline % <outlinedict> writeoutline -
{ mark
0 2 index /First knownoget
{ { exch 1 add exch /Next knownoget not { exit } if } loop }
@@ -1850,7 +2721,7 @@
linkdest
} stopped
{
- cleartomark % ignore this link
+ cleartomark % ignore this link
( **** Warning: Outline has invalid link that was discarded.\n)
pdfformatwarning
} {
@@ -1869,7 +2740,7 @@
} bind executeonly def
% Close a PDF file.
-/pdfclose % <dict> pdfclose -
+/pdfclose % <dict> pdfclose -
{ begin
PDFfile closefile
end
@@ -1878,7 +2749,7 @@
% ======================== Page accessing ======================== %
% Get a (possibly inherited) attribute of a page.
-/pget % <pagedict> <key> pget <value> -true-
+/pget % <pagedict> <key> pget <value> -true-
% <pagedict> <key> pget -false-
{
2 copy knownoget
@@ -1928,10 +2799,10 @@
4 index .knownget {
0 get 5 1 roll pop pop pop pop
} {
- parent_obj_get % not found -- check it's parent.
+ parent_obj_get % not found -- check it's parent.
} ifelse
} {
- parent_obj_get % not found -- check it's parent.
+ parent_obj_get % not found -- check it's parent.
} ifelse
} {
pop pop 0
@@ -1956,7 +2827,7 @@
0 get 4 1 roll pop pop pop
}{
% Not in Page Resources, recursively try ParentResources as a last resort
- pop % page Resources
+ pop % page Resources
LocalResources parent_obj_get
}ifelse
}{
@@ -1971,7 +2842,7 @@
}bind executeonly def
% Get the value of a resource on a given page.
-/rget { % <resname> <pagedict> <restype> rget <value> -true-
+/rget { % <resname> <pagedict> <restype> rget <value> -true-
% <resname> <pagedict> <restype> rget -false-
LocalResources 1 index knownoget {
3 index knownoget
@@ -2007,7 +2878,7 @@
} bind executeonly def
% Get the total number of pages in the document.
-/pdfpagecount % - pdfpagecount <int>
+/pdfpagecount % - pdfpagecount <int>
{
Trailer /Root knownoget {
/Pages knownoget {
@@ -2023,7 +2894,7 @@
exch pop
//null eq { exit } { pop } ifelse
} for
- 1 sub % decrement to last page that we were able to find
+ 1 sub % decrement to last page that we were able to find
2 copy /Count exch put
} {
0 % return 0 and keep 0 page count.
@@ -2104,11 +2975,11 @@
} if
} bind executeonly def
-/pdffindpage? { % <int> pdffindpage? 1 null (page not found)
+/pdffindpage? { % <int> pdffindpage? 1 null (page not found)
% <int> pdffindpage? 1 noderef (page found)
- % <int> pdffindpage? 0 null (Error: page not found)
+ % <int> pdffindpage? 0 null (Error: page not found)
Trailer /Root oget /Pages get
- { % We should be able to tell when we reach a leaf
+ { % We should be able to tell when we reach a leaf
% by finding a Type unequal to /Pages. Unfortunately,
% some files distributed by Adobe lack the Type key
% in some of the Pages nodes! Instead, we check for Kids.
@@ -2138,7 +3009,7 @@
% Find the N'th page of the document by iterating through the Pages tree.
% The first page is numbered 1.
-/pdffindpageref { % <int> pdffindpage <objref>
+/pdffindpageref { % <int> pdffindpage <objref>
dup pdffindpage?
% Stack: index countleft noderef
dup //null ne {
@@ -2147,21 +3018,21 @@
PageIndex 2 index 1 sub 65533 .min 2 index oforce put
PageNumbers 1 index oforce 3 index dup 65534 le
{ put }
- { pop pop pop } % don't store more than 65534 pagenumbers
+ { pop pop pop } % don't store more than 65534 pagenumbers
ifelse
} {
- exch pop % return the //null
+ exch pop % return the //null
}
ifelse
- exch pop % pop the page number, return the object or null
+ exch pop % pop the page number, return the object or null
} bind executeonly def
-/pdffindpage { % <int> pdffindpage <pagedict>
+/pdffindpage { % <int> pdffindpage <pagedict>
pdffindpageref oforce
} bind executeonly def
% Find the N'th page of the document.
% The first page is numbered 1.
-/pdfgetpage % <int> pdfgetpage <pagedict>
+/pdfgetpage % <int> pdfgetpage <pagedict>
{ PageIndex 1 index 1 sub dup 65533 lt
{ get }
{ pop pop //null }
@@ -2173,12 +3044,12 @@
} bind executeonly def
% Find the page number of a page object (inverse of pdfgetpage).
-/pdfpagenumber % <pagedict> pdfpagenumber <int>
- { % We use the simplest and stupidest of all possible algorithms....
+/pdfpagenumber % <pagedict> pdfpagenumber <int>
+ { % We use the simplest and stupidest of all possible algorithms....
PageNumbers 1 index .knownget
{ exch pop
}
- { 1 1 PageCount 1 add % will give a rangecheck if not found
+ { 1 1 PageCount 1 add % will give a rangecheck if not found
{ dup pdfgetpage oforce 2 index eq { exit } if pop
}
for exch pop
@@ -2198,15 +3069,15 @@
} if
4 1 roll
} repeat
- exch 4 1 roll % <x2> <x1> <y1> <y2>
- 2 copy gt { exch } if % <x2> <x1> <lly> <ury>
- 4 2 roll 2 copy lt { exch } if % <lly> <ury> <urx> <llx>
- 4 1 roll exch % <llx> <lly> <urx> <ury>
+ exch 4 1 roll % <x2> <x1> <y1> <y2>
+ 2 copy gt { exch } if % <x2> <x1> <lly> <ury>
+ 4 2 roll 2 copy lt { exch } if % <lly> <ury> <urx> <llx>
+ 4 1 roll exch % <llx> <lly> <urx> <ury>
} bind executeonly def
% Arrange a rectangle into a 'normal' order. I.e the lower left corner
% followed by the upper right corner.
-/normrect % <rect> normrect <rect>
+/normrect % <rect> normrect <rect>
{
aload pop normrect_elems 4 array astore
} bind executeonly def
@@ -2223,10 +3094,10 @@
} ifelse
} bind executeonly def
-/boxrect % <llx> <lly> <urx> <ury> boxrect <x> <y> <w> <h>
+/boxrect % <llx> <lly> <urx> <ury> boxrect <x> <y> <w> <h>
{ exch 3 index sub exch 2 index sub
} bind executeonly def
-/resolvedest { % <name|string|other> resolvedest <other|null>
+/resolvedest { % <name|string|other> resolvedest <other|null>
dup type /nametype eq {
Trailer /Root oget /Dests knownoget {
exch knownoget not { //null } if
@@ -2298,9 +3169,9 @@
} ifelse
} ifelse
3 1 roll
- 2 copy 7 -1 roll 1 and 0 ne { exch } if 4 2 roll % odd rotation switches x<->y
- 2 { dup //null eq { pop 0 } if exch } repeat % replace nulls with 0
- 7 -1 roll transform % transform coordinates
+ 2 copy 7 -1 roll 1 and 0 ne { exch } if 4 2 roll % odd rotation switches x<->y
+ 2 { dup //null eq { pop 0 } if exch } repeat % replace nulls with 0
+ 7 -1 roll transform % transform coordinates
2 { 3 -1 roll //null eq { pop //null } if exch } repeat % put the nulls back
3 -1 roll
4 array astore
@@ -2314,7 +3185,7 @@
} bind executeonly def
end readonly def
-/linkdest { % <link|outline> linkdest
+/linkdest { % <link|outline> linkdest
% ([/Page <n>] /View <view> | ) <link|outline>
dup /NewWindow knownoget {
/NewWindow exch 3 -1 roll
@@ -2341,11 +3212,11 @@
} if
} if
} if
- % stack: <link|outline> <dest> ( <PDF2PS_matrix> <rot> <page#> true | <page> false )
+ % stack: <link|outline> <dest> ( <PDF2PS_matrix> <rot> <page#> true | <page> false )
{
- /Page exch 6 2 roll
+ /Page exch 6 2 roll
% stack: [/Page <page#>] <link|outline> <dest> <PDF2PS_matrix> <rot>
- 3 -1 roll dup length 1 sub 1 exch getinterval /View 4 1 roll
+ 3 -1 roll dup length 1 sub 1 exch getinterval /View 4 1 roll
% stack: [/Page <page#>] <link|outline> /View <PDF2PS_matrix> <rot> <view>
//viewdestprocs 1 index 0 get get exec
3 -1 roll
@@ -2393,7 +3264,7 @@
% **** and some Artifex customers rely on the pdfshowpage_init,
% **** pdfshowpage_setpage, pdfshowpage_finish so all logic should be
% **** implemented in one of those three procedures.
-/pdfshowpage % <pagedict> pdfshowpage -
+/pdfshowpage % <pagedict> pdfshowpage -
{ dup /Page exch store
pdfshowpage_init % <pagedict>
pdfshowpage_setpage % <pagedict>
@@ -2400,10 +3271,10 @@
pdfshowpage_finish % -
} bind executeonly def
-/pdfpagecontents % <pagedict> pdfpagecontents <contents>
+/pdfpagecontents % <pagedict> pdfpagecontents <contents>
{ } bind executeonly def
-/pdfshowpage_init % <pagedict> pdfshowpage_init <pagedict>
+/pdfshowpage_init % <pagedict> pdfshowpage_init <pagedict>
{ /DSCPageCount DSCPageCount 1 add store
} bind executeonly def
@@ -2522,7 +3393,7 @@
} bind executeonly def
% Compute the matrix that transforms the PDF->PS "default" user space
-/pdf_PDF2PS_matrix { % <pdfpagedict> -- matrix
+/pdf_PDF2PS_matrix { % <pdfpagedict> -- matrix
matrix currentmatrix matrix setmatrix exch
% stack: savedCTM <pdfpagedict>
dup get_any_box
@@ -2533,13 +3404,13 @@
currentpagedevice /.HWMargins get aload pop
currentpagedevice /PageSize get aload pop
% Adjust PageSize and .HWMargins for the page portrait/landscape orientation
- 2 copy gt % PageSize_is_landscape
+ 2 copy gt % PageSize_is_landscape
7 index aload pop 3 -1 roll sub 3 1 roll exch sub exch
10 index /Rotate pget not { 0 } if cvi 90 idiv 1 and 0 ne { exch } if
- gt % Box_is_landscape
- xor % PageSize_is_landscape(or square) xor'ed with Box_is_lanscape suggests rotate
- 2 index 2 index eq not and { % don't rotate if Page is square
- 1 index 0 translate 90 rotate % add in a rotation
+ gt % Box_is_landscape
+ xor % PageSize_is_landscape(or square) xor'ed with Box_is_lanscape suggests rotate
+ 2 index 2 index eq not and { % don't rotate if Page is square
+ 1 index 0 translate 90 rotate % add in a rotation
PDFDEBUG { ( Rotating the page for best fit) = flush } if
2 copy ne {
% rotate the .HWMargins
@@ -2555,7 +3426,7 @@
3 -1 roll sub 3 1 roll exch sub exch
% stack: savedCTM <pdfpagedict> <Crop|Media Box> Xmin Ymin Xmax Ymax
PDFDEBUG { ( Translate up by [ ) print 3 index =print (, ) print 2 index =print ( ]) = flush } if
- 3 index 3 index translate % move origin up to imageable area
+ 3 index 3 index translate % move origin up to imageable area
2 index sub exch 3 index sub exch 4 2 roll pop pop
% stack: savedCTM <pdfpagedict> [Box] XImageable YImageable
2 index aload pop 2 index sub exch 3 index sub exch 4 2 roll pop pop
@@ -2631,13 +3502,13 @@
} bind executeonly def
currentdict /PDF2PS_matrix_key undef
-/.pdfshowpage_Install { % <pagedict> [<prevproc>] .pdfshowpage_Install -
+/.pdfshowpage_Install { % <pagedict> [<prevproc>] .pdfshowpage_Install -
0 get exec
pdf_cached_PDF2PS_matrix concat
} bind executeonly def
-/pdfshowpage_setpage { % <pagedict> pdfshowpage_setpage <pagedict>
- 6 dict begin % for setpagedevice
+/pdfshowpage_setpage { % <pagedict> pdfshowpage_setpage <pagedict>
+ 6 dict begin % for setpagedevice
% Stack: pdfpagedict
% This comment is no longer true, and is maintained here for history only:
%
@@ -2741,7 +3612,7 @@
dup type dup /arraytype eq exch /packedarraytype eq or {
dup length 4 eq {
dup 2 get /.pdfshowpage_Install load eq {
- 1 get 0 get % previous procedure
+ 1 get 0 get % previous procedure
} if
} if
} if
@@ -2754,7 +3625,7 @@
/Install exch def
% Stack: pagedict currentpagedict
% If the Overprint device flag is not /disable, check usage of OP/op
- /PageUsesOverprint //false def % assume we don't need OP simulation
+ /PageUsesOverprint //false def % assume we don't need OP simulation
dup /Overprint get /disable ne
% If the device suppports SpotColors (DeviceN device) we don't need simulation
1 index /PageSpotColors known
@@ -2769,13 +3640,13 @@
% Overprint is /enable, so the device might need the overprint compositor
% if it does not support spot colors, thus check if overprint is used so
% overprint simulation can be done with the pdf14 compositor
- 1 index countspotcolors userdict exch /PageSpotColors exch put % save it in a known place
+ 1 index countspotcolors userdict exch /PageSpotColors exch put % save it in a known place
1 index pageusesoverprint
1 index /ProcessColorModel get /DeviceCMYK eq {
- PageSpotColors 0 gt % count of colorants NOT including CMYK
+ PageSpotColors 0 gt % count of colorants NOT including CMYK
and
} if
- /PageUsesOverprint exch def % the page needs OP simulation so set device param.
+ /PageUsesOverprint exch def % the page needs OP simulation so set device param.
} if
pop currentdict end setpagedevice
} bind executeonly def
@@ -2794,7 +3665,7 @@
} if
} bind executeonly def
-/pdfshowpage_finish { % <pagedict> pdfshowpage_finish -
+/pdfshowpage_finish { % <pagedict> pdfshowpage_finish -
save /PDFSave exch store
/PDFdictstackcount countdictstack store
/PDFexecstackcount count 2 sub store
@@ -2820,7 +3691,7 @@
pop
} ifelse
} forall
- } if % end .writepdfmarks
+ } if % end .writepdfmarks
% Display the actual page contents.
9 dict begin
@@ -2850,34 +3721,34 @@
% If the current device isn't CMYK, or if it is a device that supports transparency
% we don't need the special handling of Overprint transparency, so disable the checking.
- 4 dict begin % working directory to simplify
+ 4 dict begin % working directory to simplify
currentpagedevice dup /Colors get
- /devColors exch def % put into our convenience dict
+ /devColors exch def % put into our convenience dict
dup /HaveTransparency .knownget not { //false } if
- /devSupportsTrans exch def % put into our convenience dict
+ /devSupportsTrans exch def % put into our convenience dict
dup /Overprint get
- /SimOP exch def % put into our convenience dict
+ /SimOP exch def % put into our convenience dict
SimOP /simulate eq
exch /PageUsesOverprint .knownget not { //false } if
- and % both Overprint==/simulate and PageUsesOverprint
+ and % both Overprint==/simulate and PageUsesOverprint
{
% Determine if the device needs the special pdf14 compositor push
- devColors 4 eq PageSpotColors 0 gt and % CMYK device, but device has spot colors
- devColors 4 lt % RGB or Gray device
+ devColors 4 eq PageSpotColors 0 gt and % CMYK device, but device has spot colors
+ devColors 4 lt % RGB or Gray device
or
} {
- //false % Overprint is not /simulate or PageUseOverprint is false
+ //false % Overprint is not /simulate or PageUseOverprint is false
} ifelse
% Determine if the device needs SMask for Overprint
SimOP /simulate eq {
- //true % we will need setupOPrtans for Compatible BM
+ //true % we will need setupOPrtans for Compatible BM
} {
SimOP /enable eq
- devColors 4 ge % CMYK device
+ devColors 4 ge % CMYK device
and
} ifelse
- devSupportsTrans not and % If device supports transparency (e.g. pdfwrite) then no setupOPtrans
- end % pop the convenience dict
+ devSupportsTrans not and % If device supports transparency (e.g. pdfwrite) then no setupOPtrans
+ end % pop the convenience dict
/setup_trans exch
{ /setupOPtrans } { /setupSMtrans } ifelse
load def
@@ -2885,7 +3756,7 @@
% Show the page within a PDF 1.4 device filter.
{ -1 } { 0 } ifelse
.pushpdf14devicefilter {
- /DefaultQstate qstate store % device has changed -- reset DefaultQstate
+ /DefaultQstate qstate store % device has changed -- reset DefaultQstate
% If the page has a Group, enclose contents in transparency group.
% (Adobe Tech Note 5407, sec 9.2)
dup /Group knownoget {
@@ -2903,12 +3774,12 @@
} stopped {
% abort the transparency device
.abortpdf14devicefilter
- /DefaultQstate qstate store % device has changed -- reset DefaultQstate
+ /DefaultQstate qstate store % device has changed -- reset DefaultQstate
stop
} if
- { } settransfer % identity transfer during popdevice (put_image)
- .poppdf14devicefilter % NB: reset to DefaultQstate will also restore transfer function
- /DefaultQstate qstate store % device has changed -- reset DefaultQstate
+ { } settransfer % identity transfer during popdevice (put_image)
+ .poppdf14devicefilter % NB: reset to DefaultQstate will also restore transfer function
+ /DefaultQstate qstate store % device has changed -- reset DefaultQstate
} {
/setup_trans { pop pop } def % no-op this if the page doesn't use transparency
% NB: original will be restored from PDFsave
@@ -2923,17 +3794,17 @@
{
% Show the page within a PDF 1.4 device filter for overprint_simulation.
-1 .pushpdf14devicefilter {
- /DefaultQstate qstate store % device has changed -- reset DefaultQstate
+ /DefaultQstate qstate store % device has changed -- reset DefaultQstate
showpagecontents
} stopped {
% abort the transparency device
.abortpdf14devicefilter
- /DefaultQstate qstate store % device has changed -- reset DefaultQstate
+ /DefaultQstate qstate store % device has changed -- reset DefaultQstate
stop
} if
- { } settransfer % identity transfer during popdevice (put_image)
- .poppdf14devicefilter % NB: reset to DefaultQstate will also restore transfer function
- /DefaultQstate qstate store % device has changed -- reset DefaultQstate
+ { } settransfer % identity transfer during popdevice (put_image)
+ .poppdf14devicefilter % NB: reset to DefaultQstate will also restore transfer function
+ /DefaultQstate qstate store % device has changed -- reset DefaultQstate
} {
showpagecontents
} ifelse
@@ -2942,7 +3813,7 @@
% todo: mixing drawing ops outside the device filter could cause
% problems, for example with the pnga device.
endpage
- end % scratch dict
+ end % scratch dict
% Some PDF files don't have matching q/Q (gsave/grestore) so we need
% to clean up any left over dicts from the dictstack
@@ -2977,7 +3848,7 @@
pop
count PDFexecstackcount sub { pop } repeat
(after exec) VMDEBUG
- Repaired % pass Repaired state around the restore
+ Repaired % pass Repaired state around the restore
RepairedAnError
PDFSave restore
currentglobal //pdfdict gcheck .setglobal
@@ -2988,8 +3859,8 @@
} bind executeonly odef
% Display the contents of a page (including annotations).
-/showpagecontents { % <pagedict> showpagecontents -
- dup % Save the pagedict for the Annotations
+/showpagecontents { % <pagedict> showpagecontents -
+ dup % Save the pagedict for the Annotations
% We do a 'save' here in order to allow us to restore at the end of the page, before
% we run the annotations. There are two reasons for this; firstly so that the graphics state
@@ -3078,9 +3949,9 @@
not
and
//systemdict /PreserveAnnots .knownget not {//true} if and {
- mark exch {preserveannot} PDFSTOPONERROR {exec}{stopped {(Error: Ignoring invalid annotation, output may be incorrect.\n) pdfformaterror} if} ifelse cleartomark
+ mark exch {preserveannot} PDFSTOPONERROR {exec}{stopped {(Error: Ignoring invalid annotation, output may be incorrect.\n) pdfformaterror} if} ifelse {cleartomark} stopped pop
}{
- mark exch {drawannot} PDFSTOPONERROR {exec}{stopped {(Error: Ignoring invalid annotation, output may be incorrect.\n) pdfformaterror} if} ifelse cleartomark
+ mark exch {drawannot} PDFSTOPONERROR {exec}{stopped {(Error: Ignoring invalid annotation, output may be incorrect.\n) pdfformaterror} if} ifelse {cleartomark} stopped pop
} ifelse
} {
pop
@@ -3101,7 +3972,7 @@
} if
} bind executeonly def
-/processcolorspace { % - processcolorspace <colorspace>
+/processcolorspace { % - processcolorspace <colorspace>
% The following is per the PLRM3.
currentdevice 1 dict dup /ProcessColorModel dup put .getdeviceparams
exch pop exch pop
@@ -3110,7 +3981,7 @@
} bind executeonly def
% returns true if OP or op is true in an ExtGState
-/pageusesoverprint { % <pagedict> pageusesoverprint <bool>
+/pageusesoverprint { % <pagedict> pageusesoverprint <bool>
dup //false exch {
4 dict 1 index resourceusesoverprint { pop not exit } if
%% Check the current dictionary and its Parent (if any) to see
@@ -3135,12 +4006,12 @@
} bind def
% Check if Overprint (OP/op) is specified in an ExtGState dict
-/extgstateusesoverprint { % <gstate dict> extgstateusesoverprint <bool>
- //false exch % Assume no overprint
+/extgstateusesoverprint { % <gstate dict> extgstateusesoverprint <bool>
+ //false exch % Assume no overprint
dup //null eq {
pop % bug 692050
} {
- { % establish loop context
+ { % establish loop context
dup /OP knownoget { { pop not exit } if } if
dup /op knownoget { { pop not exit } if } if
pop exit
@@ -3149,8 +4020,8 @@
} bind def
% Check if overprint is used in a Pattern
-/patternusesoverprint { % <Pattern dict> patternusesoverprint <bool>
- //false exch % Assume no overprint
+/patternusesoverprint { % <Pattern dict> patternusesoverprint <bool>
+ //false exch % Assume no overprint
{
4 dict 1 index resourceusesoverprint { pop not exit } if
dup /ExtGState knownoget { extgstateusesoverprint { pop not exit } if } if
@@ -3159,8 +4030,8 @@
} bind def
% Check the Resources of a page or Form. Check for loops in the resource chain.
-/resourceusesoverprint { % <dict> <dict> resourceusesoverprint <bool>
- { % Use loop to provide an exitable context.
+/resourceusesoverprint { % <dict> <dict> resourceusesoverprint <bool>
+ { % Use loop to provide an exitable context.
/Resources knownoget not { 0 dict } if
2 copy .knownget {
{ % Some circular references may be missed because scanning stops
@@ -3190,22 +4061,22 @@
} bind def
% Check if the annotations on a page use overprint
-/annotsuseoverprint { % <page dict> annotsuseoverprint <bool>
- //false exch % Assume no overprint
- /Annots knownoget { % Get Annots array
+/annotsuseoverprint { % <page dict> annotsuseoverprint <bool>
+ //false exch % Assume no overprint
+ /Annots knownoget { % Get Annots array
dup type /arraytype eq {
{
oforce
dup //null ne {
- /AP knownoget { % Get appearance dict for the annoation
- /N knownogetdict { % Get the /N (i.e. normal) appearance stream
- 4 dict exch resourceusesoverprint { pop pop //true exit } if
+ /AP knownoget { % Get appearance dict for the annoation
+ /N knownogetdict { % Get the /N (i.e. normal) appearance stream
+ 4 dict exch resourceusesoverprint { not exit } if
} if
- } if % If AP dict known
+ } if % If AP dict known
} {
pop
} ifelse
- } forall % For all annots on the page
+ } forall % For all annots on the page
} {
( **** Error: Annotation array is not an array, ignoring it.\n) pdfformaterror
( Output may be incorrect.\n) pdfformaterror
@@ -3218,8 +4089,8 @@
% ------ Transparency support ------ %
% Determine whether a page might invoke any transparency features:
-% - Non-default BM, ca, CA, or SMask in an ExtGState
-% - Image XObject with SMask
+% - Non-default BM, ca, CA, or SMask in an ExtGState
+% - Image XObject with SMask
% Note: we deliberately don't check to see whether a Group is defined,
% because Adobe Illustrator 10 (and possibly other applications) define
% a page-level group whether transparency is actually used or not.
@@ -3228,7 +4099,7 @@
%
% Transparency is a 1.4 feature however we have seen files that claimed
% to be PDF 1.1 with transparency features. Bugs 689288, 691273.
-/pageusestransparency { % <pagedict> pageusestransparency <bool>
+/pageusestransparency { % <pagedict> pageusestransparency <bool>
NOTRANSPARENCY {
pop //false
} {
@@ -3257,12 +4128,12 @@
} bind executeonly def
% Check if transparency is specified in an ExtGState dict
-/extgstateusestransparency { % <gstate dict> extgstateusestransparency <bool>
- //false exch % Assume no transparency
+/extgstateusestransparency { % <gstate dict> extgstateusestransparency <bool>
+ //false exch % Assume no transparency
dup //null eq {
pop % bug 692050
} {
- { % establish loop context
+ { % establish loop context
dup /BM knownoget {
dup /Normal ne exch /Compatible ne and { pop not exit } if
} if
@@ -3275,10 +4146,10 @@
} bind executeonly def
% Check if transparency is used in a Pattern
-/patternusestransparency { % <Pattern dict> patternusestransparency <bool>
+/patternusestransparency { % <Pattern dict> patternusestransparency <bool>
dup //null eq NOTRANSPARENCY or
{ pop //false }
- { //false exch % Assume no transparency
+ { //false exch % Assume no transparency
{
4 dict 1 index resourceusestransparency { pop not exit } if
dup /ExtGState knownoget { extgstateusestransparency { pop not exit } if } if
@@ -3289,8 +4160,8 @@
} bind executeonly def
% Check the Resources of a page or Form. Check for loops in the resource chain.
-/resourceusestransparency { % <dict> <dict> resourceusestransparency <bool>
- { % Use loop to provide an exitable context.
+/resourceusestransparency { % <dict> <dict> resourceusestransparency <bool>
+ { % Use loop to provide an exitable context.
/Resources knownoget not { 0 dict } if
2 copy .knownget {
{ % Some circular references may be missed because scanning stops
@@ -3380,9 +4251,9 @@
} bind executeonly def
% Check if the annotations on a page use transparency
-/annotsusetransparency { % <page dict> annotsusetransparency <bool>
- //false exch % Assume no transparency
- /Annots knownoget { % Get Annots array
+/annotsusetransparency { % <page dict> annotsusetransparency <bool>
+ //false exch % Assume no transparency
+ /Annots knownoget { % Get Annots array
dup type /arraytype eq {
{
/AnnotTransparencyCheck exch % marker to clean up stack on error
@@ -3404,11 +4275,11 @@
pop pop //true exit % as transparency.
} if
} if
- dup /AP knownoget { % Get appearance dict for the annoation
- /N knownogetdict { % Get the /N (i.e. normal) appearance stream
+ dup /AP knownoget { % Get appearance dict for the annoation
+ /N knownogetdict { % Get the /N (i.e. normal) appearance stream
4 dict exch resourceusestransparency { pop pop //true exit } if
} if
- } if % If AP dict known
+ } if % If AP dict known
dup /BM knownoget {
pop pop pop //true exit
} if
@@ -3431,7 +4302,7 @@
pop
} ifelse
} ifelse
- } forall % For all annots on the page
+ } forall % For all annots on the page
}
{
( **** Error: Annotation array is not an array, ignoring it.\n) pdfformaterror
@@ -3443,7 +4314,7 @@
} bind executeonly def
% Add a color name to our spot color list. Ignore /All and /None
-/putspotcolor { % <name> <spotcolordict> putspotcolor -
+/putspotcolor { % <name> <spotcolordict> putspotcolor -
% The 'name' could be a string. If so then convert to a name.
exch dup type /stringtype eq { cvn } if
dup dup /None eq exch /All eq or { pop pop } { 0 put } ifelse
@@ -3452,7 +4323,7 @@
% Determine which spot colors are used within a color space Note: This
% dict will include all colors used in Separation or DeviceN color spaces.
% Thus it may include Cyan, Magenta, Yellow, and Black.
-% <colorspace> <spotcolordict> colorspacespotcolors -
+% <colorspace> <spotcolordict> colorspacespotcolors -
/colorspacespotcolors {
% Make sure we have an array, and that it is has enough info
exch dup type /arraytype eq
@@ -3464,7 +4335,7 @@
2 copy exch colorspacespotcolors
} {
dup /Pattern eq {
- 1 index length 1 gt { % only uncolored patterns have colorspace
+ 1 index length 1 gt { % only uncolored patterns have colorspace
pop 1 oget % <<>> [base]
2 copy exch colorspacespotcolors
} {
@@ -3490,10 +4361,10 @@
% all colors used in Separation or DeviceN color spaces. Thus it may include
% Cyan, Magenta, Yellow, and Black. We also pass a dict that is used to check
% for loops in the resource list.
-% <spotcolordict> <loopdict> <page/form/annot dict>
-% resourcespotcolors <spotcolordict> <loopdict>
+% <spotcolordict> <loopdict> <page/form/annot dict>
+% resourcespotcolors <spotcolordict> <loopdict>
/resourcespotcolors {
- { % Use loop to provide an exitable context.
+ { % Use loop to provide an exitable context.
% Exit if no Resources entry
/Resources knownoget not { exit } if
% Exit if we have already seen this dict
@@ -3563,17 +4434,17 @@
% Determine which spot colors are used within the annotations. Note: This
% dict will include all colors used in Separation or DeviceN color spaces.
% Thus it may include Cyan, Magenta, Yellow, and Black.
-% <spotcolordict> <loopdict> <annotsarray>
-% annotsspotcolors <spotcolordict> <loopdict>
+% <spotcolordict> <loopdict> <annotsarray>
+% annotsspotcolors <spotcolordict> <loopdict>
/annotsspotcolors {
dup type /arraytype eq {
{ oforce
dup //null ne {
- /AP knownoget { % Get appearance dict for the annoation
- /N knownogetdict { % Get the /N (i.e. normal) appearance stream
+ /AP knownoget { % Get appearance dict for the annoation
+ /N knownogetdict { % Get the /N (i.e. normal) appearance stream
resourcespotcolors
- } if % If normal appearance streamknown
- } if % If AP dict known
+ } if % If normal appearance streamknown
+ } if % If AP dict known
} {
pop
} ifelse
@@ -3594,7 +4465,7 @@
% page's resources. Thus it may include Cyan, Magenta, Yellow, and Black.
% There is no attempt to verify that these color spaces are actually used
% within the object streams for the page.
-/pagespotcolors { % <pagedict> pagespotcolors <spotcolordict>
+/pagespotcolors { % <pagedict> pagespotcolors <spotcolordict>
dup
% Create a dict to hold spot color names.
0 dict exch
@@ -3607,7 +4478,7 @@
{
/Parent knownoget
{
- dup /Pages known not { pop exit } if % not a valid Page Tree ancestor
+ dup /Pages known not { pop exit } if % not a valid Page Tree ancestor
dup 4 1 roll
resourcespotcolors
3 -1 roll
@@ -3619,18 +4490,18 @@
% Also check for color spaces in the annotations.
3 -1 roll
/Annots knownoget { annotsspotcolors } if
- pop % Discard reference loop dict
+ pop % Discard reference loop dict
} bind executeonly def
% Determine how many (if any) spot colors are used by a page.
% Note: This count does not include Cyan, Magenta, Yellow, or Black
-/countspotcolors { % <pagedict> countspotcolors <count>
- pagespotcolors % Get dict with all spot colors
- dup length % spot color dict length
+/countspotcolors { % <pagedict> countspotcolors <count>
+ pagespotcolors % Get dict with all spot colors
+ dup length % spot color dict length
% Remove CMYK from the spot color count.
[ /Cyan /Magenta /Yellow /Black ]
{ 2 index exch known { 1 sub } if } forall
- exch pop % Remove spot color dict
+ exch pop % Remove spot color dict
} bind executeonly def
% ------ ColorSpace substitution support ------ %
@@ -3848,7 +4719,7 @@
Trailer /Root knownoget {
/OutputIntents knownoget {
dup type /arraytype eq {
- { % process all output profiles present
+ { % process all output profiles present
oforce
dup length dict .copydict
dup /DestOutputProfile knownoget {
@@ -3880,7 +4751,7 @@
{ currentdevice //null //false counttomark 1 add 3 roll .putdeviceparamsonly }
ifelse
pop pop
- pop % done with this OutputIntent dictionary
+ pop % done with this OutputIntent dictionary
} forall
} {
pop
@@ -3888,7 +4759,7 @@
pdfformaterror
( Output may be incorrect.\n) pdfformaterror
} ifelse
- } if % OutputIntents known
+ } if % OutputIntents known
% tell device there are no more OutputIntents
[ /OutputIntent [ ] /.pdfputparams where
{ pop .pdfputparams }
@@ -3963,7 +4834,7 @@
pop
}bind readonly def
-end % pdfdict
+end % pdfdict
systemdict /ALLOWPSTRANSPARENCY get
@@ -4017,7 +4888,7 @@
/.pdfinkpath /.pdfFormName /.settextspacing /.currenttextspacing /.settextleading /.currenttextleading
/.settextrise /.currenttextrise /.setwordspacing /.currentwordspacing /.settexthscaling /.currenttexthscaling
-/.setPDFfontsize /.currentPDFfontsize /.setdistillerparams
+/.setPDFfontsize /.currentPDFfontsize /.setdistillerparams /.currentpoint_valid
% undefining these causes errors/incorrect output
%/.settextrenderingmode
Modified: trunk/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -680,8 +680,8 @@
} def
/Dpop { //OPsaveDstack begin previous { def } forall end } def
-% colorspaces that don't require special overprint transparency handling
-/okOPcs mark /DeviceGray 0 /DeviceCMYK 1 /DeviceN 2 /Separation 3 .dicttomark def
+% colorspaces that require special overprint transparency handling
+/specialOPcs mark /DeviceGray 0 /DeviceCMYK 1 /DeviceN 2 /Separation 3 .dicttomark def
% Take care of pushing a transparency group if we need it for SMask or for Overprint..
% After pushing the group, we save the ca and CA and change them
@@ -696,11 +696,18 @@
//OPsaveDstack begin
//Dpush exec % push the current OPsaveDstack values into 'previous'
/SupportsDevn .special_op
- okOPcs currentcolorspace 0 get dup /Indexed eq {
+ specialOPcs currentcolorspace 0 get dup /Indexed eq {
pop currentcolorspace 1 get % use the base space
} if
known or {
- 1 index /stroke ne { .currentfilloverprint } { .currentstrokeoverprint } ifelse
+ dup /stroke ne {
+ .currentfilloverprint
+ 1 index dup /.fillstroke eq exch /.eofillstroke eq or {
+ .currentstrokeoverprint or
+ } if
+ } {
+ .currentstrokeoverprint
+ } ifelse
% Change BM to CompatibleOverprint if this has overprint true
dup /ChangeBM exch def
.currentblendmode dup /Normal eq exch /Compatible eq or
@@ -961,12 +968,12 @@
n
} bind executeonly def
/b { closepath B* } bind executeonly def
-/n { end { currentpoint } stopped not { pop pop clip } if newpath } bind executeonly def
+/n { end .currentpoint_valid { clip } if newpath } bind executeonly def
end readonly def
/W { //Wdict begin } bind executeonly def
/W*dict 8 dict dup begin
Wdict { def } forall
-/n { end { currentpoint } stopped not { pop pop eoclip } if newpath } bind executeonly def
+/n { end .currentpoint_valid { eoclip } if newpath } bind executeonly def
end readonly def
/W* { //W*dict begin } bind executeonly def
% ---------------- Text control ---------------- %
@@ -1057,7 +1064,8 @@
/settextposition {
% Update the TextMatrix translation.
gsave TextSaveMatrix setmatrix
- {currentpoint} stopped not {
+ .currentpoint_valid {
+ currentpoint
.currenttextrise
sub
matrix .currenttextmatrix
@@ -1105,6 +1113,9 @@
} bind executeonly odef
/BT {
+ % Bug 703996 has a path defined before BT, then stroked afterwards
+ .currentpoint_valid { //false upath } { //null } ifelse
+ /BT_upath gput
//false /illegal_BT gput
currentdict /TextSaveMatrix known {
( **** Error: illegal nested BT operator detected.\n)
@@ -1153,10 +1164,8 @@
/clip_if_required {
.currenttextrenderingmode 4 ge
- {currentpoint} //.internalstopped exec
- {//false}
- {pop pop //true}
- ifelse and
+ .currentpoint_valid
+ and
{ .currentfilladjust2 0 dup .setfilladjust2 clip .setfilladjust2} if
newpath
} bind def
@@ -1183,6 +1192,7 @@
%% in a nested text block (inside a gsave).
currentdict /qTextSaveMatrix known not {
switch_to_normal_marking_ops
+ currentdict /BT_upath get dup //null eq { pop } { newpath uappend } ifelse
} if
} bind executeonly def
Modified: trunk/Master/tlpkg/tlgs/lib/Fontmap
===================================================================
--- trunk/Master/tlpkg/tlgs/lib/Fontmap 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/lib/Fontmap 2021-09-29 01:02:39 UTC (rev 60648)
@@ -1,5 +1,5 @@
%!
-%% $Id: Fontmap 36707 2015-04-02 23:03:05Z reinhardk $
+%% $Id: Fontmap 7680 2008-04-27 12:21:15Z reinhardk $
% See Fontmap.TeXLive for the syntax of real Fontmap files.
%% Replace 1 (Fontmap.TeXLive)
Modified: trunk/Master/tlpkg/tlgs/lib/Fontmap.TeXLive
===================================================================
--- trunk/Master/tlpkg/tlgs/lib/Fontmap.TeXLive 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/lib/Fontmap.TeXLive 2021-09-29 01:02:39 UTC (rev 60648)
@@ -1,108 +1,108 @@
-%% Fontmap.TeXLive
-%% $Id: Fontmap.TeXLive 36707 2015-04-02 23:03:05Z reinhardk $
-
-%% This file is part of TeXLive.
-%% You may freely use, modify and/or distribute this file.
-
-%% Bitstream Charter
-
-/CharterBT-Bold (bchb8a.pfb) ;
-/CharterBT-BoldItalic (bchbi8a.pfb) ;
-/CharterBT-Roman (bchr8a.pfb) ;
-/CharterBT-Italic (bchri8a.pfb) ;
-
-%% Adobe Utopia
-
-/Utopia-Bold (putb8a.pfb) ;
-/Utopia-BoldItalic (putbi8a.pfb) ;
-/Utopia-Regular (putr8a.pfb) ;
-/Utopia-Italic (putri8a.pfb) ;
-
-%% URW LW35 Fonts
-
-/URWGothicL-Demi (uagd8a.pfb) ;
-/URWGothicL-DemiObli (uagdo8a.pfb) ;
-/URWGothicL-Book (uagk8a.pfb) ;
-/URWGothicL-BookObli (uagko8a.pfb) ;
-/URWBookmanL-DemiBold (ubkd8a.pfb) ;
-/URWBookmanL-DemiBoldItal (ubkdi8a.pfb) ;
-/URWBookmanL-Ligh (ubkl8a.pfb) ;
-/URWBookmanL-LighItal (ubkli8a.pfb) ;
-/NimbusMonL-Bold (ucrb8a.pfb) ;
-/NimbusMonL-BoldObli (ucrbo8a.pfb) ;
-/NimbusMonL-Regu (ucrr8a.pfb) ;
-/NimbusMonL-ReguObli (ucrro8a.pfb) ;
-/NimbusSanL-Bold (uhvb8a.pfb) ;
-/NimbusSanL-BoldCond (uhvb8ac.pfb) ;
-/NimbusSanL-BoldItal (uhvbo8a.pfb) ;
-/NimbusSanL-BoldCondItal (uhvbo8ac.pfb) ;
-%%%/NimbusSanL-Regu (uhvr8a-105.pfb) ;
-/NimbusSanL-Regu (uhvr8a.pfb) ;
-/NimbusSanL-ReguCond (uhvr8ac.pfb) ;
-%%%/NimbusSanL-ReguItal (uhvro8a-105.pfb) ;
-/NimbusSanL-ReguItal (uhvro8a.pfb) ;
-/NimbusSanL-ReguCondItal (uhvro8ac.pfb) ;
-/CenturySchL-Bold (uncb8a.pfb) ;
-/CenturySchL-BoldItal (uncbi8a.pfb) ;
-/CenturySchL-Roma (uncr8a.pfb) ;
-/CenturySchL-Ital (uncri8a.pfb) ;
-/URWPalladioL-Bold (uplb8a.pfb) ;
-/URWPalladioL-BoldItal (uplbi8a.pfb) ;
-/URWPalladioL-Roma (uplr8a.pfb) ;
-/URWPalladioL-Ital (uplri8a.pfb) ;
-/StandardSymL (usyr.pfb) ;
-/NimbusRomNo9L-Medi (utmb8a.pfb) ;
-/NimbusRomNo9L-MediItal (utmbi8a.pfb) ;
-/NimbusRomNo9L-Regu (utmr8a.pfb) ;
-/NimbusRomNo9L-ReguItal (utmri8a.pfb) ;
-/URWChanceryL-MediItal (uzcmi8a.pfb) ;
-/Dingbats (uzdr.pfb) ;
-
-
-% Aliases
-
-/Bookman-Demi /URWBookmanL-DemiBold ;
-/Bookman-DemiItalic /URWBookmanL-DemiBoldItal ;
-/Bookman-Light /URWBookmanL-Ligh ;
-/Bookman-LightItalic /URWBookmanL-LighItal ;
-
-/Courier /NimbusMonL-Regu ;
-/Courier-Oblique /NimbusMonL-ReguObli ;
-/Courier-Bold /NimbusMonL-Bold ;
-/Courier-BoldOblique /NimbusMonL-BoldObli ;
-
-/AvantGarde-Book /URWGothicL-Book ;
-/AvantGarde-BookOblique /URWGothicL-BookObli ;
-/AvantGarde-Demi /URWGothicL-Demi ;
-/AvantGarde-DemiOblique /URWGothicL-DemiObli ;
-
-/Helvetica /NimbusSanL-Regu ;
-/Helvetica-Oblique /NimbusSanL-ReguItal ;
-/Helvetica-Bold /NimbusSanL-Bold ;
-/Helvetica-BoldOblique /NimbusSanL-BoldItal ;
-
-/Helvetica-Narrow /NimbusSanL-ReguCond ;
-/Helvetica-Narrow-Oblique /NimbusSanL-ReguCondItal ;
-/Helvetica-Narrow-Bold /NimbusSanL-BoldCond ;
-/Helvetica-Narrow-BoldOblique /NimbusSanL-BoldCondItal ;
-
-/Palatino-Roman /URWPalladioL-Roma ;
-/Palatino-Italic /URWPalladioL-Ital ;
-/Palatino-Bold /URWPalladioL-Bold ;
-/Palatino-BoldItalic /URWPalladioL-BoldItal ;
-
-/NewCenturySchlbk-Roman /CenturySchL-Roma ;
-/NewCenturySchlbk-Italic /CenturySchL-Ital ;
-/NewCenturySchlbk-Bold /CenturySchL-Bold ;
-/NewCenturySchlbk-BoldItalic /CenturySchL-BoldItal ;
-
-/Times-Roman /NimbusRomNo9L-Regu ;
-/Times-Italic /NimbusRomNo9L-ReguItal ;
-/Times-Bold /NimbusRomNo9L-Medi ;
-/Times-BoldItalic /NimbusRomNo9L-MediItal ;
-
-/Symbol /StandardSymL ;
-
-/ZapfChancery-MediumItalic /URWChanceryL-MediItal ;
-
-/ZapfDingbats /Dingbats ;
+%% Fontmap.TeXLive
+%% $Id: Fontmap.TeXLive 7680 2008-04-27 12:21:15Z reinhardk $
+
+%% This file is part of TeXLive.
+%% You may freely use, modify and/or distribute this file.
+
+%% Bitstream Charter
+
+/CharterBT-Bold (bchb8a.pfb) ;
+/CharterBT-BoldItalic (bchbi8a.pfb) ;
+/CharterBT-Roman (bchr8a.pfb) ;
+/CharterBT-Italic (bchri8a.pfb) ;
+
+%% Adobe Utopia
+
+/Utopia-Bold (putb8a.pfb) ;
+/Utopia-BoldItalic (putbi8a.pfb) ;
+/Utopia-Regular (putr8a.pfb) ;
+/Utopia-Italic (putri8a.pfb) ;
+
+%% URW LW35 Fonts
+
+/URWGothicL-Demi (uagd8a.pfb) ;
+/URWGothicL-DemiObli (uagdo8a.pfb) ;
+/URWGothicL-Book (uagk8a.pfb) ;
+/URWGothicL-BookObli (uagko8a.pfb) ;
+/URWBookmanL-DemiBold (ubkd8a.pfb) ;
+/URWBookmanL-DemiBoldItal (ubkdi8a.pfb) ;
+/URWBookmanL-Ligh (ubkl8a.pfb) ;
+/URWBookmanL-LighItal (ubkli8a.pfb) ;
+/NimbusMonL-Bold (ucrb8a.pfb) ;
+/NimbusMonL-BoldObli (ucrbo8a.pfb) ;
+/NimbusMonL-Regu (ucrr8a.pfb) ;
+/NimbusMonL-ReguObli (ucrro8a.pfb) ;
+/NimbusSanL-Bold (uhvb8a.pfb) ;
+/NimbusSanL-BoldCond (uhvb8ac.pfb) ;
+/NimbusSanL-BoldItal (uhvbo8a.pfb) ;
+/NimbusSanL-BoldCondItal (uhvbo8ac.pfb) ;
+%%%/NimbusSanL-Regu (uhvr8a-105.pfb) ;
+/NimbusSanL-Regu (uhvr8a.pfb) ;
+/NimbusSanL-ReguCond (uhvr8ac.pfb) ;
+%%%/NimbusSanL-ReguItal (uhvro8a-105.pfb) ;
+/NimbusSanL-ReguItal (uhvro8a.pfb) ;
+/NimbusSanL-ReguCondItal (uhvro8ac.pfb) ;
+/CenturySchL-Bold (uncb8a.pfb) ;
+/CenturySchL-BoldItal (uncbi8a.pfb) ;
+/CenturySchL-Roma (uncr8a.pfb) ;
+/CenturySchL-Ital (uncri8a.pfb) ;
+/URWPalladioL-Bold (uplb8a.pfb) ;
+/URWPalladioL-BoldItal (uplbi8a.pfb) ;
+/URWPalladioL-Roma (uplr8a.pfb) ;
+/URWPalladioL-Ital (uplri8a.pfb) ;
+/StandardSymL (usyr.pfb) ;
+/NimbusRomNo9L-Medi (utmb8a.pfb) ;
+/NimbusRomNo9L-MediItal (utmbi8a.pfb) ;
+/NimbusRomNo9L-Regu (utmr8a.pfb) ;
+/NimbusRomNo9L-ReguItal (utmri8a.pfb) ;
+/URWChanceryL-MediItal (uzcmi8a.pfb) ;
+/Dingbats (uzdr.pfb) ;
+
+
+% Aliases
+
+/Bookman-Demi /URWBookmanL-DemiBold ;
+/Bookman-DemiItalic /URWBookmanL-DemiBoldItal ;
+/Bookman-Light /URWBookmanL-Ligh ;
+/Bookman-LightItalic /URWBookmanL-LighItal ;
+
+/Courier /NimbusMonL-Regu ;
+/Courier-Oblique /NimbusMonL-ReguObli ;
+/Courier-Bold /NimbusMonL-Bold ;
+/Courier-BoldOblique /NimbusMonL-BoldObli ;
+
+/AvantGarde-Book /URWGothicL-Book ;
+/AvantGarde-BookOblique /URWGothicL-BookObli ;
+/AvantGarde-Demi /URWGothicL-Demi ;
+/AvantGarde-DemiOblique /URWGothicL-DemiObli ;
+
+/Helvetica /NimbusSanL-Regu ;
+/Helvetica-Oblique /NimbusSanL-ReguItal ;
+/Helvetica-Bold /NimbusSanL-Bold ;
+/Helvetica-BoldOblique /NimbusSanL-BoldItal ;
+
+/Helvetica-Narrow /NimbusSanL-ReguCond ;
+/Helvetica-Narrow-Oblique /NimbusSanL-ReguCondItal ;
+/Helvetica-Narrow-Bold /NimbusSanL-BoldCond ;
+/Helvetica-Narrow-BoldOblique /NimbusSanL-BoldCondItal ;
+
+/Palatino-Roman /URWPalladioL-Roma ;
+/Palatino-Italic /URWPalladioL-Ital ;
+/Palatino-Bold /URWPalladioL-Bold ;
+/Palatino-BoldItalic /URWPalladioL-BoldItal ;
+
+/NewCenturySchlbk-Roman /CenturySchL-Roma ;
+/NewCenturySchlbk-Italic /CenturySchL-Ital ;
+/NewCenturySchlbk-Bold /CenturySchL-Bold ;
+/NewCenturySchlbk-BoldItalic /CenturySchL-BoldItal ;
+
+/Times-Roman /NimbusRomNo9L-Regu ;
+/Times-Italic /NimbusRomNo9L-ReguItal ;
+/Times-Bold /NimbusRomNo9L-Medi ;
+/Times-BoldItalic /NimbusRomNo9L-MediItal ;
+
+/Symbol /StandardSymL ;
+
+/ZapfChancery-MediumItalic /URWChanceryL-MediItal ;
+
+/ZapfDingbats /Dingbats ;
Modified: trunk/Master/tlpkg/tlgs/lib/PDFA_def.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/lib/PDFA_def.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/lib/PDFA_def.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -35,13 +35,13 @@
/CMYK eq {
/N 4 false
}{
- (ColorConversionStrategy not a device space, falling back to ProcessColorModel, output may not be valid PDF/A.)=
+ (\tColorConversionStrategy not a device space, falling back to ProcessColorModel, output may not be valid PDF/A.\n)=
true
} ifelse
} ifelse
} ifelse
} {
- (ColorConversionStrategy not set, falling back to ProcessColorModel, output may not be valid PDF/A.)=
+ (\tColorConversionStrategy not set, falling back to ProcessColorModel, output may not be valid PDF/A.\n)=
true
} ifelse
@@ -56,7 +56,7 @@
dup /DeviceCMYK eq {
pop /N 4
} {
- (ProcessColorModel not a device space.)=
+ (\tProcessColorModel not a device space.)=
/ProcessColorModel cvx /rangecheck signalerror
} ifelse
} ifelse
@@ -65,15 +65,27 @@
%% ----------8<--------------8<-------------8<--------------8<----------
>> /PUT pdfmark
-[{icc_PDFA} ICCProfile (r) file /PUT pdfmark
+[
+{icc_PDFA}
+{ICCProfile (r) file} stopped
+{
+ (\n\tFailed to open the supplied ICCProfile for reading. This may be due to\n) print
+ (\t an incorrect filename or a failure to add --permif-file-read=<profile>\n) print
+ (\t to the command line. This PostScript program needs to open the file\n) print
+ (\t and you must explicitly grant it permission to do so.\n\n) print
+ (\tPDF/A processing aborted, output may not be a PDF/A file.\n\n) print
+ cleartomark
+}
+{
+ /PUT pdfmark
+ % Define the output intent dictionary :
-% Define the output intent dictionary :
-
-[/_objdef {OutputIntent_PDFA} /type /dict /OBJ pdfmark
-[{OutputIntent_PDFA} <<
- /Type /OutputIntent % Must be so (the standard requires).
- /S /GTS_PDFA1 % Must be so (the standard requires).
- /DestOutputProfile {icc_PDFA} % Must be so (see above).
- /OutputConditionIdentifier (sRGB) % Customize
->> /PUT pdfmark
-[{Catalog} <</OutputIntents [ {OutputIntent_PDFA} ]>> /PUT pdfmark
+ [/_objdef {OutputIntent_PDFA} /type /dict /OBJ pdfmark
+ [{OutputIntent_PDFA} <<
+ /Type /OutputIntent % Must be so (the standard requires).
+ /S /GTS_PDFA1 % Must be so (the standard requires).
+ /DestOutputProfile {icc_PDFA} % Must be so (see above).
+ /OutputConditionIdentifier (sRGB) % Customize
+ >> /PUT pdfmark
+ [{Catalog} <</OutputIntents [ {OutputIntent_PDFA} ]>> /PUT pdfmark
+} ifelse
Modified: trunk/Master/tlpkg/tlgs/lib/afmdiff.awk
===================================================================
--- trunk/Master/tlpkg/tlgs/lib/afmdiff.awk 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/lib/afmdiff.awk 2021-09-29 01:02:39 UTC (rev 60648)
@@ -1,151 +1,151 @@
-#!/usr/bin/awk -f
-###=====================================================================
-### Read two Adobe Font Metric files, and compute tables of the
-### differences in character repertoire, declared widths (WX), and
-### bounding boxes.
-###
-### Usage:
-### awk -f afmdiff.awk file1.afm file2.afm
-###
-### Author:
-### Nelson H. F. Beebe
-### Center for Scientific Computing
-### University of Utah
-### Department of Mathematics, 322 INSCC
-### 155 S 1400 E RM 233
-### Salt Lake City, UT 84112-0090
-### USA
-### Email: beebe at math.utah.edu, beebe at acm.org, beebe at computer.org,
-### beebe at ieee.org (Internet)
-### WWW URL: http://www.math.utah.edu/~beebe
-### Telephone: +1 801 581 5254
-### FAX: +1 801 585 1640, +1 801 581 4148
-###
-########################################################################
-########################################################################
-########################################################################
-### ###
-### awkdiff.awk: compare two Adobe Font Metric files ###
-### ###
-### Copyright (C) 2000 Nelson H. F. Beebe ###
-### ###
-### This program is covered by the GNU General Public License (GPL), ###
-### version 2 or later, available as the file COPYING in the program ###
-### source distribution, and on the Internet at ###
-### ###
-### ftp://ftp.gnu.org/gnu/GPL ###
-### ###
-### http://www.gnu.org/copyleft/gpl.html ###
-### ###
-### This program is free software; you can redistribute it and/or ###
-### modify it under the terms of the GNU General Public License as ###
-### published by the Free Software Foundation; either version 2 of ###
-### the License, or (at your option) any later version. ###
-### ###
-### This program is distributed in the hope that it will be useful, ###
-### but WITHOUT ANY WARRANTY; without even the implied warranty of ###
-### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ###
-### GNU General Public License for more details. ###
-### ###
-### You should have received a copy of the GNU General Public ###
-### License along with this program; if not, write to the Free ###
-### Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, ###
-### MA 02111-1307 USA ###
-### ###
-### This program may also be distributed as part of AFPL ###
-### Ghostscript, under the terms of the Aladdin Free Public License ###
-### (the "License"). ###
-### ###
-### Every copy of AFPL Ghostscript must include a copy of the ###
-### License, normally in a plain ASCII text file named PUBLIC. The ###
-### License grants you the right to copy, modify and redistribute ###
-### AFPL Ghostscript, but only under certain conditions ###
-### described in the License. Among other things, the License ###
-### requires that the copyright notice and this notice be preserved ###
-### on all copies. ###
-### ###
-########################################################################
-########################################################################
-########################################################################
-#
-# [29-Apr-2000]
-#=======================================================================
-
-/^FontName/ { FontName[++NFontName] = $2 }
-
-
-/^C / {
- if (NFontName == 1)
- CharName1[$8]++
- if (NFontName == 2)
- CharName2[$8]++
- }
-
-
-/^C / {
- name = $8
- if (name in WX)
- {
- if (WX[name] != $5)
- WXDIFF[name] = WX[name] - $5
- }
- else
- WX[name] = $5
- }
-
-
-/^C / {
- name = $8
- bx = $13 - $11
- if (name in BX)
- {
- if (BX[name] != bx)
- BXDIFF[name] = BX[name] - bx
- }
- else
- BX[name] = bx
- }
-
-
-/^C / {
- name = $8
- by = $14 - $12
- if (name in BY)
- {
- if (BY[name] != by)
- BYDIFF[name] = BY[name] - by
- }
- else
- BY[name] = by
- }
-
-
-END {
- Sortpipe = "sort -f | pr -3 -w80 -l1 -t"
- print "Comparison of AFM metrics in files:", ARGV[1], ARGV[2]
- print "Font names:", FontName[1], FontName[2]
- show_name_diffs(FontName[2],CharName2, FontName[1],CharName1)
- show_name_diffs(FontName[1],CharName1, FontName[2],CharName2)
- show_num_diffs("WX width differences", WXDIFF)
- show_num_diffs("Bounding box width differences", BXDIFF)
- show_num_diffs("Bounding box height differences",BYDIFF)
- }
-
-function show_name_diffs(font1,array1,font2,array2, name)
-{
- print "\nChars from", font2, "missing from", font1 ":"
- for (name in array2)
- {
- if (!(name in array1))
- printf("%s\n", name) | Sortpipe
- }
- close(Sortpipe)
-}
-
-function show_num_diffs(title,array, name)
-{
- printf("\n%s:\n", title)
- for (name in array)
- printf("%-15s\t%4d\n", name, array[name]) | Sortpipe
- close(Sortpipe)
-}
+#!/usr/bin/awk -f
+###=====================================================================
+### Read two Adobe Font Metric files, and compute tables of the
+### differences in character repertoire, declared widths (WX), and
+### bounding boxes.
+###
+### Usage:
+### awk -f afmdiff.awk file1.afm file2.afm
+###
+### Author:
+### Nelson H. F. Beebe
+### Center for Scientific Computing
+### University of Utah
+### Department of Mathematics, 322 INSCC
+### 155 S 1400 E RM 233
+### Salt Lake City, UT 84112-0090
+### USA
+### Email: beebe at math.utah.edu, beebe at acm.org, beebe at computer.org,
+### beebe at ieee.org (Internet)
+### WWW URL: http://www.math.utah.edu/~beebe
+### Telephone: +1 801 581 5254
+### FAX: +1 801 585 1640, +1 801 581 4148
+###
+########################################################################
+########################################################################
+########################################################################
+### ###
+### awkdiff.awk: compare two Adobe Font Metric files ###
+### ###
+### Copyright (C) 2000 Nelson H. F. Beebe ###
+### ###
+### This program is covered by the GNU General Public License (GPL), ###
+### version 2 or later, available as the file COPYING in the program ###
+### source distribution, and on the Internet at ###
+### ###
+### ftp://ftp.gnu.org/gnu/GPL ###
+### ###
+### http://www.gnu.org/copyleft/gpl.html ###
+### ###
+### This program is free software; you can redistribute it and/or ###
+### modify it under the terms of the GNU General Public License as ###
+### published by the Free Software Foundation; either version 2 of ###
+### the License, or (at your option) any later version. ###
+### ###
+### This program is distributed in the hope that it will be useful, ###
+### but WITHOUT ANY WARRANTY; without even the implied warranty of ###
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ###
+### GNU General Public License for more details. ###
+### ###
+### You should have received a copy of the GNU General Public ###
+### License along with this program; if not, write to the Free ###
+### Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, ###
+### MA 02111-1307 USA ###
+### ###
+### This program may also be distributed as part of AFPL ###
+### Ghostscript, under the terms of the Aladdin Free Public License ###
+### (the "License"). ###
+### ###
+### Every copy of AFPL Ghostscript must include a copy of the ###
+### License, normally in a plain ASCII text file named PUBLIC. The ###
+### License grants you the right to copy, modify and redistribute ###
+### AFPL Ghostscript, but only under certain conditions ###
+### described in the License. Among other things, the License ###
+### requires that the copyright notice and this notice be preserved ###
+### on all copies. ###
+### ###
+########################################################################
+########################################################################
+########################################################################
+#
+# [29-Apr-2000]
+#=======================================================================
+
+/^FontName/ { FontName[++NFontName] = $2 }
+
+
+/^C / {
+ if (NFontName == 1)
+ CharName1[$8]++
+ if (NFontName == 2)
+ CharName2[$8]++
+ }
+
+
+/^C / {
+ name = $8
+ if (name in WX)
+ {
+ if (WX[name] != $5)
+ WXDIFF[name] = WX[name] - $5
+ }
+ else
+ WX[name] = $5
+ }
+
+
+/^C / {
+ name = $8
+ bx = $13 - $11
+ if (name in BX)
+ {
+ if (BX[name] != bx)
+ BXDIFF[name] = BX[name] - bx
+ }
+ else
+ BX[name] = bx
+ }
+
+
+/^C / {
+ name = $8
+ by = $14 - $12
+ if (name in BY)
+ {
+ if (BY[name] != by)
+ BYDIFF[name] = BY[name] - by
+ }
+ else
+ BY[name] = by
+ }
+
+
+END {
+ Sortpipe = "sort -f | pr -3 -w80 -l1 -t"
+ print "Comparison of AFM metrics in files:", ARGV[1], ARGV[2]
+ print "Font names:", FontName[1], FontName[2]
+ show_name_diffs(FontName[2],CharName2, FontName[1],CharName1)
+ show_name_diffs(FontName[1],CharName1, FontName[2],CharName2)
+ show_num_diffs("WX width differences", WXDIFF)
+ show_num_diffs("Bounding box width differences", BXDIFF)
+ show_num_diffs("Bounding box height differences",BYDIFF)
+ }
+
+function show_name_diffs(font1,array1,font2,array2, name)
+{
+ print "\nChars from", font2, "missing from", font1 ":"
+ for (name in array2)
+ {
+ if (!(name in array1))
+ printf("%s\n", name) | Sortpipe
+ }
+ close(Sortpipe)
+}
+
+function show_num_diffs(title,array, name)
+{
+ printf("\n%s:\n", title)
+ for (name in array)
+ printf("%-15s\t%4d\n", name, array[name]) | Sortpipe
+ close(Sortpipe)
+}
Modified: trunk/Master/tlpkg/tlgs/lib/cidfmap
===================================================================
--- trunk/Master/tlpkg/tlgs/lib/cidfmap 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/lib/cidfmap 2021-09-29 01:02:39 UTC (rev 60648)
@@ -1,5 +1,5 @@
%!
-% $Id: cidfmap 44039 2017-04-25 20:52:40Z reinhardk $
+% $Id: $
%
% This file is part of TeX Live.
% Don't edit this file. It will be overwritten by TeX Live updates.
Modified: trunk/Master/tlpkg/tlgs/lib/cidfmap.TeXLive
===================================================================
--- trunk/Master/tlpkg/tlgs/lib/cidfmap.TeXLive 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/lib/cidfmap.TeXLive 2021-09-29 01:02:39 UTC (rev 60648)
@@ -1,312 +1,312 @@
-% cidfmap.TeXLive
-% $Id: cidfmap.TeXLive 33323 2014-03-29 23:43:19Z reinhardk $
-
-% This file is part of TeXLive.
-% You may freely use, modify and/or distribute this file.
-
-% Don't edit this file. It will be overwritten by TeX Live updates.
-
-% This file has been composed from cidfmap files created under Windows XP
-% and Windows 7 using tlgs/lib/mkcidfm.ps. It supports fonts provided by
-% Microsoft. Fonts installed by 3rd-party software are not supported.
-% The Japanese IPA fonts which are part of TeX Live are supported too.
-
-% Substitutions
-% =============
-
-% The comments to the right of the semicolon denote availability.
-% Please note that fonts introduced in the listed versions of Windows
-% are also available in later versions.
-
-
-% Chinese, simplified
-% -------------------
-
-/ArialUnicodeMS-GB <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(GB1) 2]
- /Path (ARIALUNI.TTF) >> ; % W7
-
-/FangSong <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(GB1) 2]
- /Path (simfang.ttf) >> ; % Vista
-
-/KaiTi <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(GB1) 2]
- /Path (simkai.ttf) >> ; % Vista
-
-/MicrosoftYaHei <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(GB1) 2]
- /Path (msyh.ttf) >> ; % Vista
-
-/MicrosoftYaHeiBold <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(GB1) 2]
- /Path (msyhbd.ttf) >> ; % Vista
-
-/NSimSun <<
- /FileType /TrueType
- /SubfontID 1
- /CSI [(GB1) 2]
- /Path (simsun.ttc) >> ; % XP
-
-/SimHei <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(GB1) 2]
- /Path (simhei.ttf) >> ; % XP
-
-/SimSun <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(GB1) 2]
- /Path (simsun.ttc) >> ; % XP
-
-
-% Chinese, traditional
-% --------------------
-
-/ArialUnicodeMS-CNS <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(CNS1) 2]
- /Path (ARIALUNI.TTF) >> ; % W7
-
-/DFKaiShu-SB-Estd-BF <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(CNS1) 2]
- /Path (kaiu.ttf) >> ; % Vista
-
-/MicrosoftJhengHeiBold <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(CNS1) 2]
- /Path (msjhbd.ttf) >> ; % Vista
-
-/MicrosoftJhengHeiRegular <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(CNS1) 2]
- /Path (msjh.ttf) >> ; % Vista
-
-/MingLiU <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(CNS1) 2]
- /Path (mingliu.ttc) >> ; % XP
-
-/PMingLiU <<
- /FileType /TrueType
- /SubfontID 1
- /CSI [(CNS1) 2]
- /Path (mingliu.ttc) >> ; % XP
-
-
-% Japanese
-% --------
-
-/ArialUnicodeMS-JP <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(Japan1) 3]
- /Path (ARIALUNI.TTF) >> ; % W7
-
-/MS-Gothic <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(Japan1) 3]
- /Path (msgothic.ttc) >> ; % XP
-
-/MS-Mincho <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(Japan1) 3]
- /Path (msmincho.ttc) >> ; % XP
-
-/MS-PGothic <<
- /FileType /TrueType
- /SubfontID 1
- /CSI [(Japan1) 3]
- /Path (msgothic.ttc) >> ; % XP
-
-/MS-PMincho <<
- /FileType /TrueType
- /SubfontID 1
- /CSI [(Japan1) 3]
- /Path (msmincho.ttc) >> ; % XP
-
-/MS-UI-Gothic <<
- /FileType /TrueType
- /SubfontID 2
- /CSI [(Japan1) 3]
- /Path (msgothic.ttc) >> ; % XP
-
-/Meiryo <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(Japan1) 3]
- /Path (meiryo.ttc) >> ; % Vista
-
-/Meiryo-Bold <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(Japan1) 3]
- /Path (meiryob.ttc) >> ; % Vista
-
-/Meiryo-BoldItalic <<
- /FileType /TrueType
- /SubfontID 1
- /CSI [(Japan1) 3]
- /Path (meiryob.ttc) >> ; % Vista
-
-/Meiryo-Italic <<
- /FileType /TrueType
- /SubfontID 1
- /CSI [(Japan1) 3]
- /Path (meiryo.ttc) >> ; % Vista
-
-/IPAexMincho <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(Japan1) 6]
- /Path (truetype/public/ipaex/ipaexm.ttf) >> ; % TeX Live
-
-/IPAexGothic <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(Japan1) 6]
- /Path (truetype/public/ipaex/ipaexg.ttf) >> ; % TeX Live
-
-/IPAMincho <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(Japan1) 6]
- /Path (truetype/public/ipaex/ipam.ttf) >> ; % TeX Live
-
-/IPAGothic <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(Japan1) 6]
- /Path (truetype/public/ipaex/ipag.ttf) >> ; % TeX Live
-
-
-% Korean
-% ------
-
-/ArialUnicodeMS-KR <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(Korea1) 3]
- /Path (ARIALUNI.TTF) >> ; % W7
-
-/Batang <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(Korea1) 3]
- /Path (batang.ttc) >> ; % XP
-
-/BatangChe <<
- /FileType /TrueType
- /SubfontID 1
- /CSI [(Korea1) 3]
- /Path (batang.ttc) >> ; % XP
-
-/Dotum <<
- /FileType /TrueType
- /SubfontID 2
- /CSI [(Korea1) 3]
- /Path (gulim.ttc) >> ; % XP
-
-/DotumChe <<
- /FileType /TrueType
- /SubfontID 3
- /CSI [(Korea1) 3]
- /Path (gulim.ttc) >> ; % XP
-
-/Gulim <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(Korea1) 3]
- /Path (gulim.ttc) >> ; % XP
-
-/GulimChe <<
- /FileType /TrueType
- /SubfontID 1
- /CSI [(Korea1) 3]
- /Path (gulim.ttc) >> ; % XP
-
-/Gungsuh <<
- /FileType /TrueType
- /SubfontID 2
- /CSI [(Korea1) 3]
- /Path (batang.ttc) >> ; % XP
-
-/GungsuhChe <<
- /FileType /TrueType
- /SubfontID 3
- /CSI [(Korea1) 3]
- /Path (batang.ttc) >> ; % XP
-
-/MalgunGothicBold <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(Korea1) 3]
- /Path (malgunbd.ttf) >> ; % Vista
-
-/MalgunGothicRegular <<
- /FileType /TrueType
- /SubfontID 0
- /CSI [(Korea1) 3]
- /Path (malgun.ttf) >> ; % Vista
-
-
-% Aliases for Windows XP and later versions
-% =========================================
-
-% Chinese, simplified
-% -------------------
-
-/AdobeHeitiStd-Regular /SimHei ;
-/AdobeSongStd-Light /SimSun ;
-/STFangsong-Light /SimSun ;
-/STHeiti-Regular /SimHei ;
-/STKaiti-Regular /SimHei ;
-/STSong-Light /SimSun ;
-
-% Chinese, traditional
-% --------------------
-
-/AdobeMingStd-Light /MingLiU ;
-/MHei-Medium /MingLiU ;
-/MKai-Medium /MingLiU ;
-/MSung-Light /MingLiU ;
-/MSung-Medium /MingLiU ;
-
-% Japanese
-% --------
-
-/GothicBBB-Medium /MS-Gothic ;
-/HeiseiKakuGo-W5 /MS-Gothic ;
-/HeiseiMin-W3 /MS-Mincho ;
-/KozMinPr6N-Regular /MS-Mincho ;
-/Ryumin-Light /MS-Mincho ;
-/Ryumin-Medium /MS-Mincho ;
-
-% Korean
-% ------
-
-/AdobeMyungjoStd-Medium /Batang ;
-/HYGoThic-Medium /Dotum ;
-/HYRGoThic-Medium /Gulim ;
-/HYSMyeongJo-Medium /Batang ;
-
-%%EOF
+% cidfmap.TeXLive
+% $Id: $
+
+% This file is part of TeXLive.
+% You may freely use, modify and/or distribute this file.
+
+% Don't edit this file. It will be overwritten by TeX Live updates.
+
+% This file has been composed from cidfmap files created under Windows XP
+% and Windows 7 using tlgs/lib/mkcidfm.ps. It supports fonts provided by
+% Microsoft. Fonts installed by 3rd-party software are not supported.
+% The Japanese IPA fonts which are part of TeX Live are supported too.
+
+% Substitutions
+% =============
+
+% The comments to the right of the semicolon denote availability.
+% Please note that fonts introduced in the listed versions of Windows
+% are also available in later versions.
+
+
+% Chinese, simplified
+% -------------------
+
+/ArialUnicodeMS-GB <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ /Path (ARIALUNI.TTF) >> ; % W7
+
+/FangSong <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ /Path (simfang.ttf) >> ; % Vista
+
+/KaiTi <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ /Path (simkai.ttf) >> ; % Vista
+
+/MicrosoftYaHei <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ /Path (msyh.ttf) >> ; % Vista
+
+/MicrosoftYaHeiBold <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ /Path (msyhbd.ttf) >> ; % Vista
+
+/NSimSun <<
+ /FileType /TrueType
+ /SubfontID 1
+ /CSI [(GB1) 2]
+ /Path (simsun.ttc) >> ; % XP
+
+/SimHei <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ /Path (simhei.ttf) >> ; % XP
+
+/SimSun <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ /Path (simsun.ttc) >> ; % XP
+
+
+% Chinese, traditional
+% --------------------
+
+/ArialUnicodeMS-CNS <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(CNS1) 2]
+ /Path (ARIALUNI.TTF) >> ; % W7
+
+/DFKaiShu-SB-Estd-BF <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(CNS1) 2]
+ /Path (kaiu.ttf) >> ; % Vista
+
+/MicrosoftJhengHeiBold <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(CNS1) 2]
+ /Path (msjhbd.ttf) >> ; % Vista
+
+/MicrosoftJhengHeiRegular <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(CNS1) 2]
+ /Path (msjh.ttf) >> ; % Vista
+
+/MingLiU <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(CNS1) 2]
+ /Path (mingliu.ttc) >> ; % XP
+
+/PMingLiU <<
+ /FileType /TrueType
+ /SubfontID 1
+ /CSI [(CNS1) 2]
+ /Path (mingliu.ttc) >> ; % XP
+
+
+% Japanese
+% --------
+
+/ArialUnicodeMS-JP <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(Japan1) 3]
+ /Path (ARIALUNI.TTF) >> ; % W7
+
+/MS-Gothic <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(Japan1) 3]
+ /Path (msgothic.ttc) >> ; % XP
+
+/MS-Mincho <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(Japan1) 3]
+ /Path (msmincho.ttc) >> ; % XP
+
+/MS-PGothic <<
+ /FileType /TrueType
+ /SubfontID 1
+ /CSI [(Japan1) 3]
+ /Path (msgothic.ttc) >> ; % XP
+
+/MS-PMincho <<
+ /FileType /TrueType
+ /SubfontID 1
+ /CSI [(Japan1) 3]
+ /Path (msmincho.ttc) >> ; % XP
+
+/MS-UI-Gothic <<
+ /FileType /TrueType
+ /SubfontID 2
+ /CSI [(Japan1) 3]
+ /Path (msgothic.ttc) >> ; % XP
+
+/Meiryo <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(Japan1) 3]
+ /Path (meiryo.ttc) >> ; % Vista
+
+/Meiryo-Bold <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(Japan1) 3]
+ /Path (meiryob.ttc) >> ; % Vista
+
+/Meiryo-BoldItalic <<
+ /FileType /TrueType
+ /SubfontID 1
+ /CSI [(Japan1) 3]
+ /Path (meiryob.ttc) >> ; % Vista
+
+/Meiryo-Italic <<
+ /FileType /TrueType
+ /SubfontID 1
+ /CSI [(Japan1) 3]
+ /Path (meiryo.ttc) >> ; % Vista
+
+/IPAexMincho <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(Japan1) 6]
+ /Path (truetype/public/ipaex/ipaexm.ttf) >> ; % TeX Live
+
+/IPAexGothic <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(Japan1) 6]
+ /Path (truetype/public/ipaex/ipaexg.ttf) >> ; % TeX Live
+
+/IPAMincho <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(Japan1) 6]
+ /Path (truetype/public/ipaex/ipam.ttf) >> ; % TeX Live
+
+/IPAGothic <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(Japan1) 6]
+ /Path (truetype/public/ipaex/ipag.ttf) >> ; % TeX Live
+
+
+% Korean
+% ------
+
+/ArialUnicodeMS-KR <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(Korea1) 3]
+ /Path (ARIALUNI.TTF) >> ; % W7
+
+/Batang <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(Korea1) 3]
+ /Path (batang.ttc) >> ; % XP
+
+/BatangChe <<
+ /FileType /TrueType
+ /SubfontID 1
+ /CSI [(Korea1) 3]
+ /Path (batang.ttc) >> ; % XP
+
+/Dotum <<
+ /FileType /TrueType
+ /SubfontID 2
+ /CSI [(Korea1) 3]
+ /Path (gulim.ttc) >> ; % XP
+
+/DotumChe <<
+ /FileType /TrueType
+ /SubfontID 3
+ /CSI [(Korea1) 3]
+ /Path (gulim.ttc) >> ; % XP
+
+/Gulim <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(Korea1) 3]
+ /Path (gulim.ttc) >> ; % XP
+
+/GulimChe <<
+ /FileType /TrueType
+ /SubfontID 1
+ /CSI [(Korea1) 3]
+ /Path (gulim.ttc) >> ; % XP
+
+/Gungsuh <<
+ /FileType /TrueType
+ /SubfontID 2
+ /CSI [(Korea1) 3]
+ /Path (batang.ttc) >> ; % XP
+
+/GungsuhChe <<
+ /FileType /TrueType
+ /SubfontID 3
+ /CSI [(Korea1) 3]
+ /Path (batang.ttc) >> ; % XP
+
+/MalgunGothicBold <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(Korea1) 3]
+ /Path (malgunbd.ttf) >> ; % Vista
+
+/MalgunGothicRegular <<
+ /FileType /TrueType
+ /SubfontID 0
+ /CSI [(Korea1) 3]
+ /Path (malgun.ttf) >> ; % Vista
+
+
+% Aliases for Windows XP and later versions
+% =========================================
+
+% Chinese, simplified
+% -------------------
+
+/AdobeHeitiStd-Regular /SimHei ;
+/AdobeSongStd-Light /SimSun ;
+/STFangsong-Light /SimSun ;
+/STHeiti-Regular /SimHei ;
+/STKaiti-Regular /SimHei ;
+/STSong-Light /SimSun ;
+
+% Chinese, traditional
+% --------------------
+
+/AdobeMingStd-Light /MingLiU ;
+/MHei-Medium /MingLiU ;
+/MKai-Medium /MingLiU ;
+/MSung-Light /MingLiU ;
+/MSung-Medium /MingLiU ;
+
+% Japanese
+% --------
+
+/GothicBBB-Medium /MS-Gothic ;
+/HeiseiKakuGo-W5 /MS-Gothic ;
+/HeiseiMin-W3 /MS-Mincho ;
+/KozMinPr6N-Regular /MS-Mincho ;
+/Ryumin-Light /MS-Mincho ;
+/Ryumin-Medium /MS-Mincho ;
+
+% Korean
+% ------
+
+/AdobeMyungjoStd-Medium /Batang ;
+/HYGoThic-Medium /Dotum ;
+/HYRGoThic-Medium /Gulim ;
+/HYSMyeongJo-Medium /Batang ;
+
+%%EOF
Modified: trunk/Master/tlpkg/tlgs/lib/gslp.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/lib/gslp.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/lib/gslp.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -38,10 +38,13 @@
% --detect
% treat the file as PostScript if it starts with %!
% --first-page <n>
-% --duplex(|-long-edge|-short-edge)
-% use duplex if available; if not specified, select long edge
-% for portrait printing, short edge for landscape
+% --duplex(|-long-edge|-short-edge)
+% use duplex if available; if not specified, select long edge
+% for portrait printing, short edge for landscape
% start printing at page <n>
+% --encoding <encodingname> default ISOLatin1Encoding
+% Note this only takes effect during -f or -F option thus the
+% body text and header text can use different encodings.
% --kern <file.afm>
% kern using information from the given .AFM file
% --last-page <n>
@@ -60,17 +63,26 @@
/lpdict 150 dict def
lpdict begin
-% build iso-latin-1 version of a font
-/font-to-iso-latin-1 { % <font> font-to-iso-latin-1 <font>
+/encoding /ISOLatin1Encoding def % the default encoding
+
+% build a version of the font with the requested encoding (default ISOLatin1)
+/font-to-encoding { % <font> font-to-encoding <font>
%% reencode for iso latin1; from the 2nd edition red book, sec 5.6.1
dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall
- /Encoding ISOLatin1Encoding def currentdict end
- dup /FontName get 80 string cvs (-ISOLatin1) concatstrings cvn
+ /Encoding encoding /Encoding findresource readonly def
+ currentdict end
+ % strip off the "Encoding" part of the encoding (if present)
+ dup /FontName get 80 string cvs
+ encoding 256 string cvs (Encoding) search {
+ exch pop exch pop
+ } if
+ exch (-) concatstrings exch
+ concatstrings cvn
exch definefont
} def
/find-latin-font { % <name> find-latin-font <font>
- findfont font-to-iso-latin-1
+ findfont font-to-encoding
} def
% Define the initial values of the printing parameters.
@@ -275,14 +287,17 @@
/StringTAB (\t) def
/CharTAB StringTAB 0 get def
-/showline % line -> leftover_line (handles \f)
- { { showline1 dup length 0 eq { exit } if
- dup 0 get CharFF ne { exit } if
+/showline { % line -> leftover_line (handles \f)
+ { showline1 dup length 0 eq { exit } if
+ dup 0 get CharFF ne {
+ Truncate { pop () } if
+ exit
+ } if
EjectFF { endpage beginpage } { endcolumn } ifelse
skip1
- }
+ }
loop
- } def
+} def
/showline1 % line -> leftover_line (handles page break)
{ lindex llength eq { endpage beginpage } if
@@ -409,9 +424,9 @@
/S {currentfile =string readline pop show} lpdef
/RE { % <isoname> <fontname> RE <font>
findfont
- %% reencode for iso latin1; from the 2nd edition red book, sec 5.6.1
+ %% reencode for current 'encoding' from the 2nd edition red book, sec 5.6.1
dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall
- /Encoding ISOLatin1Encoding def currentdict end
+ /Encoding encoding def currentdict end
definefont
} lpdef
} def
@@ -506,24 +521,31 @@
% Iterate through the file.
lpline
- { dup length /pos exch def
- lbuf exch 0 exch putinterval
- { lpfile lbuf pos lbuf length pos sub getinterval readline } stopped
- { % Filled the line before a CR or EOF.
- exch pop showline
- }
- { % Reached CR and/or EOF first.
+ % First handle new-lines in the initial string (--detect mode)
+ (\n) search {
+ showline % output up to the first new-line
+ pop pop % done with that string and the new-line
+ (\n) search {
+ showline % output the second new-line
+ pop pop % done
+ } if
+ } if
+ { dup length /pos exch def
+ lbuf exch 0 exch putinterval
+ { lpfile lbuf pos lbuf length pos sub getinterval readline } stopped
+ { % Filled the line before a CR or EOF.
+ exch pop showline
+ }
+ { % Reached CR and/or EOF first.
exch length pos add lbuf exch 0 exch getinterval
1 index { showline } if % omit final empty line
- { dup length 0 eq Truncate or { pop () exit } if
+ { dup length 0 eq { pop () exit } if
showline
- }
- loop
+ } loop
exch not { exit } if
- }
- ifelse
+ } ifelse
pindex PageLast gt { exit } if
- } loop
+ } loop
pop
% Wrap up.
@@ -588,6 +610,7 @@
/--duplex { /Duplex {Landscape} def } def
/--duplex-long-edge { /Duplex false def } def
/--duplex-short-edge { /Duplex true def } def
+/--encoding { cvn /encoding exch def } def
/--first-page { cvi /PageFirst exch def } def
/--footing-center { /FootingCenter exch def /Footers true def } def
/--footing-left { /FootingLeft exch def /Footers true def } def
Modified: trunk/Master/tlpkg/tlgs/lib/viewgif.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/lib/viewgif.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/lib/viewgif.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -42,7 +42,9 @@
GlobalColor
{ PaletteSize 3 mul string readstring pop
/GlobalPalette exch def
- } if
+ } {
+ pop
+ } ifelse
currentdict end
} bind def
@@ -159,7 +161,7 @@
} bind def
% This lets you do stuff on the command line like:
-% gs -sDEVICE=pdfwrite -o stuff%03d.pdf viewgif.ps -c "(image.gif) << /PageSize 2 index viewGIFgetsize 2 array astore >> setpagedevice viewGIF"
+% gs -sDEVICE=pdfwrite -o stuff%03d.pdf viewgif.ps -c "(image.gif) << /PageSize 2 index viewGIFgetsize 2 array astore /HWResolution [ 72 72 ] >> setpagedevice viewGIF"
% so the output size is influenced by the original image.
/viewGIFgetsize % <file|string> ==> [width height]
{
Modified: trunk/Master/tlpkg/tlgs/lib/zugferd.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/lib/zugferd.ps 2021-09-28 23:48:53 UTC (rev 60647)
+++ trunk/Master/tlpkg/tlgs/lib/zugferd.ps 2021-09-29 01:02:39 UTC (rev 60648)
@@ -1,3 +1,5 @@
+%!PS
+
% Copyright (C) 2001-2021 Artifex Software, Inc.
% All Rights Reserved.
%
@@ -12,38 +14,68 @@
% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
% CA 94945, U.S.A., +1(415)492-9861, for further information.
%
-% zugferd.ps
-% This program will create an (unsigned) ZUGFeRD compliant PDF file. In
-% order to do so the user must provide certain information, or edit this program.
+% ZUGFeRD.ps
+% This program will create an (unsigned) ZUGFeRD compliant PDF file.
+% In order to do so the user must provide certain information, or edit
+% this program.
%
-% Required information is the path to the XML file containing the invoice data,
-% and the path to an ICC profile appropriate for the chosen ColorConversionStrategy.
-% -sZUGFeRDXMLFile defines a path to the XML invoice file and -sZUGFeRDProfile
-% defines the path to the ICC profile.
+% Required information is the path to the XML file containing the invoice
+% data, and the path to an ICC profile appropriate for the chosen
+% ColorConversionStrategy.
%
-% The user must additionally set -dPDFA=3 and -sColorConversionStrategy on the
-% Ghostscript command line, and set the permissions for Ghostscript to read
-% both these files. It is simplest to put the files in a directory and then
-% permit reading of the entire directory.
+% -sZUGFeRDXMLFile defines a path to the XML invoice file.
%
+% -sZUGFeRDProfile defines the path to the ICC profile.
+%
+% -sZUGFeRDVersion defines the version of the ZUGFeRD standard to be used.
+% Missing or invalid values would be silently replaced by the default ("2p1").
+%
+% -sZUGFeRDConformanceLevel defines the level of conformance.
+% Missing or invalid values would be silently replaced by the default ("BASIC").
+%
+% Note that the ZUGFeRD standard states:
+%
+% The content of the field fx:ConformanceLevel has to be picked from
+% the content of the element "GuidelineSpecifiedDocumentContextParameter"
+% (specification identifier BT-24) of the XML instance file.
+%
+% The user must additionally set -dPDFA=3 and -sColorConversionStrategy
+% on the Ghostscript command line, and set the permissions for Ghostscript
+% to read both these files. It is simplest to put the files in a directory
+% and then permit reading of the entire directory.
+%
% Example command line :
%
-% gs --permit-file-read=/usr/home/me/zugferd/ -sDEVICE=pdfwrite -dPDFA=3 -sColorConversionStrategy=RGB \
-% -sZUGFeRDXMLFile=/usr/home/me/zugferd/invoice.xml -sZUGFeRDProfile=/usr/home/me/rgb.icc \
-% -o /usr/home/me/zugferd/zugferd.pdf /usr/home/me/zugferd/zugferd.ps /usr/home/me/zugferd/original.pdf
+% gs --permit-file-read=/usr/home/me/zugferd/ \
+% -sDEVICE=pdfwrite \
+% -dPDFA=3 \
+% -sColorConversionStrategy=RGB \
+% -sZUGFeRDXMLFile=/usr/home/me/zugferd/invoice.xml \
+% -sZUGFeRDProfile=/usr/home/me/zugferd/rgb.icc \
+% -sZUGFeRDVersion=2p1 \
+% -sZUGFeRDConformanceLevel=BASIC \
+% -o /usr/home/me/zugferd/zugferd.pdf \
+% /usr/home/me/zugferd/zugferd.ps \
+% /usr/home/me/zugferd/original.pdf
%
-% Much of this program results from a Ghostscript bug report, the thread can be found at
-% https://bugs.ghostscript.com/show_bug.cgi?id=696472 Portions of the code below were
-% supplied by Reinhard Nissl and I'm indebted to him for his efforts in helping me create
-% a solution for this problem as well as for the code he supplied, particularly for the
+% Much of this program results from a Ghostscript bug report, the thread
+% can be found at
+% https://bugs.ghostscript.com/show_bug.cgi?id=696472
+% Portions of the code below were supplied by Reinhard Nissl and
+% I'm indebted to him for his efforts in helping me create a solution for
+% this problem as well as for the code he supplied, particularly for the
% SimpleUTF16BE routine.
%
-% It should not be necessary to modify this program, the comments in the code are there purely for information,
-% but there are two areas which might reasonably be altered. The section with the --8<-- lines could be replaced
-% with a simpler /N 3 or /N 4 if you always intend to produce the same kind of files; RGB or CMYK.
-% In step 7, the large XML string will need to be replaced if you want to produce a ZUGFeRD 2.1
-% file, and in future may require similar modification for later versions.
+% The program was further refined and expanded by Adrian Devries in :
+% https://bugs.ghostscript.com/show_bug.cgi?id=703862
%
+% It should not be necessary to modify this program, the comments in the
+% code are there purely for information, but there is one area which
+% might reasonably be altered. The section with the --8<-- lines could be
+% replaced with a simpler /N 3 or /N 4 if you always intend to produce
+% the same kind of files; RGB or CMYK.
+%
+% Remaining tasks have been marked with "TODO".
% istring SimpleUTF16BE ostring
/SimpleUTF16BE
@@ -52,13 +84,11 @@
1 add
2 mul
string
-
% istring ostring
dup 0 16#FE put
dup 1 16#FF put
2
3 -1 roll
-
% ostring index istring
{
% ostring index ichar
@@ -74,12 +104,246 @@
% ostring index
}
forall
-
% ostring index
pop
}
bind def
+% Cf. https://en.wikibooks.org/wiki/PostScript_FAQ#How_to_concatenate_strings%3F
+/concatstringarray { % [(a) (b) ... (z)] --> (ab...z)
+ 0 1 index {
+ length add
+ } forall
+ string
+ 0 3 2 roll {
+ 3 copy putinterval
+ length add
+ } forall
+ pop
+} bind def
+
+/ZUGFeRDVersion where {
+ pop % Discard the dictionary
+ ZUGFeRDVersion (rc) ne {
+ ZUGFeRDVersion (1p0) ne {
+ ZUGFeRDVersion (2p0) ne {
+ ZUGFeRDVersion (2p1) ne {
+ /ZUGFeRDVersion (2p1) def
+ } if
+ } if
+ } if
+ } if
+}{
+ /ZUGFeRDVersion (2p1) def
+} ifelse
+
+/ZUGFeRDConformanceLevel where {
+ pop % Discard the dictionary
+ ZUGFeRDVersion (rc) eq
+ ZUGFeRDVersion (1p0) eq or {
+ ZUGFeRDConformanceLevel (BASIC) ne {
+ ZUGFeRDConformanceLevel (COMFORT) ne {
+ ZUGFeRDConformanceLevel (EXTENDED) ne {
+ /ZUGFeRDConformanceLevel (BASIC) def
+ } if
+ } if
+ } if
+ } if
+ ZUGFeRDVersion (2p0) eq
+ ZUGFeRDVersion (2p1) eq or {
+ ZUGFeRDConformanceLevel (MINIMUM) ne {
+ ZUGFeRDConformanceLevel (BASIC WL) ne {
+ ZUGFeRDConformanceLevel (BASIC) ne {
+ ZUGFeRDConformanceLevel (EN 16931) ne {
+ ZUGFeRDConformanceLevel (EXTENDED) ne {
+ ZUGFeRDConformanceLevel (XRECHNUNG) ne {
+ /ZUGFeRDConformanceLevel (BASIC) def
+ } if
+ } if
+ } if
+ } if
+ } if
+ } if
+ } if
+}{
+ /ZUGFeRDConformanceLevel (BASIC) def
+} ifelse
+
+% ZUGFeRDSchema
+/ZUGFeRDSchema () def
+ZUGFeRDVersion (rc) eq
+ZUGFeRDVersion (1p0) eq or
+ZUGFeRDVersion (2p0) eq or {
+ /ZUGFeRDSchema (ZUGFeRD PDFA Extension Schema) def
+} if
+ZUGFeRDVersion (2p1) eq {
+ /ZUGFeRDSchema (Factur-X PDFA Extension Schema) def
+} if
+
+% ZUGFeRDNamespaceURI
+/ZUGFeRDNamespaceURI () def
+ZUGFeRDVersion (rc) eq {
+ /ZUGFeRDNamespaceURI (urn:ferd:pdfa:invoice:rc#) def
+} if
+ZUGFeRDVersion (1p0) eq {
+ /ZUGFeRDNamespaceURI (urn:ferd:pdfa:CrossIndustryDocument:invoice:1p0#) def
+} if
+ZUGFeRDVersion (2p0) eq {
+ /ZUGFeRDNamespaceURI (urn:zugferd:pdfa:CrossIndustryDocument:invoice:2p0#) def
+} if
+ZUGFeRDVersion (2p1) eq {
+ /ZUGFeRDNamespaceURI (urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#) def
+} if
+
+% ZUGFeRDPrefix
+/ZUGFeRDPrefix () def
+ZUGFeRDVersion (rc) eq
+ZUGFeRDVersion (1p0) eq or
+ZUGFeRDVersion (2p0) eq or {
+ /ZUGFeRDPrefix (zf) def
+} if
+ZUGFeRDVersion (2p1) eq {
+ /ZUGFeRDPrefix (fx) def
+} if
+
+% ZUGFeRDVersionDescription
+/ZUGFeRDVersionDescription () def
+ZUGFeRDVersion (rc) eq
+ZUGFeRDVersion (1p0) eq or
+ZUGFeRDVersion (2p0) eq or {
+ /ZUGFeRDVersionDescription (The actual version of the ZUGFeRD XML schema) def
+} if
+ZUGFeRDVersion (2p1) eq {
+ /ZUGFeRDVersionDescription (The actual version of the Factur-X XML schema) def
+} if
+
+% ZUGFeRDConformanceLevelDescription
+/ZUGFeRDConformanceLevelDescription () def
+ZUGFeRDVersion (rc) eq
+ZUGFeRDVersion (1p0) eq or
+ZUGFeRDVersion (2p0) eq or {
+ /ZUGFeRDConformanceLevelDescription (The conformance level of the embedded ZUGFeRD data) def
+} if
+ZUGFeRDVersion (2p1) eq {
+ /ZUGFeRDConformanceLevelDescription (The conformance level of the embedded Factur-X data) def
+} if
+
+% ZUGFeRDDocumentFileName
+/ZUGFeRDDocumentFileName () def
+ZUGFeRDVersion (rc) eq {
+ /ZUGFeRDDocumentFileName (ZUGFeRD-invoice.xml) def
+} if
+ZUGFeRDVersion (1p0) eq {
+ /ZUGFeRDDocumentFileName (ZUGFeRD-invoice.xml) def
+} if
+ZUGFeRDVersion (2p0) eq {
+ ZUGFeRDConformanceLevel (XRECHNUNG) ne {
+ /ZUGFeRDDocumentFileName (zugferd-invoice.xml) def
+ }{
+ /ZUGFeRDDocumentFileName (xrechnung.xml) def
+ } ifelse
+} if
+ZUGFeRDVersion (2p1) eq {
+ ZUGFeRDConformanceLevel (XRECHNUNG) ne {
+ /ZUGFeRDDocumentFileName (factur-x.xml) def
+ }{
+ /ZUGFeRDDocumentFileName (xrechnung.xml) def
+ } ifelse
+} if
+
+% ZUGFeRDVersionData
+/ZUGFeRDVersionData () def
+ZUGFeRDVersion (rc) eq {
+ /ZUGFeRDVersionData (RC) def
+} if
+ZUGFeRDVersion (1p0) eq {
+ /ZUGFeRDVersionData (1.0) def
+} if
+ZUGFeRDVersion (2p0) eq {
+ ZUGFeRDConformanceLevel (XRECHNUNG) ne {
+ /ZUGFeRDVersionData (2p0) def
+ }{
+ /ZUGFeRDVersionData (1p2) def
+ } ifelse
+} if
+ZUGFeRDVersion (2p1) eq {
+ ZUGFeRDConformanceLevel (XRECHNUNG) ne {
+ /ZUGFeRDVersionData (1.0) def
+ }{
+ /ZUGFeRDVersionData (1p2) def
+ } ifelse
+} if
+
+/ZUGFeRDMetadata [
+(
+<rdf:Description)
+( xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/")
+( xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#")
+( xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema#")
+( rdf:about="">
+ <pdfaExtension:schemas>
+ <rdf:Bag>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaSchema:schema>)ZUGFeRDSchema(</pdfaSchema:schema>
+ <pdfaSchema:namespaceURI>)ZUGFeRDNamespaceURI(</pdfaSchema:namespaceURI>
+ <pdfaSchema:prefix>)ZUGFeRDPrefix(</pdfaSchema:prefix>
+ <pdfaSchema:property>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:name>DocumentFileName</pdfaProperty:name>
+ <pdfaProperty:valueType>Text</pdfaProperty:valueType>
+ <pdfaProperty:category>external</pdfaProperty:category>
+ <pdfaProperty:description>Name of the embedded XML invoice file</pdfaProperty:description>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:name>DocumentType</pdfaProperty:name>
+ <pdfaProperty:valueType>Text</pdfaProperty:valueType>
+ <pdfaProperty:category>external</pdfaProperty:category>
+ <pdfaProperty:description>INVOICE</pdfaProperty:description>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:name>Version</pdfaProperty:name>
+ <pdfaProperty:valueType>Text</pdfaProperty:valueType>
+ <pdfaProperty:category>external</pdfaProperty:category>
+ <pdfaProperty:description>)ZUGFeRDVersionDescription(</pdfaProperty:description>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:name>ConformanceLevel</pdfaProperty:name>
+ <pdfaProperty:valueType>Text</pdfaProperty:valueType>
+ <pdfaProperty:category>external</pdfaProperty:category>
+ <pdfaProperty:description>)ZUGFeRDConformanceLevelDescription(</pdfaProperty:description>
+ </rdf:li>
+ </rdf:Seq>
+ </pdfaSchema:property>
+ </rdf:li>
+ </rdf:Bag>
+ </pdfaExtension:schemas>
+</rdf:Description>
+<rdf:Description xmlns:)ZUGFeRDPrefix(=")ZUGFeRDNamespaceURI(" rdf:about="">
+ <)ZUGFeRDPrefix(:ConformanceLevel>)ZUGFeRDConformanceLevel(</)ZUGFeRDPrefix(:ConformanceLevel>
+ <)ZUGFeRDPrefix(:DocumentFileName>)ZUGFeRDDocumentFileName(</)ZUGFeRDPrefix(:DocumentFileName>
+ <)ZUGFeRDPrefix(:DocumentType>INVOICE</)ZUGFeRDPrefix(:DocumentType>
+ <)ZUGFeRDPrefix(:Version>)ZUGFeRDVersionData(</)ZUGFeRDPrefix(:Version>
+</rdf:Description>
+)
+ ] concatstringarray def
+
+/Usage {
+ (example usage: \n) print
+ ( gs --permit-file-read=/usr/home/me/zugferd/ \\\n) print
+ ( -sDEVICE=pdfwrite \\\n) print
+ ( -dPDFA=3 \\\n) print
+ ( -sColorConversionStrategy=RGB \\\n) print
+ ( -sZUGFeRDXMLFile=/usr/home/me/zugferd/invoice.xml \\\n) print
+ ( -sZUGFeRDProfile=/usr/home/me/zugferd\rgb.icc \\\n) print
+ ( -sZUGFeRDVersion=2p1 \\\n) print
+ ( -sZUGFeRDConformanceLevel=BASIC \\\n) print
+ ( -o /usr/home/me/zugferd/zugferd.pdf \\\n) print
+ ( /usr/home/me/zugferd/zugferd.ps \\\n) print
+ ( /usr/home/me/zugferd/original.pdf \n) print
+ flush
+} def
+
% First check that the user has defined the XML invoice file on the command line
%
/ZUGFeRDXMLFile where {
@@ -90,7 +354,9 @@
/ZUGFeRDProfile where {
pop % Discard the dictionary
- % Step 1, add the required PDF/A boilerplate. This is mostly copied from lib/pdfa_de.ps
+ % Step 1, add the required PDF/A boilerplate.
+ % This is mostly copied from lib/pdfa_def.ps
+
% Create a PDF stream object to hold the ICC profile.
[ /_objdef {icc_PDFA} /type /stream /OBJ pdfmark
@@ -157,45 +423,43 @@
/Type /OutputIntent
/S /GTS_PDFA1 % Required for PDF/A.
/DestOutputProfile {icc_PDFA} % The actual profile.
- /OutputConditionIdentifier (Custom) % A better solution is a string from the ICC Registry, but Custom is always valid.
+ /OutputConditionIdentifier (Custom) % TODO: A better solution is a
+ % a string from the ICC
+ % Registry, but Custom
+ % is always valid.
>> /PUT pdfmark
% And now add the OutputIntent to the Catalog dictionary
[ {Catalog} << /OutputIntents [ {OutputIntent_PDFA} ]>> /PUT pdfmark
-
% Step 2, define the XML file and read it into the PDF
% First we define the PDF stream to contain the XML invoice
[ /_objdef {InvoiceStream} /type /stream /OBJ pdfmark
-
% Fill in the dictionary elements we need. We believe the
% ModDate is not useful so it's just set to a valid value.
[ {InvoiceStream} <<
- /Type /EmbeddedFile
- /Subtype (text/xml) cvn
+ /Type /EmbeddedFile
+ /Subtype (text/xml) cvn
+ % TODO: Determine file length, and add /Length entry
/Params <<
- /ModDate (D:20130121081433+01\x9200\x92)
+ /ModDate (D:20130121081433+01'00') % TODO: Determine file date.
>>
>> /PUT pdfmark
-
% Now read the data from the file and store it in the stream
[ {InvoiceStream} ZUGFeRDXMLFile (r) file /PUT pdfmark
-
% and close the stream
[ {InvoiceStream} /CLOSE pdfmark
-
% Step 3 create the File Specification dictionary for the embedded file
% Create the dictionary
[ /_objdef {FSDict} /type /dict /OBJ pdfmark
-
% Fill in the required dictionary elements
[ {FSDict} <<
/Type /FileSpec
- /F ZUGFeRDXMLFile
- /UF ZUGFeRDXMLFile SimpleUTF16BE
+ /F ZUGFeRDDocumentFileName
+ /UF ZUGFeRDDocumentFileName SimpleUTF16BE
/Desc (ZUGFeRD electronic invoice)
- /AFRelationship /Alternative
+ /AFRelationship /Alternative
/EF <<
/F {InvoiceStream}
/UF {InvoiceStream}
@@ -203,114 +467,38 @@
>>
/PUT pdfmark
-
% Step 4 Create the Associated Files dictionary to hold the FS dict
% Create the dictionary
[ /_objdef {AFArray} /type /array /OBJ pdfmark
-
% Put (append) the FS dictionary into the Associated Files array
[ {AFArray} {FSDict} /APPEND pdfmark
-
% Step 5 Add an entry in the Catalog dictionary containing the AF array
[ {Catalog} << /AF {AFArray} >> /PUT pdfmark
-
% Step 6 use the EMBED pdfmark to add the XML file and FS dictionary to the PDF name tree
- [ /Name ZUGFeRDXMLFile /FS {FSDict} /EMBED pdfmark
+ [ /Name ZUGFeRDDocumentFileName /FS {FSDict} /EMBED pdfmark
-
% Step 7 Add the extra ZUGFeRD XML data to the Metadata
- [ /XML
-(
- <!-- XMP extension schema container for the zugferd schema -->
- <rdf:Description rdf:about=""
- xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/"
- xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema#"
- xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#">
-
- <!-- Container for all embedded extension schema descriptions -->
- <pdfaExtension:schemas>
- <rdf:Bag>
- <rdf:li rdf:parseType="Resource">
- <!-- Optional description of schema -->
- <pdfaSchema:schema>ZUGFeRD PDFA Extension Schema</pdfaSchema:schema>
- <!-- Schema namespace URI -->
- <pdfaSchema:namespaceURI>urn:ferd:pdfa:invoice:rc#</pdfaSchema:namespaceURI>
- <!-- Preferred schema namespace prefix -->
- <pdfaSchema:prefix>zf</pdfaSchema:prefix>
-
- <!-- Description of schema properties -->
- <pdfaSchema:property>
- <rdf:Seq>!
- <rdf:li rdf:parseType="Resource">
- <!-- DocumentFileName: Name of the embedded file;
- must be equal with the value of the /F tag in the /EF
- structure -->
- <pdfaProperty:name>DocumentFileName</pdfaProperty:name>
- <pdfaProperty:valueType>Text</pdfaProperty:valueType>
- <pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>name of the embedded xml invoice file</pdfaProperty:description>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <!-- DocumentType: INVOICE -->
- <pdfaProperty:name>DocumentType</pdfaProperty:name>
- <pdfaProperty:valueType>Text</pdfaProperty:valueType>
- <pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>INVOICE</pdfaProperty:description>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <!-- Version: The actual version of the
- ZUGFeRD standard -->
- <pdfaProperty:name>Version</pdfaProperty:name>
- <pdfaProperty:valueType>Text</pdfaProperty:valueType>
- <pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>The actual version of the ZUGFeRD data</pdfaProperty:description>
- </rdf:li>
- <rdf:li rdf:parseType="Resource">
- <!-- ConformanceLevel: The actual conformance
- level of the ZUGFeRD standard,
- e.g. BASIC, COMFORT, EXTENDED -->
- <pdfaProperty:name>ConformanceLevel</pdfaProperty:name>
- <pdfaProperty:valueType>Text</pdfaProperty:valueType>
- <pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>The conformance level of the ZUGFeRD data</pdfaProperty:description>
- </rdf:li>
- </rdf:Seq>
- </pdfaSchema:property>
- </rdf:li>
- </rdf:Bag>
- </pdfaExtension:schemas>
- </rdf:Description>
-
- <rdf:Description rdf:about="" xmlns:zf="urn:ferd:pdfa:invoice:rc#">
- <zf:DocumentType>INVOICE</zf:DocumentType>
- <zf:DocumentFileName>ZUGFeRD-invoice.xml</zf:DocumentFileName>
- <zf:Version>RC</zf:Version>
- <zf:ConformanceLevel>BASIC</zf:ConformanceLevel>
- </rdf:Description>
-) /Ext_Metadata pdfmark
+ [ /XML ZUGFeRDMetadata /Ext_Metadata pdfmark
}
{
- % No ICC Profile definition on the command line; chide the user and give them an example
- %
- (\nERROR - ZUGFeRDProfile has not been supplied, you must supply an ICC profile\n) print
- ( Producing a potentially invalid PDF/A file!!\n) print
- (example usage - gs --permit-file-read=/usr/home/me/zugferd/ -sDEVICE=pdfwrite -dPDFA=3\\\n) print
- ( -sColorConversionStrategy=RGB -sZUGFeRDXMLFile=/usr/home/me/zugferd/invoice.xml\\\n) print
- ( -sZUGFeRDProfile=/usr/home/me/rgb.icc -o /usr/home/me/zugferd/zugferd.pdf\\\n) print
- ( /usr/home/me/zugferd/zugferd.ps /usr/home/me/zugferd/original.pdf\n\n) print flush
+ % No ICC Profile definition on the command line;
+ % chide the user and give them an example
+ (\nERROR - ZUGFeRDProfile has not been supplied, you must supply an ICC profile) print
+ (\n Producing a potentially INVALID PDF/A file. \n) print
+ Usage
} ifelse
}
{
- % No XML invoice definition on the command line; chide the user and give them an example
- %
- (\nERROR - ZUGFeRDXMLFile has not been supplied, you must supply an XML invoice file\n) print
- ( Producing a PDF/A file not a ZUGFeRD file.\n) print
- (example usage - gs --permit-file-read=/usr/home/me/zugferd/ -sDEVICE=pdfwrite -dPDFA=3\\\n) print
- ( -sColorConversionStrategy=RGB -sZUGFeRDXMLFile=/usr/home/me/zugferd/invoice.xml\\\n) print
- ( -sZUGFeRDProfile=/usr/home/me/rgb.icc -o /usr/home/me/zugferd/zugferd.pdf\\\n) print
- ( /usr/home/me/zugferd/zugferd.ps /usr/home/me/zugferd/original.pdf\n\n) print flush
+ % No XML invoice definition on the command line;
+ % chide the user and give them an example
+ (\nERROR - ZUGFeRDXMLFile has not been supplied, you must supply a XML invoice file) print
+ (\n Producing a PDF/A file, NOT a ZUGFeRD file. \n) print
+ Usage
} ifelse
-% That's all the ZUGFeRD and PDF/A-3 setup completed, all that remains now is to run the input file
+% That's all the ZUGFeRD and PDF/A-3 setup completed,
+% all that remains now is to run the input file
+
+%%EOF
\ No newline at end of file
More information about the tex-live-commits
mailing list.