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.