diff --git a/src/epsimage.cpp b/src/epsimage.cpp index 1fd55573..2e6ba772 100644 --- a/src/epsimage.cpp +++ b/src/epsimage.cpp @@ -431,6 +431,7 @@ namespace { size_t posEof = posEndEps; std::vector > removableEmbeddings; bool implicitPage = false; + bool implicitPageTrailer = false; bool photoshop = false; bool inDefaultsOrPrologOrSetup = false; bool inPageSetup = false; @@ -465,11 +466,14 @@ namespace { } } if (line.size() >= 1 && line[0] != '%') continue; // performance optimization - if (line == "%%EOF" && posPageTrailer == posEndEps) { - posPageTrailer = startPos; - #ifdef DEBUG - EXV_DEBUG << "readWriteEpsMetadata: Found implicit PageTrailer at position: " << startPos << "\n"; - #endif + if (line == "%%EOF" || line == "%%Trailer") { + if (posPageTrailer == posEndEps) { + posPageTrailer = startPos; + implicitPageTrailer = true; + #ifdef DEBUG + EXV_DEBUG << "readWriteEpsMetadata: Found implicit PageTrailer at position: " << startPos << "\n"; + #endif + } } // explicit comments #ifdef DEBUG @@ -893,11 +897,10 @@ namespace { } } if (pos == posPageTrailer) { - if (pos == posEndEps || pos == posEof) { - writeTemp(*tempIo, "%%PageTrailer" + lineEnding); - } else { + if (!implicitPageTrailer) { skipPos = posLineEnd; } + writeTemp(*tempIo, "%%PageTrailer" + lineEnding); writeTemp(*tempIo, "%Exiv2BeginXMP: After %%PageTrailer" + lineEnding); writeTemp(*tempIo, "[/EMC Exiv2_pdfmark" + lineEnding); writeTemp(*tempIo, "[/NamespacePop Exiv2_pdfmark" + lineEnding); diff --git a/test/data/eps/eps-flat_minimal-trailer.eps b/test/data/eps/eps-flat_minimal-trailer.eps new file mode 100644 index 00000000..8f0cbf96 --- /dev/null +++ b/test/data/eps/eps-flat_minimal-trailer.eps @@ -0,0 +1,7 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 5 5 105 105 +10 setlinewidth +10 10 moveto +0 90 rlineto 90 0 rlineto 0 -90 rlineto closepath +stroke +%%Trailer diff --git a/test/data/eps/eps-flat_minimal-trailer.eps.newxmp b/test/data/eps/eps-flat_minimal-trailer.eps.newxmp new file mode 100644 index 00000000..7cadca31 --- /dev/null +++ b/test/data/eps/eps-flat_minimal-trailer.eps.newxmp @@ -0,0 +1,71 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 5 5 105 105 +%%LanguageLevel: 2 +%ADO_ContainsXMP: MainFirst +%%Pages: 1 +%Exiv2Version: _Exiv2Version_ +%Exiv2Website: http://www.exiv2.org/ +%%EndComments +%%Page: 1 1 +%%EndPageComments +%%BeginPageSetup +%Exiv2BeginXMP: Before %%EndPageSetup +/currentdistillerparams where +{pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse +{userdict /Exiv2_pdfmark /cleartomark load put + userdict /Exiv2_metafile_pdfmark {flushfile cleartomark} bind put} +{userdict /Exiv2_pdfmark /pdfmark load put + userdict /Exiv2_metafile_pdfmark {/PUT pdfmark} bind put} ifelse +[/NamespacePush Exiv2_pdfmark +[/_objdef {Exiv2_metadata_stream} /type /stream /OBJ Exiv2_pdfmark +[{Exiv2_metadata_stream} 2 dict begin + /Type /Metadata def /Subtype /XML def currentdict end /PUT Exiv2_pdfmark +[{Exiv2_metadata_stream} + currentfile 0 (% &&end XMP packet marker&&) + /SubFileDecode filter Exiv2_metafile_pdfmark + + + + + + + + + + + + + + + + + + + + + + + + + + + + +% &&end XMP packet marker&& +[/Document 1 dict begin + /Metadata {Exiv2_metadata_stream} def currentdict end /BDC Exiv2_pdfmark +%Exiv2EndXMP +%%EndPageSetup +10 setlinewidth +10 10 moveto +0 90 rlineto 90 0 rlineto 0 -90 rlineto closepath +stroke +%%PageTrailer +%Exiv2BeginXMP: After %%PageTrailer +[/EMC Exiv2_pdfmark +[/NamespacePop Exiv2_pdfmark +%Exiv2EndXMP +%%Trailer +%%EOF diff --git a/test/data/eps/eps-flat_minimal-trailer.xmp b/test/data/eps/eps-flat_minimal-trailer.xmp new file mode 100644 index 00000000..12bbf745 --- /dev/null +++ b/test/data/eps/eps-flat_minimal-trailer.xmp @@ -0,0 +1 @@ + diff --git a/test/data/eps/eps-flat_oodraw-lev1.eps.newxmp b/test/data/eps/eps-flat_oodraw-lev1.eps.newxmp index 98b6df3b..62ca1e48 100644 --- a/test/data/eps/eps-flat_oodraw-lev1.eps.newxmp +++ b/test/data/eps/eps-flat_oodraw-lev1.eps.newxmp @@ -123,6 +123,7 @@ gr 0 27700 t pom count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore +%%PageTrailer %Exiv2BeginXMP: After %%PageTrailer [/EMC Exiv2_pdfmark [/NamespacePop Exiv2_pdfmark diff --git a/test/data/eps/eps-flat_oodraw-lev2.eps.newxmp b/test/data/eps/eps-flat_oodraw-lev2.eps.newxmp index aab5f138..82474e82 100644 --- a/test/data/eps/eps-flat_oodraw-lev2.eps.newxmp +++ b/test/data/eps/eps-flat_oodraw-lev2.eps.newxmp @@ -124,6 +124,7 @@ gr 0 27700 t pom count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore +%%PageTrailer %Exiv2BeginXMP: After %%PageTrailer [/EMC Exiv2_pdfmark [/NamespacePop Exiv2_pdfmark diff --git a/test/data/eps/eps-flat_oodraw-lev2_eps2eps.eps.newxmp b/test/data/eps/eps-flat_oodraw-lev2_eps2eps.eps.newxmp index 15072bd5..31a61065 100644 --- a/test/data/eps/eps-flat_oodraw-lev2_eps2eps.eps.newxmp +++ b/test/data/eps/eps-flat_oodraw-lev2_eps2eps.eps.newxmp @@ -127,6 +127,7 @@ S Q cleartomark end end pagesave restore showpage +%%PageTrailer %Exiv2BeginXMP: After %%PageTrailer [/EMC Exiv2_pdfmark [/NamespacePop Exiv2_pdfmark diff --git a/test/data/eps/eps-flat_oodraw_ai-3-lev2.eps.newxmp b/test/data/eps/eps-flat_oodraw_ai-3-lev2.eps.newxmp index cfbc0b51..2c9d30dc 100644 --- a/test/data/eps/eps-flat_oodraw_ai-3-lev2.eps.newxmp +++ b/test/data/eps/eps-flat_oodraw_ai-3-lev2.eps.newxmp @@ -800,7 +800,7 @@ Adobe_IllustratorA_AI3 /initialize get exec - % &&end XMP packet marker&& [/Document 1 dict begin /Metadata {Exiv2_metadata_stream} def currentdict end /BDC Exiv2_pdfmark %Exiv2EndXMP %%EndPageSetup 0 A u 0 O 0.5 g 0 J 0 j 1 w 10 M []0 d 305.3501 311.0195 m 199 311.0195 l 199 481 l 411.6992 481 l 411.6992 311.0195 l 305.3501 311.0195 l 305.3501 311.0195 l f 0 R 0 G 1 j 0 w 305.3501 311.0195 m 199 311.0195 l 199 481 l 411.6992 481 l 411.6992 311.0195 l 305.3501 311.0195 l 305.3501 311.0195 l s U %Exiv2BeginXMP: After %%PageTrailer [/EMC Exiv2_pdfmark [/NamespacePop Exiv2_pdfmark %Exiv2EndXMP gsave annotatepage grestore showpage %%Trailer Adobe_IllustratorA_AI3 /terminate get exec + % &&end XMP packet marker&& [/Document 1 dict begin /Metadata {Exiv2_metadata_stream} def currentdict end /BDC Exiv2_pdfmark %Exiv2EndXMP %%EndPageSetup 0 A u 0 O 0.5 g 0 J 0 j 1 w 10 M []0 d 305.3501 311.0195 m 199 311.0195 l 199 481 l 411.6992 481 l 411.6992 311.0195 l 305.3501 311.0195 l 305.3501 311.0195 l f 0 R 0 G 1 j 0 w 305.3501 311.0195 m 199 311.0195 l 199 481 l 411.6992 481 l 411.6992 311.0195 l 305.3501 311.0195 l 305.3501 311.0195 l s U %%PageTrailer %Exiv2BeginXMP: After %%PageTrailer [/EMC Exiv2_pdfmark [/NamespacePop Exiv2_pdfmark %Exiv2EndXMP gsave annotatepage grestore showpage %%Trailer Adobe_IllustratorA_AI3 /terminate get exec Adobe_customcolor /terminate get exec Adobe_cshow /terminate get exec Adobe_packedarray /terminate get exec diff --git a/test/data/eps/eps-flat_oodraw_ai-3-lev3.eps.newxmp b/test/data/eps/eps-flat_oodraw_ai-3-lev3.eps.newxmp index 4cd2b0b2..4491f840 100644 --- a/test/data/eps/eps-flat_oodraw_ai-3-lev3.eps.newxmp +++ b/test/data/eps/eps-flat_oodraw_ai-3-lev3.eps.newxmp @@ -800,7 +800,7 @@ Adobe_IllustratorA_AI3 /initialize get exec - % &&end XMP packet marker&& [/Document 1 dict begin /Metadata {Exiv2_metadata_stream} def currentdict end /BDC Exiv2_pdfmark %Exiv2EndXMP %%EndPageSetup 0 A u 0 O 0.5 g 0 J 0 j 1 w 10 M []0 d 305.3501 311.0195 m 199 311.0195 l 199 481 l 411.6992 481 l 411.6992 311.0195 l 305.3501 311.0195 l 305.3501 311.0195 l f 0 R 0 G 1 j 0 w 305.3501 311.0195 m 199 311.0195 l 199 481 l 411.6992 481 l 411.6992 311.0195 l 305.3501 311.0195 l 305.3501 311.0195 l s U %Exiv2BeginXMP: After %%PageTrailer [/EMC Exiv2_pdfmark [/NamespacePop Exiv2_pdfmark %Exiv2EndXMP gsave annotatepage grestore showpage %%Trailer Adobe_IllustratorA_AI3 /terminate get exec + % &&end XMP packet marker&& [/Document 1 dict begin /Metadata {Exiv2_metadata_stream} def currentdict end /BDC Exiv2_pdfmark %Exiv2EndXMP %%EndPageSetup 0 A u 0 O 0.5 g 0 J 0 j 1 w 10 M []0 d 305.3501 311.0195 m 199 311.0195 l 199 481 l 411.6992 481 l 411.6992 311.0195 l 305.3501 311.0195 l 305.3501 311.0195 l f 0 R 0 G 1 j 0 w 305.3501 311.0195 m 199 311.0195 l 199 481 l 411.6992 481 l 411.6992 311.0195 l 305.3501 311.0195 l 305.3501 311.0195 l s U %%PageTrailer %Exiv2BeginXMP: After %%PageTrailer [/EMC Exiv2_pdfmark [/NamespacePop Exiv2_pdfmark %Exiv2EndXMP gsave annotatepage grestore showpage %%Trailer Adobe_IllustratorA_AI3 /terminate get exec Adobe_customcolor /terminate get exec Adobe_cshow /terminate get exec Adobe_packedarray /terminate get exec diff --git a/test/data/eps/eps-flat_oodraw_ai-8-lev3.eps.newxmp b/test/data/eps/eps-flat_oodraw_ai-8-lev3.eps.newxmp index 84b849b3..e3f2e58c 100644 --- a/test/data/eps/eps-flat_oodraw_ai-8-lev3.eps.newxmp +++ b/test/data/eps/eps-flat_oodraw_ai-8-lev3.eps.newxmp @@ -2748,7 +2748,7 @@ Adobe_Illustrator_AI5 /initialize get exec - % &&end XMP packet marker&& [/Document 1 dict begin /Metadata {Exiv2_metadata_stream} def currentdict end /BDC Exiv2_pdfmark %Exiv2EndXMP %%EndPageSetup 1 1 1 1 0 0 1 0 79 128 255 0 50 Lb (Layer 1) Ln 0 A u 0 O 0.5 g 0 J 0 j 1 w 10 M []0 d 1 XR 305.3501 311.0195 m 199 311.0195 l 199 481 l 411.6992 481 l 411.6992 311.0195 l 305.3501 311.0195 l 305.3501 311.0195 l f 0 R 0 G 1 j 0 w 0 XR 305.3501 311.0195 m 199 311.0195 l 199 481 l 411.6992 481 l 411.6992 311.0195 l 305.3501 311.0195 l 305.3501 311.0195 l s U /BBAccumRotation (0.000000) XT LB %AI5_EndLayer-- %Exiv2BeginXMP: After %%PageTrailer [/EMC Exiv2_pdfmark [/NamespacePop Exiv2_pdfmark %Exiv2EndXMP gsave annotatepage grestore showpage %%Trailer Adobe_Illustrator_AI5 /terminate get exec + % &&end XMP packet marker&& [/Document 1 dict begin /Metadata {Exiv2_metadata_stream} def currentdict end /BDC Exiv2_pdfmark %Exiv2EndXMP %%EndPageSetup 1 1 1 1 0 0 1 0 79 128 255 0 50 Lb (Layer 1) Ln 0 A u 0 O 0.5 g 0 J 0 j 1 w 10 M []0 d 1 XR 305.3501 311.0195 m 199 311.0195 l 199 481 l 411.6992 481 l 411.6992 311.0195 l 305.3501 311.0195 l 305.3501 311.0195 l f 0 R 0 G 1 j 0 w 0 XR 305.3501 311.0195 m 199 311.0195 l 199 481 l 411.6992 481 l 411.6992 311.0195 l 305.3501 311.0195 l 305.3501 311.0195 l s U /BBAccumRotation (0.000000) XT LB %AI5_EndLayer-- %%PageTrailer %Exiv2BeginXMP: After %%PageTrailer [/EMC Exiv2_pdfmark [/NamespacePop Exiv2_pdfmark %Exiv2EndXMP gsave annotatepage grestore showpage %%Trailer Adobe_Illustrator_AI5 /terminate get exec Adobe_shading_AI8 /terminate get exec Adobe_ColorImage_AI6 /terminate get exec Adobe_cshow /terminate get exec diff --git a/test/data/eps/eps-test.out b/test/data/eps/eps-test.out index f937c94f..3415d2aa 100644 --- a/test/data/eps/eps-test.out +++ b/test/data/eps/eps-test.out @@ -151,6 +151,23 @@ Exit code: 0 Command: exiv2 -f -ex eps-flat_minimal-noeol.eps Exit code: 0 +-----> eps-flat_minimal-trailer.eps <----- + +Command: exiv2 -u -pa eps-flat_minimal-trailer.eps +Exit code: 253 + +Command: exiv2 -f -eX eps-flat_minimal-trailer.eps +Exit code: 0 + +Command: exiv2 -ix eps-flat_minimal-trailer.eps +Exit code: 0 + +Command: (2) exiv2 -ix eps-flat_minimal-trailer.eps +Exit code: 0 + +Command: exiv2 -f -ex eps-flat_minimal-trailer.eps +Exit code: 0 + -----> eps-flat_minimal.eps <----- Command: exiv2 -u -pa eps-flat_minimal.eps