diff options
author | Reinhard Kotucha <reinhard.kotucha@web.de> | 2021-04-09 21:01:58 +0000 |
---|---|---|
committer | Reinhard Kotucha <reinhard.kotucha@web.de> | 2021-04-09 21:01:58 +0000 |
commit | cb14c16722533ee99b36a2e6efd9a6e4820954a3 (patch) | |
tree | f5cb5fbac1ea978af4cc1ea0f5d04d51bc1d01e0 /Master | |
parent | 94f0fd38b17b225048a0756ea6f03bbca0c30c7e (diff) |
Upgrade gs-9.53.3 -> gs-9.54.0
git-svn-id: svn://tug.org/texlive/trunk@58805 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
127 files changed, 1463 insertions, 402 deletions
diff --git a/Master/source/ghostscript-9.53.3.tar.xz b/Master/source/ghostscript-9.54.0.tar.xz Binary files differindex a5e23fab9ed..1ff034bdb02 100644 --- a/Master/source/ghostscript-9.53.3.tar.xz +++ b/Master/source/ghostscript-9.54.0.tar.xz diff --git a/Master/tlpkg/tlgs/README.TEXLIVE b/Master/tlpkg/tlgs/README.TEXLIVE index 26ca843b795..222509d96e4 100644 --- a/Master/tlpkg/tlgs/README.TEXLIVE +++ b/Master/tlpkg/tlgs/README.TEXLIVE @@ -1,12 +1,12 @@ -This directory contains a subset of the Ghostscript 9.53.3 distribution +This directory contains a subset of the Ghostscript 9.54.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. Changes: * The directories "doc", "examples", "libpng", "trio", "zlib", - "openjpeg", and "lcms2{art,mt}" were removed. + "openjpeg", lcms2{art,mt}", and "tesseract" were removed. * All executable files except Ghostscript itself were removed. diff --git a/Master/tlpkg/tlgs/Resource/CIDFont/ArtifexBullet b/Master/tlpkg/tlgs/Resource/CIDFont/ArtifexBullet Binary files differindex 18c98f16758..268d518f248 100644 --- a/Master/tlpkg/tlgs/Resource/CIDFont/ArtifexBullet +++ b/Master/tlpkg/tlgs/Resource/CIDFont/ArtifexBullet diff --git a/Master/tlpkg/tlgs/Resource/CMap/Identity-UTF16-H b/Master/tlpkg/tlgs/Resource/CMap/Identity-UTF16-H index a47413aa276..5c1c3eac92b 100644 --- a/Master/tlpkg/tlgs/Resource/CMap/Identity-UTF16-H +++ b/Master/tlpkg/tlgs/Resource/CMap/Identity-UTF16-H @@ -1,4 +1,4 @@ -% Copyright (C) 2003-2018 Artifex Software. All rights reserved. +% Copyright (C) 2003-2021 Artifex Software. All rights reserved. % % This software is provided AS-IS with no warranty, either express or % implied. diff --git a/Master/tlpkg/tlgs/Resource/ColorSpace/DefaultCMYK b/Master/tlpkg/tlgs/Resource/ColorSpace/DefaultCMYK index cba9326c204..f3d7182350a 100644 --- a/Master/tlpkg/tlgs/Resource/ColorSpace/DefaultCMYK +++ b/Master/tlpkg/tlgs/Resource/ColorSpace/DefaultCMYK @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/ColorSpace/DefaultGray b/Master/tlpkg/tlgs/Resource/ColorSpace/DefaultGray index 95c9ef41e81..21a72fd634e 100644 --- a/Master/tlpkg/tlgs/Resource/ColorSpace/DefaultGray +++ b/Master/tlpkg/tlgs/Resource/ColorSpace/DefaultGray @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/ColorSpace/DefaultRGB b/Master/tlpkg/tlgs/Resource/ColorSpace/DefaultRGB index 53ddf3eac75..d715587b994 100644 --- a/Master/tlpkg/tlgs/Resource/ColorSpace/DefaultRGB +++ b/Master/tlpkg/tlgs/Resource/ColorSpace/DefaultRGB @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/ColorSpace/TrivialCMYK b/Master/tlpkg/tlgs/Resource/ColorSpace/TrivialCMYK index b3dec8b89a0..66776bcde96 100644 --- a/Master/tlpkg/tlgs/Resource/ColorSpace/TrivialCMYK +++ b/Master/tlpkg/tlgs/Resource/ColorSpace/TrivialCMYK @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/ColorSpace/sGray b/Master/tlpkg/tlgs/Resource/ColorSpace/sGray index a0997d0b844..501ed376b44 100644 --- a/Master/tlpkg/tlgs/Resource/ColorSpace/sGray +++ b/Master/tlpkg/tlgs/Resource/ColorSpace/sGray @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/ColorSpace/sRGB b/Master/tlpkg/tlgs/Resource/ColorSpace/sRGB index 16f3ecfad4e..0aadbc01a51 100644 --- a/Master/tlpkg/tlgs/Resource/ColorSpace/sRGB +++ b/Master/tlpkg/tlgs/Resource/ColorSpace/sRGB @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Decoding/FCO_Dingbats b/Master/tlpkg/tlgs/Resource/Decoding/FCO_Dingbats index 8da04509b25..76cd6d1a435 100644 --- a/Master/tlpkg/tlgs/Resource/Decoding/FCO_Dingbats +++ b/Master/tlpkg/tlgs/Resource/Decoding/FCO_Dingbats @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Decoding/FCO_Symbol b/Master/tlpkg/tlgs/Resource/Decoding/FCO_Symbol index c9411a038cb..4c2dcecb645 100644 --- a/Master/tlpkg/tlgs/Resource/Decoding/FCO_Symbol +++ b/Master/tlpkg/tlgs/Resource/Decoding/FCO_Symbol @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Decoding/FCO_Unicode b/Master/tlpkg/tlgs/Resource/Decoding/FCO_Unicode index 4cdf58a5764..acc8e0229c6 100644 --- a/Master/tlpkg/tlgs/Resource/Decoding/FCO_Unicode +++ b/Master/tlpkg/tlgs/Resource/Decoding/FCO_Unicode @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Decoding/FCO_Wingdings b/Master/tlpkg/tlgs/Resource/Decoding/FCO_Wingdings index a31cefd8eed..2eaca0df36e 100644 --- a/Master/tlpkg/tlgs/Resource/Decoding/FCO_Wingdings +++ b/Master/tlpkg/tlgs/Resource/Decoding/FCO_Wingdings @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Decoding/Latin1 b/Master/tlpkg/tlgs/Resource/Decoding/Latin1 index 8960ab4f5b1..b9dff0f3d76 100644 --- a/Master/tlpkg/tlgs/Resource/Decoding/Latin1 +++ b/Master/tlpkg/tlgs/Resource/Decoding/Latin1 @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Decoding/StandardEncoding b/Master/tlpkg/tlgs/Resource/Decoding/StandardEncoding index f2b27a56609..5ac6d63c09a 100644 --- a/Master/tlpkg/tlgs/Resource/Decoding/StandardEncoding +++ b/Master/tlpkg/tlgs/Resource/Decoding/StandardEncoding @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Decoding/Unicode b/Master/tlpkg/tlgs/Resource/Decoding/Unicode index 7ecd3069cb0..dfc137d9272 100644 --- a/Master/tlpkg/tlgs/Resource/Decoding/Unicode +++ b/Master/tlpkg/tlgs/Resource/Decoding/Unicode @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Encoding/CEEncoding b/Master/tlpkg/tlgs/Resource/Encoding/CEEncoding index bd3f8abb682..b2d7e574eed 100644 --- a/Master/tlpkg/tlgs/Resource/Encoding/CEEncoding +++ b/Master/tlpkg/tlgs/Resource/Encoding/CEEncoding @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Encoding/ExpertEncoding b/Master/tlpkg/tlgs/Resource/Encoding/ExpertEncoding index fe879bda371..97b33213e9e 100644 --- a/Master/tlpkg/tlgs/Resource/Encoding/ExpertEncoding +++ b/Master/tlpkg/tlgs/Resource/Encoding/ExpertEncoding @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Encoding/ExpertSubsetEncoding b/Master/tlpkg/tlgs/Resource/Encoding/ExpertSubsetEncoding index 6f789bc50ca..6177adb0328 100644 --- a/Master/tlpkg/tlgs/Resource/Encoding/ExpertSubsetEncoding +++ b/Master/tlpkg/tlgs/Resource/Encoding/ExpertSubsetEncoding @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Encoding/NotDefEncoding b/Master/tlpkg/tlgs/Resource/Encoding/NotDefEncoding index a5e0b8d3b75..0c810e48c46 100644 --- a/Master/tlpkg/tlgs/Resource/Encoding/NotDefEncoding +++ b/Master/tlpkg/tlgs/Resource/Encoding/NotDefEncoding @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Encoding/Wingdings b/Master/tlpkg/tlgs/Resource/Encoding/Wingdings index 4a245571185..efb7d3fa500 100644 --- a/Master/tlpkg/tlgs/Resource/Encoding/Wingdings +++ b/Master/tlpkg/tlgs/Resource/Encoding/Wingdings @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/IdiomSet/PPI_CUtils b/Master/tlpkg/tlgs/Resource/IdiomSet/PPI_CUtils new file mode 100644 index 00000000000..7e6ecb23ea2 --- /dev/null +++ b/Master/tlpkg/tlgs/Resource/IdiomSet/PPI_CUtils @@ -0,0 +1,24 @@ +%% +%% Idioms for the PPI Media GmbH PPI_ColorUtils ProcSet +%% This appears to be a kind of desktop colour separation utility. If it is +%% used with the pdfwrite PassThroughJPEGImages feature then instead of +%% converting images from colour to gray, we embed the colour image data +%% but with a DeviceGray colour space, which leads to incorrect output. +%% To fix that, turn off the feature if cuForceGray is set to true. This +%% is the first time we've seen this, and more work may be required. +%% + +currentuserparams /IdiomRecognition get +<</IdiomRecognition false>> setuserparams + +/PPI_CUtils +<< +/cuForceGray [ +{/_cuForceGray exch cuPut} bind +{dup //true eq {currentdevice //null //false mark /PassThroughJPEGImages //false .putdeviceparamsonly}if /_cuForceGray exch cuPut} bind +] +>> + +/IdiomSet defineresource pop + +<</IdiomRecognition 3 -1 roll>> setuserparams diff --git a/Master/tlpkg/tlgs/Resource/Init/FCOfontmap-PCLPS2 b/Master/tlpkg/tlgs/Resource/Init/FCOfontmap-PCLPS2 index 91bd8f7fa26..e51db629fcc 100644 --- a/Master/tlpkg/tlgs/Resource/Init/FCOfontmap-PCLPS2 +++ b/Master/tlpkg/tlgs/Resource/Init/FCOfontmap-PCLPS2 @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_agl.ps b/Master/tlpkg/tlgs/Resource/Init/gs_agl.ps index 9c1c52d2afb..ce5ea1ce06a 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_agl.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_agl.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_btokn.ps b/Master/tlpkg/tlgs/Resource/Init/gs_btokn.ps index 410b8419154..1f63fb5c4e0 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_btokn.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_btokn.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_cff.ps b/Master/tlpkg/tlgs/Resource/Init/gs_cff.ps index 6cfa1ec1323..43cf7d0193f 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_cff.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_cff.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_cidcm.ps b/Master/tlpkg/tlgs/Resource/Init/gs_cidcm.ps index 503ec867fbf..1ec03b3632a 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_cidcm.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_cidcm.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_ciddc.ps b/Master/tlpkg/tlgs/Resource/Init/gs_ciddc.ps index 6cdba039084..9e2ea1ead74 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_ciddc.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_ciddc.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_cidfm.ps b/Master/tlpkg/tlgs/Resource/Init/gs_cidfm.ps index f22e45d6d63..1a456ab1dfc 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_cidfm.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_cidfm.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_cidfn.ps b/Master/tlpkg/tlgs/Resource/Init/gs_cidfn.ps index 20af1c875df..870a2e11c65 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_cidfn.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_cidfn.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_cidtt.ps b/Master/tlpkg/tlgs/Resource/Init/gs_cidtt.ps index e045cfddc61..b856ba65b26 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_cidtt.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_cidtt.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_cmap.ps b/Master/tlpkg/tlgs/Resource/Init/gs_cmap.ps index 3252089ad07..0c2e1421565 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_cmap.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_cmap.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_cspace.ps b/Master/tlpkg/tlgs/Resource/Init/gs_cspace.ps index 8aaf6b74b13..c005cef4282 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_cspace.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_cspace.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_dbt_e.ps b/Master/tlpkg/tlgs/Resource/Init/gs_dbt_e.ps index 2aca0c68a39..89e24131bad 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_dbt_e.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_dbt_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_diskn.ps b/Master/tlpkg/tlgs/Resource/Init/gs_diskn.ps index 85ff07e3748..825ff8d959c 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_diskn.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_diskn.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_dps1.ps b/Master/tlpkg/tlgs/Resource/Init/gs_dps1.ps index 14cc5d6d849..ba5b9b54e36 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_dps1.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_dps1.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_dps2.ps b/Master/tlpkg/tlgs/Resource/Init/gs_dps2.ps index 2dfaaa49865..0320644667e 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_dps2.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_dps2.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_dscp.ps b/Master/tlpkg/tlgs/Resource/Init/gs_dscp.ps index 15764b1772a..4ea3d4540f1 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_dscp.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_dscp.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_epsf.ps b/Master/tlpkg/tlgs/Resource/Init/gs_epsf.ps index cf020751a08..47b68bba9be 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_epsf.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_epsf.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or @@ -29,6 +29,7 @@ % After %%HiResBoundingBox processed, state is 3 if OK or 4 if cropped. % After %%EndComments processed, state is 5. /EPSBoundingBoxState 5 def +/EPSBoundingBoxString () def % set if either BoundingBox is seen (even if invalid) /EPSBoundingBoxSetState { //systemdict /EPSBoundingBoxState 3 -1 roll .forceput } .bind executeonly odef % .forceput must be bound and hidden @@ -60,7 +61,10 @@ /EPSBoundingBoxFitPage { % llx lly urx ury -- EPSDEBUG { (gs_epsf.ps: Rescaling EPS to fit page\n) print flush } if clippath pathbbox newpath % ellx elly eurx eury pllx plly purx pury - + EPSDEBUG { + (Page Coordinates: LLX: ) print 3 index =print (, LLY: ) print + 2 index =print (, URX: ) print 1 index =print (, URY: ) print dup = flush + } if % Convert box corners to coordinates of the center and box sizes 2 { % loop doing the page coordinates, the the EPS bbox coordinates 3 -1 roll exch % ... llx urx lly ury @@ -82,7 +86,19 @@ % Find orientation of the best fit. Square pages or files don't rotate. 2 copy sub % edx ecx edy ecy pdx pdy pdx-pdy - 6 index 5 index sub mul % edx ecx edy ecy pdx pdy (pdx-pdy)*(edx-edy) + EPSDEBUG { + (pdx: ) print 2 index =print (, pdy: ) print 1 index =print + (, pdx-pdy: ) print dup = flush + } if + 6 index 5 index sub + EPSDEBUG { + (edx: ) print 7 index =print (, edy: ) print 5 index =print + (, edx-edy: ) print dup = flush + } if + mul % edx ecx edy ecy pdx pdy (pdx-pdy)*(edx-edy) + EPSDEBUG { + (product: ) print dup = flush + } if 0 lt { 90 rotate exch @@ -100,15 +116,17 @@ } bind executeonly odef /EPSBoundingBoxProcess { % (llx lly urx ury) state -- + % The following 'lt' check prioritzies HiResBoundingBox over BoundingBox + % even if HiResBoundingBox occurs first in the EPS file. //systemdict /EPSBoundingBoxState get 1 index lt { - exch EPSBoundingBoxParse + % save the BBoxString for possible FitPage when EndComments is seen + exch dup //systemdict /EPSBoundingBoxString 3 -1 roll .forceput + EPSBoundingBoxParse { //systemdict /EPSCrop known { EPSBoundingBoxCrop } { - //systemdict /EPSFitPage known { - EPSBoundingBoxFitPage - } { + //systemdict /EPSFitPage known not { % Warn if some of the EPS file will be clipped clippath pathbbox newpath { % context for exit @@ -124,10 +142,17 @@ flush 1 add } if + } { + pop pop pop pop } ifelse } ifelse EPSBoundingBoxSetState } { + % improperly formed BoundingBox string. + QUIET not { + (\n **** Warning: BoundingBox values are invalid and will be ignored: ') print + EPSBoundBoxString print (') = flush + } if pop % state } ifelse } { @@ -135,6 +160,25 @@ } ifelse } bind executeonly odef +% Perform anchorsearch on the strings in the array until a match is found. +/anchorsearchforany { % haystack [needle1 ...] --> post needle true + % --> haystack false + false 3 1 roll % false haystack [...] + { % false haystack needle + dup 3 1 roll % false needle haystack needle + anchorsearch { + % false needle post needle + pop % false needle post + 3 1 roll % post false needle + exch not exch % post true needle + exit + } { + % false needle haystack + exch pop % false haystack + } ifelse + } forall + exch % haystack false | post needle true +} bind def /ProcessEPSComment { % file comment -- file comment /EPSBoundingBoxState .systemvar 3 lt { @@ -188,12 +232,23 @@ } ifelse } ifelse } { - (%%EndComments) anchorsearch { - pop pop + {(%%EndComments) (%%BeginProlog) (%%BeginSetup)} anchorsearchforany { + EPSDEBUG { (EPSComment processing finished, encountered: ) print dup = } if + pop pop % discard the strings from the anchorsearch + % We may have seen BoundingBox or HiResBounfingBox. If so and if EPSFitPage + % is set, then we do the transformation here to scale and center the page, + % rotating if needed (and AllowFitPageRotation is true -- the default.) + //systemdict /EPSFitPage known + //systemdict /EPSBoundingBoxState get 0 gt + and { + EPSBoundingBoxString EPSBoundingBoxParse { + EPSBoundingBoxFitPage + } if + } if % Ignore any following comments 5 EPSBoundingBoxSetState } { - pop + pop % Not %%EndComments -- ignore it } ifelse } ifelse } if @@ -310,6 +365,7 @@ end /.runnoepsf /.runEPS /EPSBoundingBoxSetState + /EPSBoundingBoxString /EPSBoundingBoxCrop /EPSBoundingBoxFitPage /EPSBoundingBoxParse diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_fapi.ps b/Master/tlpkg/tlgs/Resource/Init/gs_fapi.ps index 0b493c6a516..b0f748209d6 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_fapi.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_fapi.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_fntem.ps b/Master/tlpkg/tlgs/Resource/Init/gs_fntem.ps index d5ac0bfa72f..8904352deb2 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_fntem.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_fntem.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_fonts.ps b/Master/tlpkg/tlgs/Resource/Init/gs_fonts.ps index 3f4f4af8066..f1e26b09393 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_fonts.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_fonts.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_frsd.ps b/Master/tlpkg/tlgs/Resource/Init/gs_frsd.ps index 74c1dd27788..80d399101b7 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_frsd.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_frsd.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or @@ -61,13 +61,29 @@ level2dict begin .currentglobal 1 index gcheck .setglobal exch currentpacking //false setpacking exch + 2 dict begin /filelen 0 def % scratch dict for filelen and pos (below). % Stack: dict filters parms CloseSource oldglobal oldpacking file - [ exch { dup 40000 string readstring not { exit } if exch } loop + [ exch { + dup 40000 string readstring + /filelen 2 index length filelen add def % accumulate filelen + not { exit } if exch + } loop exch pop ] - % Stack: dict filters parms CloseSource oldglobal oldpacking [()...] + { filelen string } stopped { % try allocating a single string + pop % couldn't make a string - discard filelen value + } { + % transfer the array-of-strings to the single string. + % stack: ... [() ...] string + /pos 0 def exch { + 1 index exch pos exch putinterval /pos pos 40000 add def + } forall + } ifelse + % top of stack is either array of strings or one string == stream_data + end % done with scratch dict + % Stack: dict filters parms CloseSource oldglobal oldpacking stream_data 3 1 roll setpacking setglobal - % Stack: dict filters parms CloseSource [()...] + % Stack: dict filters parms CloseSource stream_data 1 index .reusablestream } if % We created the stream successfully: clean up. diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_icc.ps b/Master/tlpkg/tlgs/Resource/Init/gs_icc.ps index fac0cb25fab..0bf8313fdc4 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_icc.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_icc.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_il1_e.ps b/Master/tlpkg/tlgs/Resource/Init/gs_il1_e.ps index f8cfff04ca4..35250233701 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_il1_e.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_il1_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_img.ps b/Master/tlpkg/tlgs/Resource/Init/gs_img.ps index 00d79df34ac..3750ad30285 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_img.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_img.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2002-2018 Artifex, Inc. All rights reserved. +% Copyright (C) 2002-2021 Artifex, Inc. All rights reserved. % % This software is provided AS-IS with no warranty, either express or % implied. diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_init.ps b/Master/tlpkg/tlgs/Resource/Init/gs_init.ps index 931f91aaadd..088c8583e3e 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_init.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_init.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or @@ -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! -9533 +9540 % Check the interpreter revision. dup revision ne @@ -144,7 +144,8 @@ currentdict /PDFNOCIDFALLBACK known /PDFNOCIDFALLBACK exch def currentdict /BATCH known /BATCH exch def currentdict /DELAYBIND known /DELAYBIND exch def -currentdict /DOINTERPOLATE .knownget { { -1 } { 0 } ifelse /InterpolateControl exch def } if +currentdict /DOINTERPOLATE .knownget { { -1 } { 1 } ifelse /InterpolateControl exch def } if +currentdict /NOINTERPOLATE .knownget { { 0 } { 1 } ifelse /InterpolateControl exch def } if currentdict /ESTACKPRINT known /ESTACKPRINT exch def currentdict /FAKEFONTS known /FAKEFONTS exch def currentdict /FIXEDMEDIA known /FIXEDMEDIA exch def @@ -159,7 +160,6 @@ currentdict /NODISPLAY known not /DISPLAYING exch def currentdict /NOFONTMAP known /NOFONTMAP exch def currentdict /NOFONTPATH known /NOFONTPATH exch def currentdict /NOGC known /NOGC exch def -currentdict /NOINTERPOLATE .knownget { /InterpolateControl 0 def } if currentdict /NOMEDIAATTRS known /NOMEDIAATTRS exch def currentdict /NOOUTERSAVE known /NOOUTERSAVE exch def currentdict /NOPAGEPROMPT known /NOPAGEPROMPT exch def @@ -215,6 +215,13 @@ currentdict /EPSFitPage known { /PSFitPage //true def } if % This is a "convenience" option that sets a combination of EPSFitPage, PDFFitPage and PSFitPage currentdict /FitPage known { /EPSFitPage //true def /PDFFitPage //true def /PSFitPage //true def } if +currentdict /SimulateOverprint known { + (\n**** -dSimulateOverprint={true|false} is no longer supported. ****\n) print + (**** It has been replaced by -dOverprint={enable|disable|simulate} ****\n\n) print + % Set the new variable appropriately. + /Overprint SimulateOverprint { /enable } { /disable } ifelse def +} if + % Acquire environment variables. currentdict /DEVICE known not { (GS_DEVICE) getenv { /DEVICE exch def } if } if diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_lev2.ps b/Master/tlpkg/tlgs/Resource/Init/gs_lev2.ps index fefa732b198..54849370d5c 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_lev2.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_lev2.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps b/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps index f6d98482164..98e2a65fb5f 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_mex_e.ps b/Master/tlpkg/tlgs/Resource/Init/gs_mex_e.ps index dda0675cd85..cced43b3d11 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_mex_e.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_mex_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_mgl_e.ps b/Master/tlpkg/tlgs/Resource/Init/gs_mgl_e.ps index e02729b1c9a..b437285b7d9 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_mgl_e.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_mgl_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_mro_e.ps b/Master/tlpkg/tlgs/Resource/Init/gs_mro_e.ps index 7d0e3b7c284..e476322ba39 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_mro_e.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_mro_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_pdf_e.ps b/Master/tlpkg/tlgs/Resource/Init/gs_pdf_e.ps index 172cd72c559..2d3ec9ffc05 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_pdf_e.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_pdf_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_pdfwr.ps b/Master/tlpkg/tlgs/Resource/Init/gs_pdfwr.ps index a53b8c3f88e..9386339b0ac 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_pdfwr.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_pdfwr.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or @@ -278,19 +278,6 @@ languagelevel 2 .setlanguagelevel % ---------------- End of predefined configurations ---------------- % -% Set optimizations for converting PostScript to PDF. -% The ps2pdf* scripts invoke this. -/.setpdfwrite { % - .setpdfwrite - - % Set a large VM threshold to reduce garbage collection. - (\n**** WARNING: The .setpdfwrite operator has been deprecated and will be removed entirely\n) print - ( in the next release of Ghostscript. The functionality of this operator has\n) print - ( been reduced to increasing the size of the VM threshold. If you believe you\n) print - ( have a real need for this then you should replace your call to .setpdfwrite\n) print - ( with:\n\n) print - ( 3000000 setvmthreshold\n\n) print - currentuserparams /VMThreshold get 3000000 .max setvmthreshold -} bind def - % ---------------- pdfmark and DSC processing ---------------- % /.write_small_positive_real % <file> <real> .write_small_positive_real - diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_res.ps b/Master/tlpkg/tlgs/Resource/Init/gs_res.ps index 18f63a30064..41214bf358b 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_res.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_res.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_resmp.ps b/Master/tlpkg/tlgs/Resource/Init/gs_resmp.ps index 5ba4f43e760..a7eb70fcafe 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_resmp.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_resmp.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_setpd.ps b/Master/tlpkg/tlgs/Resource/Init/gs_setpd.ps index 51b26899979..2a333bf7642 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_setpd.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_setpd.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_statd.ps b/Master/tlpkg/tlgs/Resource/Init/gs_statd.ps index 7b85ef0f558..8f01c78c4c1 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_statd.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_statd.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_std_e.ps b/Master/tlpkg/tlgs/Resource/Init/gs_std_e.ps index 4bfa6c5bfcb..c696b714fc7 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_std_e.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_std_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_sym_e.ps b/Master/tlpkg/tlgs/Resource/Init/gs_sym_e.ps index fb92a2997dd..e6c58f6fa5c 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_sym_e.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_sym_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_trap.ps b/Master/tlpkg/tlgs/Resource/Init/gs_trap.ps index e4d6cafe094..9a089eef737 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_trap.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_trap.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_ttf.ps b/Master/tlpkg/tlgs/Resource/Init/gs_ttf.ps index 394cba28e26..95d50c6be60 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_ttf.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_ttf.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or @@ -414,7 +414,16 @@ pop /firstcode startc 0 getu16a 16#ff00 and dup 16#f000 ne { pop 0 } if def /putglyph { - glyphs code 3 -1 roll put /code code 1 add def + glyphs code known + { + glyphs /.cmap_warning_issued known not { + (**** Warning: Invalid TTF cmap mapping (overlapping/repeated map)\n) print flush + glyphs /.cmap_warning_issued //true put + } if + pop + } + {glyphs code 3 -1 roll put}ifelse + /code code 1 add def } bind def /glyphs 0 dict def @@ -438,6 +447,10 @@ % Two choices are: drop later repeated/overlapping segments entirely, % or only use codes from later, overlapping segments not already set % by the earlier segment. (Inspired by Bug 700968). + % Revision: bug 703589 has an (invalid) cmap table with overlapping + % (actually repeating) ranges, and requires the *first* range definition + % to be used in order to render correctly. So /putglyph now refuses to + % overwrite existing keys in the "glyphs" dictionary 0 2 nseg2 dup 4 lt {pop 4}if 3 sub { /i2 exch def /scode startc i2 getu16a def @@ -464,7 +477,10 @@ } for } ifelse } if - } for glyphs /glyphs //null def % for GC + } for + % If we've encoutered an invalid table, remove the key before returning + glyphs /.cmap_warning_issued undef + glyphs /glyphs //null def % for GC } .bind 6 { % Single interval lookup. dup 6 getu16a /firstcode exch def diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_typ32.ps b/Master/tlpkg/tlgs/Resource/Init/gs_typ32.ps index 2d5fc81499a..4c2035c70ad 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_typ32.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_typ32.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_typ42.ps b/Master/tlpkg/tlgs/Resource/Init/gs_typ42.ps index 654a268c0e0..a3bb97952c7 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_typ42.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_typ42.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_type1.ps b/Master/tlpkg/tlgs/Resource/Init/gs_type1.ps index 18488ebe1cd..fa3cdd8826e 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_type1.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_type1.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_wan_e.ps b/Master/tlpkg/tlgs/Resource/Init/gs_wan_e.ps index 5d3673cc67a..fe821352936 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_wan_e.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_wan_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps index 1e7bd701bbc..2453b6bc1d3 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or @@ -779,17 +779,19 @@ currentdict /token_nofail_dict .undef % Read the data for all objects. We check to see if we get % the number of objects that we expect. % Stack: strm# objstreamdict N objectstream [obj#] PDFDEBUG - mark 3 -1 roll % Get objectstream + /ResolveObjectStreamMark 3 -1 roll count 4 index add % Determine stack depth with objects 3 1 roll resolveobjstreamopdict .pdfrun % Get PDF objects - count counttomark 1 add index ne + count /ResolveObjectStreamMark CountToKey not {0} if + 1 add index + ne { - count counttomark 1 add index gt { + count /ResolveObjectStreamMark CountToKey not {0} if + 1 add index gt { ( **** Error: Incorrect object count in object stream (too many objects).\n) pdfformaterror ( Output may be incorrect.\n) pdfformaterror } if - % Its possible for us to end up here with a valid file. The way we work is to read the % stream and tokenise all the objects, but that assumes there will be delimiters or % whitespace between each object in the stream. We can easily think of cases where @@ -821,13 +823,13 @@ currentdict /token_nofail_dict .undef % the stack, in the right order, preceded by a mark, a count, and an array containing % all the object numbers. - % First, discard everything we read up to now; we can reuse the mark which was placed - % by the preceding code to do this, as long as we remember to replace that mark. + % First, discard everything we read up to now; we can reuse the 'mark' which was placed + % by the preceding code to do this, as long as we remember to replace that 'mark'. % Handily this will leave the count and the array which contains the object numbers in place. - cleartomark + /ResolveObjectStreamMark ClearToKey - % Replace the mark consumed by conttomark above, so that we match what the code following this error handling expects. - mark + % Replace the 'mark' consumed by conttomark above, so that we match what the code following this error handling expects. + /ResolveObjectStreamMark % copy the ObjStm dictionary and then copy the count of objects expected 4 index 4 index @@ -894,14 +896,15 @@ currentdict /token_nofail_dict .undef % but leave count of objects. Check that aginst the number of objects % retrieved. If we got too few then issue a warning. - pop pop exch pop counttomark 1 sub lt { + pop pop exch pop /ResolveObjectStreamMark CountToKey not {1} if + 1 sub lt { ( **** Error: Incorrect object count in object stream (too few objects).\n) pdfformaterror ( Output may be incorrect.\n) pdfformaterror } if } if % We have the object data - counttomark array astore % Put objects into an array + /ResolveObjectStreamMark CountToKey not {0} if array astore exch pop exch pop % Remove mark and count currentdict //no_debug_dict eq { end } if % Restore debug context % Save the objects into Objects @@ -1090,15 +1093,30 @@ currentdict /no_debug_dict undef % Some (bad) PDf files have invalid stream lengths. This causes problems % if we reposition beyond the end of the file. So we compare the given % length to number of bytes left in the file. - dup /Length knownoget { - dup PDFfile bytesavailable lt { % compare to to bytes left in file - PDFfile fileposition % reposition to the end of stream - add PDFfile exch setfileposition - } { - pop % bad stream length - do not reposition. - % This will force a length warning below - } ifelse - } if + dup mark exch /Length {knownoget} stopped { + % Bug 703372 is a PDF file where the XRef stream dictionary has a Length which is an + % indirect object. Clearly we cannot look that up in an xref which we haevn't yet + % read! We catch the error from knownoget and do not reposition the steam. After + % that the normal recovery code kicks in and we will eventually manage to read + % the compressed xref. + cleartomark + } + { + { + dup type /realtype eq { + ( **** Warning: stream length is a real number; converting to integer.\n) pdfformatwarning + cvi 2 copy /Length exch put + } if + dup PDFfile bytesavailable lt { % compare to to bytes left in file + PDFfile fileposition % reposition to the end of stream + add PDFfile exch setfileposition + } { + pop % bad stream length - do not reposition. + % This will force a length warning below + } ifelse + } if + pop % the mark from the Length dereference guard above. + } ifelse } { pop % We're already reading from a stream, which we can't reposition. diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps index a93a526ca85..8527312c10c 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or @@ -762,6 +762,24 @@ def .pdfruncontext end grestore + + % check for extra garbage on the operand stack and clean it up + count pdfemptycount sub dup 0 ne { + ( **** Error: Transparency Group, Form XObject execution corrupted the stack.\n) pdfformaterror + ( Output may be incorrect.\n) pdfformaterror + PDFSTOPONERROR { + /.execgroup cvx /rangecheck signalerror + } { + dup 0 gt { + { pop } repeat + }{ + pop + } ifelse + } ifelse + } { + pop + } ifelse + /pdfemptycount exch store } bind executeonly def @@ -796,12 +814,22 @@ def %% as arguments to .execgroup mark currentcolor counttomark array astore exch pop currentcolorspace 5 2 roll - - dup /Group oget exch /BBox oget + dup /Group oget dup type /dicttype eq { + exch /BBox oget dup type /arraytype eq { % Stack: resdict stream groupdict bbox - .beginformgroup - .execgroup - .endtransparencygroup + .beginformgroup + .execgroup + .endtransparencygroup + }{ + ( **** Error: Form XObject has a BBox entry with an invalid type.\n) pdfformaterror + ( Ignoring transparency Group, output may be incorrect.\n) pdfformaterror + pop pop pop pop pop pop + } ifelse + } { + ( **** Error: Form XObject has a Group entry with an invalid type.\n) pdfformaterror + ( Ignoring transparency Group, output may be incorrect.\n) pdfformaterror + pop pop pop pop pop pop + } ifelse } bind executeonly def % Make an ImageType 103 (soft-masked) image. @@ -2169,7 +2197,15 @@ currentdict /last-ditch-bpc-csp undef ( Output may be incorrect.\n) pdfformaterror } ifelse } if - 1 index /Mask knownoget { 1 index exch /Mask exch put } 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 } bind executeonly def /makemaskimage { % <datasource> <imagemask> <Mask> makemaskimage @@ -2287,6 +2323,14 @@ currentdict /last-ditch-bpc-csp undef currentdict /SMask knownoget { % We are doing transparency and SMask is present in the image % stack: <imagemask> <SMask> + % Normalize /Matte attribute for .begintransparencymaskimage + dup /Matte .knownget { + oforce dup //null eq { + pop dup /Matte undef + } { + 1 index /Matte [ 4 -1 roll { oforce } forall ] put + } ifelse + } if .begintransparencymaskimage PDFfile fileposition exch gsave //nodict begin @@ -2308,6 +2352,12 @@ currentdict /last-ditch-bpc-csp undef % code only picks up the current colour space, not the space from the dictionary. currentdict /SMask get /Matte known {/CS currentdict /ColorSpace get dup pdfopdict /cs get exec } if >> 0 0 1 1 + gsave 1 1 moveto 0 0 lineto + % If we get an error, just emit an empty box + { pathbbox } stopped { 0 0 0 0 } if + 4 array astore grestore + /image + setup_trans .begintransparencygroup .currentstrokeconstantalpha .currentfillconstantalpha 3 -1 roll 1 .setfillconstantalpha 1 .setstrokeconstantalpha @@ -2409,12 +2459,6 @@ currentdict /last-ditch-bpc-csp undef makemaskimage } if % Stack: datasource imagemask - gsave 1 1 moveto 0 0 lineto - % If we get an error, just emit an empty box - { pathbbox } stopped { 0 0 0 0 } if - 4 array astore grestore - /image - setup_trans { currentdict end setsmaskstate //true ValidateDecode { imagemask } } { ColorSpace setgcolorspace currentdict end setsmaskstate //false ValidateDecode { image } } ifelse @@ -3008,6 +3052,12 @@ drawopdict begin /File PDFsource def currentdict makeimagekeys OFFlevels length 0 eq { + gsave 1 1 moveto 0 0 lineto + % If we get an error, just emit an empty box + { pathbbox } stopped { 0 0 0 0 } if + 4 array astore grestore + /image + setup_trans doimage } { pop Width @@ -4252,7 +4302,7 @@ currentdict /set_bc_color undef dup annotsetcolor { dup drawborder dup calc_annot_scale 2 copy mul 0 ne - {3 -1 roll drawwidget //false} + {3 -1 roll drawwidget} { pop pop ( **** Error: ignoring annotation with scale factor of 0\n) pdfformaterror @@ -4260,6 +4310,7 @@ currentdict /set_bc_color undef }ifelse } if //endannottransparency exec + //false } bind executeonly def /Ink { % <annot> -> <annot> <true> @@ -5359,14 +5410,9 @@ currentdict /drawannottypes undef /Ink {mark exch loadannot /ANN pdfmark //false} bind executeonly def -/Line { - mark exch dup /L .knownget { - aload 5 1 roll transform 4 -2 roll transform 4 2 roll - 5 -1 roll astore - 1 index /L 3 -1 roll put - } if - loadannot /ANN pdfmark //false -} bind executeonly def +/PolyLine {mark exch loadannot /ANN pdfmark //false} bind executeonly def + +/Line {mark exch loadannot /ANN pdfmark //false} bind executeonly def /Link { /NO_PDFMARK_DESTS where {pop NO_PDFMARK_DESTS not}{//true}ifelse @@ -5456,7 +5502,8 @@ currentdict /drawannottypes undef //false } bind executeonly def -/Movie {mark exch loadannot /ANN pdfmark //false} bind executeonly def +%% We don't handle movies correctly, so don't try to preserve them +%/Movie {mark exch loadannot /ANN pdfmark //false} bind executeonly def /Popup {mark exch loadannot /ANN pdfmark //false} bind executeonly def /Sound {mark exch loadannot /ANN pdfmark //false} bind executeonly def /Square {mark exch loadannot /ANN pdfmark //false} bind executeonly def @@ -5717,22 +5764,25 @@ currentdict end def % The recursive enumeration of the form fields doesn't descend into widget annotations. /draw_form_field { % <field> draw_form_field - - dup /Kids knownoget { % field [] - dup length 0 gt { - dup 0 oget /Parent knownoget { % field [] kid - pop % mon-terminal field % field [] - exch pop % [] - { oforce draw_form_field } forall + dup type /dicttyype eq { % File for Bug692447 has 'null' Fields entries + % This matches what pdf_main process_trailer_attrs + dup /Kids knownoget { % field [] + dup length 0 gt { + dup 0 oget /Parent knownoget { % field [] kid + pop % mon-terminal field % field [] + exch pop % [] + { oforce draw_form_field } forall + } { + pop draw_terminal_field % separate annots % - + } ifelse } { - pop draw_terminal_field % separate annots % - + ( **** Error: Ignoring empty /Kids array in Form field.\n) pdfformaterror + ( Output may be incorrect.\n) pdfformaterror } ifelse } { - ( **** Error: Ignoring empty /Kids array in Form field.\n) pdfformaterror - ( Output may be incorrect.\n) pdfformaterror + draw_terminal_field % merged annotation % - } ifelse - } { - draw_terminal_field % merged annotation % - - } ifelse + } if } bind executeonly def /draw_acro_form { % <form> draw_acro_form - diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps index 98a9e3d4fea..699c14fe307 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or @@ -1234,6 +1234,23 @@ setglobal { /undef_proc_warning /missing-type1-procs /readonly-op-dict } { currentdict exch undef } forall + % Bug703454.pdf contains a number of fonts with multiple definitions + % of a given glyph name in the CharStrings dict - i.e. two entries + % for /a - the first of which is "correct" the second is "wrong". + % Normal Postscript behaviour replaces the first value with the second + % for the given key/value pair. + % To handle this, *only* for Type 1 fonts embedded in PDFs, we + % have a special definition of "def" which won't overwrite existing + % values in the CharStrings dict. + /def + { + 3 index /CharStrings eq + currentdict 3 index known and + { pstack flush pop pop } + { systemdict /def get exec } + ifelse + } bind executeonly def + end readonly def currentdict /eexec_pdf_param_dict .undef @@ -1481,7 +1498,9 @@ currentdict /eexec_pdf_param_dict .undef } { % filepos fontres stream 1 index /FontDescriptor oget - /Flags oget 4 and 0 ne { + /Flags oget dup % only believe the symbolic flag if the non-symbolic flag is not also set! + 4 and 0 ne + exch 32 and 0 eq and { //true % symbolic } { 1 index /Encoding oknown not % no encoding => symbolic diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps index d7933700f73..ded2782a13e 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or @@ -26,10 +26,12 @@ userdict /GS_PDF_ProcSet undef /#? //false def % Test whether the current output device handles pdfmark. -/.writepdfmarkdict 1 dict dup /pdfmark //null put readonly def /.writepdfmarks { % - .writepdfmarks <bool> - currentdevice //.writepdfmarkdict .getdeviceparams - mark eq { //false } { pop pop //true } ifelse + /PdfmarkCapable /GetDeviceParam .special_op { + exch pop + }{ + //false + }ifelse systemdict /DOPDFMARKS known or } bind executeonly def @@ -282,12 +284,22 @@ currentdict /runpdfstring .undef { systemdict /FirstPage known systemdict /LastPage known or - systemdict /Pagelist 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 + /runpdfbegin { % <file> runpdfbegin - userdict begin % It turns out that the PDF interpreter uses memory more @@ -295,20 +307,22 @@ currentdict /runpdfstring .undef % This is counter-intuitive, and we don't understand why it happens, % but the improvement is significant. /PDFTopSave save def - <</ProcessDSCComment //null>> setuserparams - <</ProcessComment //null>> setuserparams - %% Bug #696487, allow dict stack to grow without limit, as these PDF - %% files have stupidly deep gsave nesting and we need a dictionary per gsave - %% at the moment. - %% Remove ths if bug #696511 is ever completed (move ExtGstate parameters into gstate) - <</MaxDictStack -1>> setuserparams - %% Bug #696567, same customer as above. Ths time they have a file with a page whch has - %% 447000 ExtGState references (all of hwch contain no gstate!) Because we allocate - %% these on the stack, allow the stack to grow indefinitely in order to accomodate - %% such stupid files. Also move these lines from the end of the routine, so that - %% the increases are in place before we call odfopen, which will build the - %% resources and needs this definition in place. - <</MaxOpStack -1>> setuserparams + << + /ProcessDSCComment //null + /ProcessComment //null + %% Bug #696487, allow dict stack to grow without limit, as these PDF + %% files have stupidly deep gsave nesting and we need a dictionary per gsave + %% at the moment. + %% Remove ths if bug #696511 is ever completed (move ExtGstate parameters into gstate) + /MaxDictStack -1 + %% Bug #696567, same customer as above. Ths time they have a file with a page whch has + %% 447000 ExtGState references (all of which contain no gstate!) Because we allocate + %% these on the stack, allow the stack to grow indefinitely in order to accomodate + %% such stupid files. Also move these lines from the end of the routine, so that + %% the increases are in place before we call odfopen, which will build the + %% resources and needs this definition in place. + /MaxOpStack -1 + >> setuserparams //DisablePageHandlerDevice exec @@ -323,7 +337,6 @@ currentdict /runpdfstring .undef /CumulativePageCount currentpagedevice /PageCount get def } bind executeonly def -currentdict /DisablePageHandlerDevice undef /runpdfpagerange { % - runpdfpagerange <firstpage#> <lastpage#> /PortfolioPage where { @@ -375,9 +388,8 @@ currentdict /DisablePageHandlerDevice undef 2 2 pdfpagecount { PDFPageList exch 1 put } for - 1 pdfpagecount QUIET not { - (Processing even-numbered pages\n) print + (Processing even-numbered pages\n) print (1 through ) print pdfpagecount =only (.) = flush } if } { @@ -389,9 +401,8 @@ currentdict /DisablePageHandlerDevice undef 1 2 pdfpagecount { PDFPageList exch 1 put } for - 1 pdfpagecount QUIET not { - (Processing odd-numbered pages\n) print 1 index =only ( through ) print dup =only + (Processing odd-numbered pages\n) print (1 through ) print pdfpagecount =only (.) = flush } if } { @@ -525,10 +536,16 @@ currentdict /DisablePageHandlerDevice undef dup /Page# exch store QUIET not { (Page ) print dup //== exec flush } if pdfgetpage - dup //null ne { pdfshowpage } { - ( **** Error: Page #) pdfformaterror Page# 10 string cvs pdfformaterror - ( not found.\n) pdfformaterror - /dopdfpages cvx /syntaxerror signalerror + dup //null ne { + pdfshowpage + } { + PDFSTOPONERROR { + /dopdfpages cvx /syntaxerror signalerror + } { + pop + ( **** Error: Page #) pdfformaterror Page# 10 string cvs pdfformaterror + ( not found.\n) pdfformaterror + } ifelse } ifelse }{ pop @@ -554,9 +571,12 @@ currentdict /DisablePageHandlerDevice undef PDFTopSave restore end % userdict 2 vmreclaim % couldn't hurt - <</DisablePageHandler //false>> setpagedevice + //EnablePageHandlerDevice exec } bind executeonly def +currentdict /DisablePageHandlerDevice undef +currentdict /EnablePageHandlerDevice undef + % Copy stream to an external temporary file and % return the file name as PS name. /copy_embedded_file { @@ -890,7 +910,25 @@ pdfdict begin { % xref line tag was not /n /f ne % verify that the tag was /f { /setxrefentry cvx /syntaxerror signalerror - } if + } { + % Bug #703214 has a invalid initial xref table. The table entries are correct + % but the subsection begins 1 7 instead of 0 7, which means the initial entry is + % declared as object 1 instead of object 0. The file is incrementally updated + % many times and every object *except* object 1 is redefined. Object 1 is + % therefore defined as free and having an offset of 0. Acrobat can open this + % without complaint! Because the PDF header is a comment line it is skipped + % so Acrobat must simply be ignoring the free flag. We can't easily detect + % this, but we can check for the generation number being the canonical + % head of the free list. If it is, and the object number we have is not + % zero, then pretend its not free....... + dup 65535 eq { + 2 index 0 ne { + 0 3 1 roll + //false setxrefentry + 3 -1 roll pop + } if + }if + }ifelse } ifelse pop pop % pop <obj location> and <gen num> % stack: <err count> <obj num> @@ -1254,26 +1292,26 @@ currentdict /xref-char-dict undef % to the parent field. Trailer /Root knownoget { /AcroForm knownoget { - %% If we don't have a NeedAppearances entry, treat as if true. - %% We know Acrobat always regenerates all annotait - dup /NeedAppearances knownoget not { //true } if { - /NeedAppearances //true def - dup - /Fields knownoget { - { oforce - %% Make sure the entry from the Fields array is a dictionary - %% Bug #692447.pdf has an array of nulls. - dup type /dicttype eq { - link_widget_annots - }if - pop - } forall - } if - pop - } { - pop - } ifelse - } if + %% If we don't have a NeedAppearances entry, treat as if true. + %% We know Acrobat always regenerates all annotations. + dup /NeedAppearances knownoget not { //true } if { + /NeedAppearances //true def + dup + /Fields knownoget { + { oforce + %% Make sure the entry from the Fields array is a dictionary + %% Bug #692447.pdf has an array of nulls. + dup type /dicttype eq { + link_widget_annots + }if + pop + } forall + } if + pop + } { + pop + } ifelse + } if } if % Use OutputIntent ICC profile @@ -1427,14 +1465,15 @@ currentdict /xref-char-dict undef % Guess whether the output device is a printer. /Printed currentpagedevice /OutputFile known def } ifelse - currentpagedevice /OutputFile known { - currentpagedevice /OutputFile get (%d) search { - pop pop pop + % If the file name has an odd number of '%', it is either a request for + % separate pages, or is invalid. In either case some marks can be omitted. + currentpagedevice /OutputFile .knownget { + //false exch { + 37 eq xor + } forall { /NO_PDFMARK_OUTLINES //true def /NO_PDFMARK_DESTS //true def - } { - pop - }ifelse + } if } if /PSLevel1 where { pop } { /PSLevel1 //false def } ifelse % NB: PDFfile is used outside of the PDF code to determine that a @@ -1579,10 +1618,9 @@ currentdict /xref-char-dict undef % Check for recursion in the page tree. Bug 689954, MOAB-06-01-2007 % Make sure that the operand stack is cleaned up in case there's % an error and we ignore it (bug #700953) - mark + /StackMarkVerifyPageTree verify_page_tree - cleartomark - + /StackMarkVerifyPageTree ClearToKey currentdict end } bind executeonly def @@ -1923,7 +1961,6 @@ currentdict /xref-char-dict undef }ifelse }{ % No Page Resources, recursively try ParentResources as a last resort - pop % page Resources LocalResources parent_obj_get } ifelse } { @@ -1971,7 +2008,8 @@ currentdict /xref-char-dict undef % Get the total number of pages in the document. /pdfpagecount % - pdfpagecount <int> - { Trailer /Root knownoget { + { + Trailer /Root knownoget { /Pages knownoget { dup /Count knownoget { dup type /integertype eq { dup 0 le } { //true } ifelse { @@ -2078,10 +2116,20 @@ currentdict /xref-char-dict undef exch pop //null 0 1 3 index length 1 sub { 2 index exch get - dup oforce dup /Kids known { /Count oget } { pop 1 } ifelse + dup oforce + dup //null eq { + PDFSTOPONERROR { + /pdffindpage? cvx /syntaxerror signalerror + } { + ( **** Error: Ignoring a null node in the Page tree.\n) pdfformaterror + pop pop + } ifelse + } { + dup /Kids known { /Count oget } { pop 1 } ifelse % Stack: index kids null noderef count - dup 5 index ge { pop exch pop exit } if - 5 -1 roll exch sub 4 1 roll pop + dup 5 index ge { pop exch pop exit } if + 5 -1 roll exch sub 4 1 roll pop + } ifelse } for exch pop % Stack: index null|noderef dup //null eq { pop pop 1 //null exit } if @@ -2511,7 +2559,7 @@ end readonly def 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 - 5 index /Rotate pget not { 0 } if 90 cvi idiv 1 and 0 ne { exch } if + 5 index /Rotate pget not { 0 } if cvi 90 idiv 1 and 0 ne { exch } if % stack: savedCTM <pdfpagedict> [Box] XImageable YImageable XBox YBox 4 copy 3 -1 roll exch div 3 1 roll div .min @@ -2647,7 +2695,11 @@ currentdict /PDF2PS_matrix_key undef % Determine the number of spot colors used on the page. Note: This searches % the pages resources. It may be high if a spot color is in a resource but % is not actually used on the page. - currentpagedevice /PageSpotColors known { /PageSpotColors 2 index countspotcolors def } if + currentpagedevice /PageSpotColors known { + /PageSpotColors 2 index countspotcolors + userdict /PageSpotColors 2 index put + def + } if % If the user told us to use a named OutputIntent systemdict /UseOutputIntent .knownget { @@ -2701,6 +2753,30 @@ currentdict /PDF2PS_matrix_key undef % Stack: pagedict currentpagedict installproc /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 + dup /Overprint get /disable ne + % If the device suppports SpotColors (DeviceN device) we don't need simulation + 1 index /PageSpotColors known + not and + /HighLevelDevice /GetDeviceParam .special_op { + exch pop + }{ + //false + }ifelse + not and % Only if not HighLevelDevice + { + % 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 pageusesoverprint + 1 index /ProcessColorModel get /DeviceCMYK eq { + PageSpotColors 0 gt % count of colorants NOT including CMYK + and + } if + /PageUsesOverprint exch def % the page needs OP simulation so set device param. + } if pop currentdict end setpagedevice } bind executeonly def @@ -2769,18 +2845,46 @@ currentdict /PDF2PS_matrix_key undef % and the result was set in the pagedevice dictionary. Use it rather than % scanning again IF it is present. If the pdfshowpage_setup was not called % (eg GSView 5) then it will not be present, so we must rescan. - currentpagedevice /PageUsesTransparency .knownget not {dup pageusestransparency} if + currentdict /PageUsesTransparency .knownget not {dup pageusestransparency} if dup /PDFusingtransparency exch def { - % If the current device isn't CMYK, or if it is a device that (currently) supports transparency + % 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. - currentpagedevice dup /Colors get 4 lt 1 index /SimulateOverprint get not or - exch /HaveTransparency .knownget not { //false } if or - % device needs special Oveprint handling + + 4 dict begin % working directory to simplify + currentpagedevice dup /Colors get + /devColors exch def % put into our convenience dict + dup /HaveTransparency .knownget not { //false } if + /devSupportsTrans exch def % put into our convenience dict + dup /Overprint get + /SimOP exch def % put into our convenience dict + SimOP /simulate eq + exch /PageUsesOverprint .knownget not { //false } if + 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 + or + } { + //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 + } { + SimOP /enable eq + 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 /setup_trans exch - { /setupSMtrans } { /setupOPtrans } ifelse + { /setupOPtrans } { /setupSMtrans } ifelse load def + % Show the page within a PDF 1.4 device filter. - 0 .pushpdf14devicefilter { + { -1 } { 0 } ifelse + .pushpdf14devicefilter { /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) @@ -2808,7 +2912,31 @@ currentdict /PDF2PS_matrix_key undef } { /setup_trans { pop pop } def % no-op this if the page doesn't use transparency % NB: original will be restored from PDFsave - showpagecontents + % The page doesn't use transparency, but if Overprint is /simulate, we may need to + % push a pdf14devicefilter to handle the overprint simulation using the pdf14 device. + currentpagedevice + dup /Overprint get /simulate eq + 1 index /PageSpotColors known + not and + exch /PageUsesOverprint .knownget not { //false } if + and + { + % Show the page within a PDF 1.4 device filter for overprint_simulation. + -1 .pushpdf14devicefilter { + /DefaultQstate qstate store % device has changed -- reset DefaultQstate + showpagecontents + } stopped { + % abort the transparency device + .abortpdf14devicefilter + /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 + } { + showpagecontents + } ifelse } ifelse .free_page_resources % todo: mixing drawing ops outside the device filter could cause @@ -2967,7 +3095,8 @@ currentdict /PDF2PS_matrix_key undef } ifelse } if } if - //systemdict /ShowAcroForm .knownget { //true eq } { //false } ifelse { + % default AcroForm to true to match Acrobat. + //systemdict /ShowAcroForm .knownget { //true eq } { //true } ifelse { Trailer /Root oget /AcroForm knownoget { draw_acro_form } if } if } bind executeonly def @@ -2980,6 +3109,112 @@ currentdict /PDF2PS_matrix_key undef dup { setcolorspace } //.internalstopped exec { pop /DeviceRGB } if } bind executeonly def +% returns true if OP or op is true in an ExtGState +/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 + %% if they both have stored object numbers. If they do then + %% check the numbers, don't allow self-references. + dup /Parent knownoget not { pop exit } + { + exch /.gs.pdfobj# .knownget + { + 1 index /.gs.pdfobj# .knownget { + eq { + pop exit + }if + }{ + pop + }ifelse + }if + } ifelse + } loop + % Also check for transparency in the annotation (if not in resources). + { pop //true } { annotsuseoverprint } ifelse +} bind def + +% Check if Overprint (OP/op) is specified in an ExtGState dict +/extgstateusesoverprint { % <gstate dict> extgstateusesoverprint <bool> + //false exch % Assume no overprint + dup //null eq { + pop % bug 692050 + } { + { % establish loop context + dup /OP knownoget { { pop not exit } if } if + dup /op knownoget { { pop not exit } if } if + pop exit + } loop + } ifelse +} bind def + +% Check if overprint is used in a Pattern +/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 + pop exit + } loop +} 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. + /Resources knownoget not { 0 dict } if + 2 copy .knownget { + { % Some circular references may be missed because scanning stops + % when the 1st overprint is found. + ( **** File has circular references in resource dictionaries.\n) + pdfformaterror + } if + pop //false exit + } if + 2 copy //true put % In the current chain. + dup /ExtGState knownoget { + //false exch + { exch pop oforce extgstateusesoverprint { pop //true exit } if + } forall + { pop //true exit } if + } if + dup /Pattern knownoget { + //false exch + { exch pop oforce patternusesoverprint { pop //true exit } if + } forall + { pop //true exit } if + } if + 2 copy //false put % Visited but not in the current chain. + pop //false exit + } loop + exch pop +} 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 + 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 + } if + } if % If AP dict known + } { + pop + } ifelse + } forall % For all annots on the page + } { + ( **** Error: Annotation array is not an array, ignoring it.\n) pdfformaterror + ( Output may be incorrect.\n) pdfformaterror + pop + } + ifelse + } if +} bind def + % ------ Transparency support ------ % % Determine whether a page might invoke any transparency features: @@ -3162,31 +3397,37 @@ currentdict /PDF2PS_matrix_key undef } { exch pop % remove the 'on error' marker - dup //null ne { - dup /Subtype knownoget { - /Highlight eq { % Highlight annotation is always implemented - pop pop //true exit % as transparency. + dup type /dicttype eq { + dup //null ne { + dup /Subtype knownoget { + /Highlight eq { % Highlight annotation is always implemented + pop pop //true exit % as transparency. + } if } if - } if - 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 + 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 + dup /BM knownoget { + pop pop pop //true exit } if - } if % If AP dict known - dup /BM knownoget { - pop pop pop //true exit - } if - dup /CA knownoget { - 1 le { - pop pop //true exit + dup /CA knownoget { + 1 le { + pop pop //true exit + } if } if - } if - /ca knownoget { - 1 le { - pop //true exit + /ca knownoget { + 1 le { + pop //true exit + } if } if - } if + } { + pop + } ifelse } { + ( **** Error: Annotation entry is not a dictionary, ignoring it.\n) pdfformaterror + ( Output may be incorrect.\n) pdfformaterror pop } ifelse } ifelse @@ -3213,21 +3454,32 @@ currentdict /PDF2PS_matrix_key undef % Thus it may include Cyan, Magenta, Yellow, and Black. % <colorspace> <spotcolordict> colorspacespotcolors - /colorspacespotcolors { - exch dup type /arraytype eq { + % Make sure we have an array, and that it is has enough info + exch dup type /arraytype eq + { % If we have an Indexed color space then get the base space. dup 0 oget % <<>> [csp] /Type dup /Indexed eq { pop 1 oget % <<>> [base] 2 copy exch colorspacespotcolors } { - % Stack: <spotcolordict> <colorspace> <colorspacetype> - dup /Separation eq exch /DeviceN eq or { - dup 1 oget dup type /arraytype eq { - { oforce 2 index putspotcolor } forall + dup /Pattern eq { + 1 index length 1 gt { % only uncolored patterns have colorspace + pop 1 oget % <<>> [base] + 2 copy exch colorspacespotcolors } { - 2 index putspotcolor + pop } ifelse - } if + } { + % Stack: <spotcolordict> <colorspace> <colorspacetype> + dup /Separation eq exch /DeviceN eq or { + dup 1 oget dup type /arraytype eq { + { oforce 2 index putspotcolor } forall + } { + 2 index putspotcolor + } ifelse + } if + } ifelse } ifelse } if pop pop @@ -3647,6 +3899,70 @@ currentdict /PDF2PS_matrix_key undef } if } bind executeonly def +% These functions can be used in error handling. It is not always possible to +% use the PostScript sequence 'mark ..... cleartomark' to clean up behind a +% sequence of operations, because processing the PDF might leave a mark +% object on the stack. There are a number of ways to address that problem; one +% is to count the objects on the stack at the time and store that value in a +% convenient dictionary, presented here is an alternative. Instead of using a +% mark object, we can use a specific name object as if it were a mark object +% and use the two routines below to count the number of objects on the stack +% up to a specific key, and to clear the stack back to a named key. + +% +% /key CountToKey false | int true +% +% Counts the operand stack backwards until it encounters +% a specific name key on the stack. Returns true and the count +% of objects on the stack after that key, or false if the key +% was not found on the stack. Consumes the key passed +% to CountToKey. Throws a typecheck if the operand is not +% a name type. +% +/CountToKey +{ + dup type /nametype eq { + //false + 0 1 count 5 sub + { + dup 3 add index + 3 index eq + { + 3 1 roll pop pop //true exit + } + {pop} ifelse + } for + + { + //true + } + { + pop //false + } ifelse + } + { + /CountToKey cvx /typecheck signalerror + }ifelse +}bind readonly def + +% +% /key ClearToKey - +% +% Clears the operand stack backwards until it encounters +% the name object passed as an operand. If the name object +% is not present on the stack then it will clear the entire +% stack. Like cleartomark this removes the 'key' from the stack. +% +/ClearToKey +{ + 0 1 count 4 sub + { + pop + dup 3 1 roll eq {exit} if + } for + pop +}bind readonly def + end % pdfdict diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps index 47ff512d927..fe61b12dcdb 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or @@ -695,10 +695,11 @@ end { % Check OP and BM in case we need to push a group //OPsaveDstack begin //Dpush exec % push the current OPsaveDstack values into 'previous' + /SupportsDevn .special_op okOPcs currentcolorspace 0 get dup /Indexed eq { pop currentcolorspace 1 get % use the base space } if - known { + known or { 1 index /stroke ne { .currentfilloverprint } { .currentstrokeoverprint } ifelse % Change BM to CompatibleOverprint if this has overprint true dup /ChangeBM exch def @@ -1478,19 +1479,8 @@ currentdict /clip_if_required .undef % width under pdfwrite. Pdfwrite uses (in text mode) an identity % CTM, so we need to calculate the stroke width which would result % if the CTM had been unity. - currentlinewidth dup - currentdict /qTextSaveMatrix known { - matrix defaultmatrix idtransform qTextSaveMatrix dtransform - }{ - matrix defaultmatrix idtransform TextSaveMatrix dtransform - } ifelse - abs 2 copy exch abs eq { - pop - }{ - % non-square scaling reduces to Text matrix in pdfwrite , so - % we can ignore it. (wrong answer, but consistent) - pop pop currentlinewidth - }ifelse setlinewidth + calc_text_linewidth + setlinewidth show setlinewidth} bind executeonly % Tr 2 - Fill then Stroke { currentlinewidth exch setsmaskstate @@ -1498,19 +1488,8 @@ currentdict /clip_if_required .undef % width under pdfwrite. Pdfwrite uses (in text mode) an identity % CTM, so we need to calculate the stroke width which would result % if the CTM had been unity. - currentlinewidth dup - currentdict /qTextSaveMatrix known { - matrix defaultmatrix idtransform qTextSaveMatrix dtransform - }{ - matrix defaultmatrix idtransform TextSaveMatrix dtransform - } ifelse - abs 2 copy exch abs eq { - pop - }{ - % non-square scaling reduces to Text matrix in pdfwrite , so - % we can ignore it. (wrong answer, but consistent) - pop pop currentlinewidth - }ifelse setlinewidth + calc_text_linewidth + setlinewidth setsmaskstate show setlinewidth} bind executeonly % Tr 3 - Neither fill nor stroke { setsmaskstate show } bind executeonly @@ -1525,38 +1504,50 @@ currentdict /clip_if_required .undef setsmaskstate dup show grestore //true charpath } bind executeonly % Tr 5 - Stroke, add to clip { gsave 1 .settextrenderingmode - currentlinewidth dup - matrix defaultmatrix idtransform TextSaveMatrix dtransform - abs 2 copy exch abs eq { - pop - }{ - % non-square scaling reduces to Text matrix in pdfwrite , so - % we can ignore it. (wrong answer, but consistent) - pop pop currentlinewidth - }ifelse setlinewidth + calc_text_linewidth + setlinewidth setsmaskstate dup show grestore //true charpath} bind executeonly % Tr 6 - Fill, stroke, add to clip { gsave 2 .settextrenderingmode - currentlinewidth dup - currentdict /qTextSaveMatrix known { - matrix defaultmatrix idtransform qTextSaveMatrix dtransform - }{ - matrix defaultmatrix idtransform TextSaveMatrix dtransform - } ifelse - abs 2 copy exch abs eq { - pop - }{ - % non-square scaling reduces to Text matrix in pdfwrite , so - % we can ignore it. (wrong answer, but consistent) - pop pop currentlinewidth - }ifelse setlinewidth + calc_text_linewidth + setlinewidth setsmaskstate dup show grestore //true charpath} bind executeonly % Tr 7 - Add to clip { //true charpath} bind executeonly ] readonly def +% - calc_text_linewidth calculated_width +% This calculates the required linewidth for stroke for *pdfwrite*, it must not be +% used for rendering. Because pdfwrite writes text scaled into a 72 dpi resolution +% we cannot use the current linewidth for it, it will be too large. Instead we must +% re-calculate the original linewidth (removing the default CTM) and then apply the +% TextSaveMatrix to find the appropriate new linewidth. +% We check to see if the x and y scaling are approximately the same, if they are not +% then we calculate a linewidth based on a right triangle with the x and y values +% of the current linewidth in each direction and then calculate the hypotenuse, which +% we then use as an approximation to the required width. +% The 'approximation' of 0.01 is just a guess. +/calc_text_linewidth +{ + currentlinewidth dup + currentdict /qTextSaveMatrix known { + matrix defaultmatrix idtransform qTextSaveMatrix dtransform + }{ + matrix defaultmatrix idtransform TextSaveMatrix dtransform + } ifelse + abs 2 copy exch abs sub abs 0.01 le { + pop + }{ + % We used to leave the linewidth alone for non-square resolutions, + % claiming it reduced to the text matrix in pdfwrite. This is not + % true. So handle it the same way we usually do, the hypotenuse of + % the unit square transformed through the TextSaveMatrix. + dup mul exch dup mul add sqrt 2 div + }ifelse +} bind executeonly def + /setstrokeforTrpreservation { % Check to see if the current device supports Tr /PreserveTrMode /GetDeviceParam .special_op { @@ -1573,15 +1564,7 @@ currentdict /clip_if_required .undef % CTM, so we need to calculate the stroke width which would result % if the CTM had been unity. NOTE! Only interested in magnitudes, % not signs. - currentlinewidth dup - matrix defaultmatrix idtransform TextSaveMatrix dtransform - abs 2 copy exch abs eq { - pop - }{ - % non-square scaling reduces to Text matrix in pdfwrite , so - % we can ignore it. (wrong answer, but consistent) - pop pop currentlinewidth - }ifelse + calc_text_linewidth setlinewidth } if } if diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_rbld.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_rbld.ps index 037f10b723b..6eeb6085e99 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_rbld.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_rbld.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or @@ -142,13 +142,28 @@ PDFfile token pop % get starting entry - or 'trailer' (trailer) ne { % if we do not already have 'trailer' PDFfile token pop % get number of entries - PDFfile token pop pop % this moves us into the middle of the first entry - 25 string exch % define working string for readline - { PDFfile 1 index readline pop pop - } repeat % skip entries - pop % pop working string - PDFfile token pop pop % get 'trailer' - PDFfile fileposition % get file position + % The following check could be more efficient + % but broken file..... + dup + PDFfile fileposition + PDFfile 0 setfileposition + PDFfile bytesavailable + exch PDFfile exch setfileposition + % On the basis it requires at least 15 bytes to define an object + % in PDF, if the claimed number of objects is more than the number + % of bytes in the file, then it is clearly bogus, and we just give up + 15 idiv + lt { + PDFfile token pop pop % this moves us into the middle of the first entry + 25 string exch % define working string for readline + { PDFfile 1 index readline pop pop + } repeat % skip entries + pop % pop working string + PDFfile token pop pop % get 'trailer' + PDFfile fileposition % get file position + } + { pop 0} + ifelse } if } { pop 0 % no xref, should not happen, report it upstrem diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_sec.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_sec.ps index b6f2bfce556..9e6c1c0f074 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_sec.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_sec.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or @@ -481,15 +481,33 @@ systemdict /check_r6_password .forceundef % Even if StmF and StrF are Identity, if the StdCF is missing AuthEvent % or it is DocOpen, we require the password. Check for that. 1 index /CF .knownget { - /StdCF .knownget { - /AuthEvent .knownget { - /DocOpen eq - or + oforce dup type /dicttype eq { + /StdCF .knownget { + oforce dup type /dicttype eq { + /AuthEvent .knownget { + oforce dup type /nametype eq { + /DocOpen eq + or + }{ + ( **** Error: AuthEvent has wrong type.\n) pdfformaterror + ( Cannot decrypt PDF file.\n) pdfformaterror + /pdf_process_Encrypt cvx /invalidfileaccess signalerror + } ifelse + } { + pop true % no AuthEvent, default is DocOpen, require password + } ifelse + }{ + ( **** Error: StdCF has wrong type.\n) pdfformaterror + ( Cannot decrypt PDF file.\n) pdfformaterror + /pdf_process_Encrypt cvx /invalidfileaccess signalerror + } ifelse } { - pop true % no AuthEvent, default is DocOpen, require password + pop true % no StdCF, require password } ifelse - } { - pop true % no StdCF, require password + }{ + ( **** Error: CF has wrong type.\n) pdfformaterror + ( Cannot decrypt PDF file.\n) pdfformaterror + /pdf_process_Encrypt cvx /invalidfileaccess signalerror } ifelse } { pop true % no CF, require password diff --git a/Master/tlpkg/tlgs/Resource/SubstCID/CNS1-WMode b/Master/tlpkg/tlgs/Resource/SubstCID/CNS1-WMode index cc0e9bbd4b7..9b3939fab43 100644 --- a/Master/tlpkg/tlgs/Resource/SubstCID/CNS1-WMode +++ b/Master/tlpkg/tlgs/Resource/SubstCID/CNS1-WMode @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/SubstCID/GB1-WMode b/Master/tlpkg/tlgs/Resource/SubstCID/GB1-WMode index 22da0829dba..7d022f8536f 100644 --- a/Master/tlpkg/tlgs/Resource/SubstCID/GB1-WMode +++ b/Master/tlpkg/tlgs/Resource/SubstCID/GB1-WMode @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/SubstCID/Japan1-WMode b/Master/tlpkg/tlgs/Resource/SubstCID/Japan1-WMode index 9f85a86e694..f2110449b4b 100644 --- a/Master/tlpkg/tlgs/Resource/SubstCID/Japan1-WMode +++ b/Master/tlpkg/tlgs/Resource/SubstCID/Japan1-WMode @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/Resource/SubstCID/Korea1-WMode b/Master/tlpkg/tlgs/Resource/SubstCID/Korea1-WMode index ff59b9dc3b1..8832bbe45b8 100644 --- a/Master/tlpkg/tlgs/Resource/SubstCID/Korea1-WMode +++ b/Master/tlpkg/tlgs/Resource/SubstCID/Korea1-WMode @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/bin/gsdll32.dll b/Master/tlpkg/tlgs/bin/gsdll32.dll Binary files differindex ccb9e8ae561..3d8e1b45b51 100755 --- a/Master/tlpkg/tlgs/bin/gsdll32.dll +++ b/Master/tlpkg/tlgs/bin/gsdll32.dll diff --git a/Master/tlpkg/tlgs/bin/gsdll32.lib b/Master/tlpkg/tlgs/bin/gsdll32.lib Binary files differindex 08622653a0e..4e83a39ba80 100644 --- a/Master/tlpkg/tlgs/bin/gsdll32.lib +++ b/Master/tlpkg/tlgs/bin/gsdll32.lib diff --git a/Master/tlpkg/tlgs/bin/gswin32.exe b/Master/tlpkg/tlgs/bin/gswin32.exe Binary files differindex 30f6cbe7c59..2de05581cfc 100755 --- a/Master/tlpkg/tlgs/bin/gswin32.exe +++ b/Master/tlpkg/tlgs/bin/gswin32.exe diff --git a/Master/tlpkg/tlgs/bin/gswin32c.exe b/Master/tlpkg/tlgs/bin/gswin32c.exe Binary files differindex d58a476629f..ab6086ae7f4 100755 --- a/Master/tlpkg/tlgs/bin/gswin32c.exe +++ b/Master/tlpkg/tlgs/bin/gswin32c.exe diff --git a/Master/tlpkg/tlgs/lib/align.ps b/Master/tlpkg/tlgs/lib/align.ps index 8f2ebf5a94f..e1f562b39a1 100644 --- a/Master/tlpkg/tlgs/lib/align.ps +++ b/Master/tlpkg/tlgs/lib/align.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/caption.ps b/Master/tlpkg/tlgs/lib/caption.ps index 1ec719a74c9..7e345ba502e 100644 --- a/Master/tlpkg/tlgs/lib/caption.ps +++ b/Master/tlpkg/tlgs/lib/caption.ps @@ -1,5 +1,5 @@ %! -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/cid2code.ps b/Master/tlpkg/tlgs/lib/cid2code.ps index 98423fb7fd2..45044cdf955 100644 --- a/Master/tlpkg/tlgs/lib/cid2code.ps +++ b/Master/tlpkg/tlgs/lib/cid2code.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/docie.ps b/Master/tlpkg/tlgs/lib/docie.ps index 82a16bb0afe..1d1ad9a193c 100644 --- a/Master/tlpkg/tlgs/lib/docie.ps +++ b/Master/tlpkg/tlgs/lib/docie.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/gs_ce_e.ps b/Master/tlpkg/tlgs/lib/gs_ce_e.ps index 5db08a11ab5..150c55b27a3 100644 --- a/Master/tlpkg/tlgs/lib/gs_ce_e.ps +++ b/Master/tlpkg/tlgs/lib/gs_ce_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/gs_css_e.ps b/Master/tlpkg/tlgs/lib/gs_css_e.ps new file mode 100644 index 00000000000..c4323bc5b06 --- /dev/null +++ b/Master/tlpkg/tlgs/lib/gs_css_e.ps @@ -0,0 +1,117 @@ +% Copyright (C) 2001-2021 Artifex Software, Inc. +% All Rights Reserved. +% +% This software is provided AS-IS with no warranty, either express or +% implied. +% +% This software is distributed under license and may not be copied, +% modified or distributed except as expressly authorized under the terms +% of the license contained in the file LICENSE in this distribution. +% +% Refer to licensing information at http://www.artifex.com or contact +% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, +% CA 94903, U.S.A., +1(415)492-9861, for further information. +% + +% Define the CFF StandardStrings that represent characters. +% This is a pseudo-encoding. +/currentglobal where + { pop currentglobal { setglobal } //true setglobal } + { { } } +ifelse +/CFFStandardStrings mark + +% 0 + /.notdef /space /exclam /quotedbl /numbersign + /dollar /percent /ampersand /quoteright /parenleft + /parenright /asterisk /plus /comma /hyphen + /period /slash /zero /one /two + /three /four /five /six /seven + /eight /nine /colon /semicolon /less + /equal /greater /question /at /A + /B /C /D /E /F + /G /H /I /J /K + /L /M /N /O /P +% 50 + /Q /R /S /T /U + /V /W /X /Y /Z + /bracketleft /backslash /bracketright /asciicircum /underscore + /quoteleft /a /b /c /d + /e /f /g /h /i + /j /k /l /m /n + /o /p /q /r /s + /t /u /v /w /x + /y /z /braceleft /bar /braceright + /asciitilde /exclamdown /cent /sterling /fraction +% 100 + /yen /florin /section /currency /quotesingle + /quotedblleft /guillemotleft /guilsinglleft /guilsinglright /fi + /fl /endash /dagger /daggerdbl /periodcentered + /paragraph /bullet /quotesinglbase /quotedblbase /quotedblright + /guillemotright /ellipsis /perthousand /questiondown /grave + /acute /circumflex /tilde /macron /breve + /dotaccent /dieresis /ring /cedilla /hungarumlaut + /ogonek /caron /emdash /AE /ordfeminine + /Lslash /Oslash /OE /ordmasculine /ae + /dotlessi /lslash /oslash /oe /germandbls +% 150 + /onesuperior /logicalnot /mu /trademark /Eth + /onehalf /plusminus /Thorn /onequarter /divide + /brokenbar /degree /thorn /threequarters /twosuperior + /registered /minus /eth /multiply /threesuperior + /copyright /Aacute /Acircumflex /Adieresis /Agrave + /Aring /Atilde /Ccedilla /Eacute /Ecircumflex + /Edieresis /Egrave /Iacute /Icircumflex /Idieresis + /Igrave /Ntilde /Oacute /Ocircumflex /Odieresis + /Ograve /Otilde /Scaron /Uacute /Ucircumflex + /Udieresis /Ugrave /Yacute /Ydieresis /Zcaron +% 200 + /aacute /acircumflex /adieresis /agrave /aring + /atilde /ccedilla /eacute /ecircumflex /edieresis + /egrave /iacute /icircumflex /idieresis /igrave + /ntilde /oacute /ocircumflex /odieresis /ograve + /otilde /scaron /uacute /ucircumflex /udieresis + /ugrave /yacute /ydieresis /zcaron /exclamsmall + /Hungarumlautsmall /dollaroldstyle /dollarsuperior /ampersandsmall /Acutesmall + /parenleftsuperior /parenrightsuperior /twodotenleader /onedotenleader /zerooldstyle + /oneoldstyle /twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle + /sixoldstyle /sevenoldstyle /eightoldstyle /nineoldstyle /commasuperior +% 250 + /threequartersemdash /periodsuperior /questionsmall /asuperior /bsuperior + /centsuperior /dsuperior /esuperior /isuperior /lsuperior + /msuperior /nsuperior /osuperior /rsuperior /ssuperior + /tsuperior /ff /ffi /ffl /parenleftinferior + /parenrightinferior /Circumflexsmall /hyphensuperior /Gravesmall /Asmall + /Bsmall /Csmall /Dsmall /Esmall /Fsmall + /Gsmall /Hsmall /Ismall /Jsmall /Ksmall + /Lsmall /Msmall /Nsmall /Osmall /Psmall + /Qsmall /Rsmall /Ssmall /Tsmall /Usmall + /Vsmall /Wsmall /Xsmall /Ysmall /Zsmall +% 300 + /colonmonetary /onefitted /rupiah /Tildesmall /exclamdownsmall + /centoldstyle /Lslashsmall /Scaronsmall /Zcaronsmall /Dieresissmall + /Brevesmall /Caronsmall /Dotaccentsmall /Macronsmall /figuredash + /hypheninferior /Ogoneksmall /Ringsmall /Cedillasmall /questiondownsmall + /oneeighth /threeeighths /fiveeighths /seveneighths /onethird + /twothirds /zerosuperior /foursuperior /fivesuperior /sixsuperior + /sevensuperior /eightsuperior /ninesuperior /zeroinferior /oneinferior + /twoinferior /threeinferior /fourinferior /fiveinferior /sixinferior + /seveninferior /eightinferior /nineinferior /centinferior /dollarinferior + /periodinferior /commainferior /Agravesmall /Aacutesmall /Acircumflexsmall +% 350 + /Atildesmall /Adieresissmall /Aringsmall /AEsmall /Ccedillasmall + /Egravesmall /Eacutesmall /Ecircumflexsmall /Edieresissmall /Igravesmall + /Iacutesmall /Icircumflexsmall /Idieresissmall /Ethsmall /Ntildesmall + /Ogravesmall /Oacutesmall /Ocircumflexsmall /Otildesmall /Odieresissmall + /OEsmall /Oslashsmall /Ugravesmall /Uacutesmall /Ucircumflexsmall + /Udieresissmall /Yacutesmall /Thornsmall /Ydieresissmall +% 379 + /001.000 /001.001 /001.002 /001.003 + /Black /Bold /Book /Light /Medium + /Regular /Roman /Semibold +%391 = end + +counttomark packedarray exch pop +10 1 index .registerencoding +.defineencoding +exec diff --git a/Master/tlpkg/tlgs/lib/gs_il2_e.ps b/Master/tlpkg/tlgs/lib/gs_il2_e.ps index 7ef56d4595f..e9ee3075845 100644 --- a/Master/tlpkg/tlgs/lib/gs_il2_e.ps +++ b/Master/tlpkg/tlgs/lib/gs_il2_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/gs_kanji.ps b/Master/tlpkg/tlgs/lib/gs_kanji.ps index 862f5ff333e..f2de7816242 100644 --- a/Master/tlpkg/tlgs/lib/gs_kanji.ps +++ b/Master/tlpkg/tlgs/lib/gs_kanji.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/gs_ksb_e.ps b/Master/tlpkg/tlgs/lib/gs_ksb_e.ps index 4d228765c5f..2d2960c74bc 100644 --- a/Master/tlpkg/tlgs/lib/gs_ksb_e.ps +++ b/Master/tlpkg/tlgs/lib/gs_ksb_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/gs_lgo_e.ps b/Master/tlpkg/tlgs/lib/gs_lgo_e.ps index dd04ff6673f..1f949ab9b54 100644 --- a/Master/tlpkg/tlgs/lib/gs_lgo_e.ps +++ b/Master/tlpkg/tlgs/lib/gs_lgo_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/gs_lgx_e.ps b/Master/tlpkg/tlgs/lib/gs_lgx_e.ps index 0c12e2d871c..a2f6216077f 100644 --- a/Master/tlpkg/tlgs/lib/gs_lgx_e.ps +++ b/Master/tlpkg/tlgs/lib/gs_lgx_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/gs_wl1_e.ps b/Master/tlpkg/tlgs/lib/gs_wl1_e.ps index 72185fee271..10a8f3ca533 100644 --- a/Master/tlpkg/tlgs/lib/gs_wl1_e.ps +++ b/Master/tlpkg/tlgs/lib/gs_wl1_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/gs_wl2_e.ps b/Master/tlpkg/tlgs/lib/gs_wl2_e.ps index 6b55c55743c..f7fc8cc1e9a 100644 --- a/Master/tlpkg/tlgs/lib/gs_wl2_e.ps +++ b/Master/tlpkg/tlgs/lib/gs_wl2_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/gs_wl5_e.ps b/Master/tlpkg/tlgs/lib/gs_wl5_e.ps index 4f259792f70..f7549b49d8b 100644 --- a/Master/tlpkg/tlgs/lib/gs_wl5_e.ps +++ b/Master/tlpkg/tlgs/lib/gs_wl5_e.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/gslp.ps b/Master/tlpkg/tlgs/lib/gslp.ps index 9e2c21bf304..173d52c2170 100644 --- a/Master/tlpkg/tlgs/lib/gslp.ps +++ b/Master/tlpkg/tlgs/lib/gslp.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/gsnup.ps b/Master/tlpkg/tlgs/lib/gsnup.ps index ea01d874bb8..61fd57a6633 100644 --- a/Master/tlpkg/tlgs/lib/gsnup.ps +++ b/Master/tlpkg/tlgs/lib/gsnup.ps @@ -1,5 +1,5 @@ %! -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/image-qa.ps b/Master/tlpkg/tlgs/lib/image-qa.ps index 307a951d31b..4780c14e583 100644 --- a/Master/tlpkg/tlgs/lib/image-qa.ps +++ b/Master/tlpkg/tlgs/lib/image-qa.ps @@ -1,5 +1,5 @@ %!PS -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/jispaper.ps b/Master/tlpkg/tlgs/lib/jispaper.ps index d1e33e6acb7..6b59f70b0b5 100644 --- a/Master/tlpkg/tlgs/lib/jispaper.ps +++ b/Master/tlpkg/tlgs/lib/jispaper.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/lines.ps b/Master/tlpkg/tlgs/lib/lines.ps index 287b6bdbea2..a721009aaf6 100644 --- a/Master/tlpkg/tlgs/lib/lines.ps +++ b/Master/tlpkg/tlgs/lib/lines.ps @@ -1,5 +1,5 @@ %! -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/mkcidfm.ps b/Master/tlpkg/tlgs/lib/mkcidfm.ps index 7dd92fe39e3..6e017161dc3 100644 --- a/Master/tlpkg/tlgs/lib/mkcidfm.ps +++ b/Master/tlpkg/tlgs/lib/mkcidfm.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/pdf2dsc.ps b/Master/tlpkg/tlgs/lib/pdf2dsc.ps index 88bc1536242..8e65d9e0279 100644 --- a/Master/tlpkg/tlgs/lib/pdf2dsc.ps +++ b/Master/tlpkg/tlgs/lib/pdf2dsc.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/pdf_info.ps b/Master/tlpkg/tlgs/lib/pdf_info.ps index 0b4654ab073..35951e9a736 100644 --- a/Master/tlpkg/tlgs/lib/pdf_info.ps +++ b/Master/tlpkg/tlgs/lib/pdf_info.ps @@ -1,5 +1,5 @@ %!PS -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or @@ -69,6 +69,81 @@ cleartomark % discard the dict from --where-- % ---- No more executable code on the top level after this line ----- % ---- except 2 lines at the very end ----- +% Write a character to the standard output. +/putchar [ % int -> - + (%stdout) (w) file + /exch cvx /write cvx +] cvx bind def + +% Write U+xxxx to the standard output as UTF-8. +/put-ucode { % int -> - + dup 16#80 ge { + dup 16#800 ge { + dup 16#10000 ge { + dup -18 bitshift 16#f0 or putchar + dup -12 bitshift 16#3f and 16#80 or putchar + } { + dup -12 bitshift 16#e0 or putchar + } ifelse + dup -6 bitshift 16#3f and 16#80 or putchar + } { + dup -6 bitshift 16#C0 or putchar + } ifelse + 16#3f and 16#80 or + } if + putchar +} bind def + +% PDFDocEncoding to U+xxxx decoding table. +/doc-to-ucode [ + 0 1 23 {} for + 16#2d8 16#2c7 16#2c6 16#2d9 16#2dd 16#2db 16#2da 16#2dc + 32 1 127 {} for + 16#2022 16#2020 16#2021 16#2026 16#2014 16#2013 16#192 + 16#2044 16#2039 16#203a 16#2212 16#2030 16#201e 16#201c + 16#201d 16#2018 16#2019 16#201a 16#2122 16#fb01 16#fb02 + 16#141 16#152 16#160 16#178 16#17d 16#131 16#142 16#153 + 16#161 16#17e 0 16#20ac + 161 1 255 {} for +] readonly def + +% Convert a doc string from PDFDocEncoding or UTF-16BE to UTF-8 +% and write it to standard output. +/write-doc-string { % (string) -> - + 1024 string cvs <feff> anchorsearch { + pop + 0 exch % hi16 (str) + 0 2 2 index length 2 sub { + 2 copy 2 copy % hi16 (str) i (str) i (str) i + get 256 mul 3 1 roll % hi16 (str) i hi*256 (str) i + 1 add get add % hi16 (str) i 256*hi+lo + dup 16#fc00 and dup % hi16 (str) i 256*hi+lo tag tag + 16#d800 eq { % High surrogate + pop + 16#3ff and + 10 bitshift + 16#10000 add % hi16 (str) i hi16' + 4 1 roll % hi16' hi16 (str) i + pop exch pop % hi16' (str) + } { + 16#dc00 eq { % Low surrogate + 16#3ff and % hi16 (str) i (256*hi+lo)&0x3ff + 4 -1 roll add % (str) i (256*hi+lo)&0x3ff+hi16 + put-ucode % (str) i + pop 0 exch % 0 (str) + } { % BMP plane + put-ucode % hi16 (str) i + pop % hi16 (str) + } ifelse + } ifelse + } for + pop pop % - + } { + { //doc-to-ucode exch get put-ucode + } forall + } ifelse +} bind def + %% When checking Resources for Font objects, we must ensure that we don't end %% up following a circular reference. Circular references in Resources should %% not, of course, be present but we've seen a number of cases. If we do detect @@ -92,19 +167,6 @@ cleartomark % discard the dict from --where-- } ifelse } bind def -/printXML { % <string> printXML - - % print non-blank lines without trailing spaces - dup dup length 1 sub -1 0 { - 1 index 1 index get 32 eq { - 0 exch getinterval exch - } { - exch = exit % non-blank on this line - } - ifelse - } for - pop pop % clean up -} bind def - /dump-pdf-info { % (fname) -> - () = ( ) print print ( has ) print PDFPageCount dup =print 10 mod 1 eq { ( page.\n) } { ( pages\n) } ifelse = flush @@ -120,24 +182,24 @@ cleartomark % discard the dict from --where-- pop Trailer /Root oget /Metadata knownoget { //false resolvestream - { dup 256 string readline exch printXML not { exit } if } loop + { dup 256 string readstring exch print not { exit } if } loop pop % done with the stream - (_____________________________________________________________) = + (\n_____________________________________________________________) = flush } if } if % Print out the "Info" dictionary if present Trailer /Info knownoget { - dup /Title knownoget { (Title: ) print = flush } if - dup /Author knownoget { (Author: ) print = flush } if - dup /Subject knownoget { (Subject: ) print = flush } if - dup /Keywords knownoget { (Keywords: ) print = flush } if - dup /Creator knownoget { (Creator: ) print = flush } if - dup /Producer knownoget { (Producer: ) print = flush } if - dup /CreationDate knownoget { (CreationDate: ) print = flush } if - dup /ModDate knownoget { (ModDate: ) print = flush } if - dup /Trapped knownoget { (Trapped: ) print = flush } if + dup /Title knownoget { (Title: ) print write-doc-string () = flush } if + dup /Author knownoget { (Author: ) print write-doc-string () = flush } if + dup /Subject knownoget { (Subject: ) print write-doc-string () = flush } if + dup /Keywords knownoget { (Keywords: ) print write-doc-string () = flush } if + dup /Creator knownoget { (Creator: ) print write-doc-string () = flush } if + dup /Producer knownoget { (Producer: ) print write-doc-string () = flush } if + dup /CreationDate knownoget { (CreationDate: ) print write-doc-string () = flush } if + dup /ModDate knownoget { (ModDate: ) print write-doc-string () = flush } if + dup /Trapped knownoget { (Trapped: ) print write-doc-string () = flush } if pop } if @@ -174,9 +236,27 @@ cleartomark % discard the dict from --where-- pop ( Page contains Annotations) print } if - pageusestransparency { + dup pageusestransparency { ( Page uses transparency features) print } if + dup pagespotcolors + dup length 0 gt { + (\n Page Spot colors: ) = + << /Black 0 /Cyan 0 /Magenta 0 /Yellow 0 >> exch + { + pop % discard the value + 1 index 1 index known not { % check if colorant is a standard one + ( ) print + (') print =print (') = + } { + pop % ignore this standard colorant + } ifelse + } forall + pop % discard dict of standard colorants + } { + pop + } ifelse + pop % done with pagedict () = flush } { @@ -193,6 +273,7 @@ cleartomark % discard the dict from --where-- ] def /res-type-dict 10 dict begin + /Font { { exch pop oforce_no_circular @@ -318,6 +399,28 @@ currentdict /res-type-dict undef currentdict /ProcessedResources undef } bind def +% If running with -dSAFER, .sort may not be present. Define a (slower) PS alternative +systemdict /.sort known not { +% <array> <lt-proc> .sort <array> + /.sort + { 1 index length 1 sub -1 1 + { 2 index exch 2 copy get 3 copy % arr proc arr i arr[i] arr i arr[i] + 0 1 3 index 1 sub + { 3 index 1 index get % arr proc arr i arr[i] arr imax amax j arr[j] + 2 index 1 index 10 index exec + { % ... amax < arr[j] + 4 2 roll + } + if pop pop + } + for % arr proc arr i arr[i] arr imax amax + 4 -1 roll exch 4 1 roll put put + } + for + pop + } bind def +} if + /dump-fonts-used { % <dict for fonts> dump-fonts-used - % If DumpFontsUsed is not true, then remove the 'standard' fonts from the list systemdict /DumpFontsUsed known not { diff --git a/Master/tlpkg/tlgs/lib/pfbtopfa.ps b/Master/tlpkg/tlgs/lib/pfbtopfa.ps index 2b69c58f63a..e31db5b0603 100644 --- a/Master/tlpkg/tlgs/lib/pfbtopfa.ps +++ b/Master/tlpkg/tlgs/lib/pfbtopfa.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/ppath.ps b/Master/tlpkg/tlgs/lib/ppath.ps index 5c571019d05..daf7f3990e2 100644 --- a/Master/tlpkg/tlgs/lib/ppath.ps +++ b/Master/tlpkg/tlgs/lib/ppath.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/pphs.ps b/Master/tlpkg/tlgs/lib/pphs.ps index 8605f2dd367..78dfd060e23 100644 --- a/Master/tlpkg/tlgs/lib/pphs.ps +++ b/Master/tlpkg/tlgs/lib/pphs.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/prfont.ps b/Master/tlpkg/tlgs/lib/prfont.ps index 059d2a08483..59b9c199610 100644 --- a/Master/tlpkg/tlgs/lib/prfont.ps +++ b/Master/tlpkg/tlgs/lib/prfont.ps @@ -1,7 +1,7 @@ %! %%Creator: Eric Gisin <egisin@waterloo.csnet> %%Title: Print font catalog -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/ps2ai.ps b/Master/tlpkg/tlgs/lib/ps2ai.ps index 20ae204eb04..fd0dac4a863 100644 --- a/Master/tlpkg/tlgs/lib/ps2ai.ps +++ b/Master/tlpkg/tlgs/lib/ps2ai.ps @@ -1,5 +1,5 @@ %! -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/ps2epsi.ps b/Master/tlpkg/tlgs/lib/ps2epsi.ps index 54621f92834..07d19ded1ee 100644 --- a/Master/tlpkg/tlgs/lib/ps2epsi.ps +++ b/Master/tlpkg/tlgs/lib/ps2epsi.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/rollconv.ps b/Master/tlpkg/tlgs/lib/rollconv.ps index 3a39e02122a..edeb11074e8 100644 --- a/Master/tlpkg/tlgs/lib/rollconv.ps +++ b/Master/tlpkg/tlgs/lib/rollconv.ps @@ -1,5 +1,5 @@ %! -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/stocht.ps b/Master/tlpkg/tlgs/lib/stocht.ps index 8c9bb438303..bf0c5905a11 100644 --- a/Master/tlpkg/tlgs/lib/stocht.ps +++ b/Master/tlpkg/tlgs/lib/stocht.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/traceimg.ps b/Master/tlpkg/tlgs/lib/traceimg.ps index 4ab8720f4b7..eb5cba8cfb2 100644 --- a/Master/tlpkg/tlgs/lib/traceimg.ps +++ b/Master/tlpkg/tlgs/lib/traceimg.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/traceop.ps b/Master/tlpkg/tlgs/lib/traceop.ps index ecd8ce271df..7fa5bcb4df4 100644 --- a/Master/tlpkg/tlgs/lib/traceop.ps +++ b/Master/tlpkg/tlgs/lib/traceop.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/uninfo.ps b/Master/tlpkg/tlgs/lib/uninfo.ps index 98e89062fd6..a2cff7ed7ef 100644 --- a/Master/tlpkg/tlgs/lib/uninfo.ps +++ b/Master/tlpkg/tlgs/lib/uninfo.ps @@ -1,5 +1,5 @@ %! -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/viewcmyk.ps b/Master/tlpkg/tlgs/lib/viewcmyk.ps index e4250bf1d21..e8034e53346 100644 --- a/Master/tlpkg/tlgs/lib/viewcmyk.ps +++ b/Master/tlpkg/tlgs/lib/viewcmyk.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/viewgif.ps b/Master/tlpkg/tlgs/lib/viewgif.ps index 55a39862b2c..a261bf7e654 100644 --- a/Master/tlpkg/tlgs/lib/viewgif.ps +++ b/Master/tlpkg/tlgs/lib/viewgif.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/viewmiff.ps b/Master/tlpkg/tlgs/lib/viewmiff.ps index 39d715d04c2..90db80b0922 100644 --- a/Master/tlpkg/tlgs/lib/viewmiff.ps +++ b/Master/tlpkg/tlgs/lib/viewmiff.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/viewpbm.ps b/Master/tlpkg/tlgs/lib/viewpbm.ps index ec355313767..c8d3f86bc84 100644 --- a/Master/tlpkg/tlgs/lib/viewpbm.ps +++ b/Master/tlpkg/tlgs/lib/viewpbm.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/viewpcx.ps b/Master/tlpkg/tlgs/lib/viewpcx.ps index 6840f1e5c0f..76bfdfae6eb 100644 --- a/Master/tlpkg/tlgs/lib/viewpcx.ps +++ b/Master/tlpkg/tlgs/lib/viewpcx.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/viewps2a.ps b/Master/tlpkg/tlgs/lib/viewps2a.ps index e0fb32bdab6..dafb6d5c3b0 100644 --- a/Master/tlpkg/tlgs/lib/viewps2a.ps +++ b/Master/tlpkg/tlgs/lib/viewps2a.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/viewpwg.ps b/Master/tlpkg/tlgs/lib/viewpwg.ps index 9abae63a436..4ee0cdb7aed 100644 --- a/Master/tlpkg/tlgs/lib/viewpwg.ps +++ b/Master/tlpkg/tlgs/lib/viewpwg.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2017-2018 Artifex Software, Inc. +% Copyright (C) 2017-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/viewraw.ps b/Master/tlpkg/tlgs/lib/viewraw.ps index f1a3f890147..dee86e02300 100644 --- a/Master/tlpkg/tlgs/lib/viewraw.ps +++ b/Master/tlpkg/tlgs/lib/viewraw.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/viewrgb.ps b/Master/tlpkg/tlgs/lib/viewrgb.ps index adde24e4c5d..ab2f6d82c4a 100644 --- a/Master/tlpkg/tlgs/lib/viewrgb.ps +++ b/Master/tlpkg/tlgs/lib/viewrgb.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/winmaps.ps b/Master/tlpkg/tlgs/lib/winmaps.ps index 75933fc2e9d..9a4499ac3ee 100644 --- a/Master/tlpkg/tlgs/lib/winmaps.ps +++ b/Master/tlpkg/tlgs/lib/winmaps.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/zeroline.ps b/Master/tlpkg/tlgs/lib/zeroline.ps index 7ace3ca323b..37f9fda416a 100644 --- a/Master/tlpkg/tlgs/lib/zeroline.ps +++ b/Master/tlpkg/tlgs/lib/zeroline.ps @@ -1,5 +1,5 @@ %! -% Copyright (C) 2001-2020 Artifex Software, Inc. +% Copyright (C) 2001-2021 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or diff --git a/Master/tlpkg/tlgs/lib/zugferd.ps b/Master/tlpkg/tlgs/lib/zugferd.ps new file mode 100644 index 00000000000..0320fb69e8e --- /dev/null +++ b/Master/tlpkg/tlgs/lib/zugferd.ps @@ -0,0 +1,316 @@ +% Copyright (C) 2001-2021 Artifex Software, Inc. +% All Rights Reserved. +% +% This software is provided AS-IS with no warranty, either express or +% implied. +% +% This software is distributed under license and may not be copied, +% modified or distributed except as expressly authorized under the terms +% of the license contained in the file LICENSE in this distribution. +% +% Refer to licensing information at http://www.artifex.com or contact +% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato, +% CA 94945, U.S.A., +1(415)492-9861, for further information. +% +% 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. +% +% 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 +% +% 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. +% + +% istring SimpleUTF16BE ostring +/SimpleUTF16BE +{ + dup length + 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 + 3 1 roll + % ichar ostring index + 2 copy 16#00 put + 1 add + 2 copy + 5 -1 roll + % ostring index ostring index ichar + put + 1 add + % ostring index + } + forall + + % ostring index + pop +} +bind def + +% First check that the user has defined the XML invoice file on the command line +% +/ZUGFeRDXMLFile where { + pop % Discard the dictionary + % + % Now check that the ICC Profile is defined + % + /ZUGFeRDProfile where { + pop % Discard the dictionary + + % Step 1, add the required PDF/A boilerplate. This is mostly copied from lib/pdfa_de.ps + % Create a PDF stream object to hold the ICC profile. + [ /_objdef {icc_PDFA} /type /stream /OBJ pdfmark + + % Add the required entries to the stream dictionary (/N only) + [ {icc_PDFA} + << + %% This code attempts to set the /N (number of components) key for the ICC colour space. + %% To do this it checks the ColorConversionStrategy or the device ProcessColorModel if + %% ColorConversionStrategy is not set. + %% This is not 100% reliable. A better solution is for the user to edit this and replace + %% the code between the ---8<--- lines with a simple declaration like: + %% /N 3 + %% where the value of N is the number of components from the profile defined in ZUGFeRDProfile. + %% + %% ----------8<--------------8<-------------8<--------------8<---------- + systemdict /ColorConversionStrategy known { + systemdict /ColorConversionStrategy get cvn dup /Gray eq { + pop /N 1 false + }{ + dup /RGB eq { + pop /N 3 false + }{ + /CMYK eq { + /N 4 false + }{ + (ColorConversionStrategy not a device space, falling back to ProcessColorModel, output may not be valid PDF/A.)= + true + } ifelse + } ifelse + } ifelse + } { + (ColorConversionStrategy not set, falling back to ProcessColorModel, output may not be valid PDF/A.)= + true + } ifelse + + { + currentpagedevice /ProcessColorModel get + dup /DeviceGray eq { + pop /N 1 + }{ + dup /DeviceRGB eq { + pop /N 3 + }{ + dup /DeviceCMYK eq { + pop /N 4 + } { + (ProcessColorModel not a device space.)= + /ProcessColorModel cvx /rangecheck signalerror + } ifelse + } ifelse + } ifelse + } if + %% ----------8<--------------8<-------------8<--------------8<---------- + >> /PUT pdfmark + + % Now read the ICC profile from the file into the stream + [ {icc_PDFA} ZUGFeRDProfile (r) file /PUT pdfmark + + % Define the output intent dictionary : + [/_objdef {OutputIntent_PDFA} /type /dict /OBJ pdfmark + + % Add the required keys to the dictionary + [{OutputIntent_PDFA} << + /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. + >> /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 + /Params << + /ModDate (D:20130121081433+01’00’) + >> + >> /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 + /Desc (ZUGFeRD electronic invoice) + /AFRelationship /Alternative + /EF << + /F {InvoiceStream} + /UF {InvoiceStream} + >> + >> + /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 + + + % 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 + } + { + % 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 + } 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 +} ifelse + +% That's all the ZUGFeRD and PDF/A-3 setup completed, all that remains now is to run the input file |