diff --git a/src/epsimage.cpp b/src/epsimage.cpp index b8d5caee..239220ba 100644 --- a/src/epsimage.cpp +++ b/src/epsimage.cpp @@ -451,7 +451,7 @@ namespace { #endif } } - if (line == "%%EOF" || (line.size() >= 1 && line[0] != '%')) { + if (line == "%%EOF" || startsWith(line, "%%IncludeDocument:") || startsWith(line, "%%BeginDocument:") || (line.size() >= 1 && line[0] != '%')) { if (posPage == posEndEps && posEndComments != posEndEps && !inDefaultsOrPrologOrSetup && !inRemovableEmbedding && !onlyWhitespaces(line)) { posPage = startPos; implicitPage = true; @@ -542,12 +542,6 @@ namespace { } else if (line == "%%EOF") { posEof = startPos; } else if (startsWith(line, "%%BeginDocument:")) { - if (posEndPageSetup == posEndEps) { - #ifndef SUPPRESS_WARNINGS - EXV_WARNING << "Nested document at invalid position (before explicit or implicit EndPageSetup): " << startPos << "\n"; - #endif - throw Error(write ? 21 : 14); - } // TODO: Add support for nested documents! #ifndef SUPPRESS_WARNINGS EXV_WARNING << "Nested documents are currently not supported. Found nested document at position: " << startPos << "\n"; @@ -564,12 +558,6 @@ namespace { EXV_WARNING << "Unable to handle multiple PostScript pages. Found second page at position: " << startPos << "\n"; #endif throw Error(write ? 21 : 14); - } else if (startsWith(line, "%%Include")) { - #ifndef SUPPRESS_WARNINGS - EXV_WARNING << "Unable to handle PostScript %%Include DSC comments yet. Please provide your " - "sample EPS file to the Exiv2 project: http://dev.exiv2.org/projects/exiv2\n"; - #endif - throw Error(write ? 21 : 14); } else { #ifdef DEBUG significantLine = false; diff --git a/test/data/eps/eps-flat_minimal_includeresource.eps b/test/data/eps/eps-flat_minimal_includeresource.eps new file mode 100644 index 00000000..17bd31ab --- /dev/null +++ b/test/data/eps/eps-flat_minimal_includeresource.eps @@ -0,0 +1,9 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 5 5 105 105 +%%DocumentNeededResources: font Symbol + +%%IncludeResource: font Symbol +10 setlinewidth +10 10 moveto +0 90 rlineto 90 0 rlineto 0 -90 rlineto closepath +stroke diff --git a/test/data/eps/eps-flat_minimal_includeresource.eps.delxmp b/test/data/eps/eps-flat_minimal_includeresource.eps.delxmp new file mode 100644 index 00000000..e0d2705f --- /dev/null +++ b/test/data/eps/eps-flat_minimal_includeresource.eps.delxmp @@ -0,0 +1,17 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 5 5 105 105 +%%DocumentNeededResources: font Symbol +%ADO_ContainsXMP: NoMain +%%Pages: 1 +%Exiv2Version: _Exiv2Version_ +%Exiv2Website: http://www.exiv2.org/ +%%EndComments + +%%IncludeResource: font Symbol +%%Page: 1 1 +%%EndPageComments +10 setlinewidth +10 10 moveto +0 90 rlineto 90 0 rlineto 0 -90 rlineto closepath +stroke +%%EOF diff --git a/test/data/eps/eps-flat_minimal_includeresource.eps.newxmp b/test/data/eps/eps-flat_minimal_includeresource.eps.newxmp new file mode 100644 index 00000000..09dce4c0 --- /dev/null +++ b/test/data/eps/eps-flat_minimal_includeresource.eps.newxmp @@ -0,0 +1,73 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 5 5 105 105 +%%DocumentNeededResources: font Symbol +%%LanguageLevel: 2 +%ADO_ContainsXMP: MainFirst +%%Pages: 1 +%Exiv2Version: _Exiv2Version_ +%Exiv2Website: http://www.exiv2.org/ +%%EndComments + +%%IncludeResource: font Symbol +%%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 +%%EOF diff --git a/test/data/eps/eps-flat_minimal_includeresource.xmp b/test/data/eps/eps-flat_minimal_includeresource.xmp new file mode 100644 index 00000000..12bbf745 --- /dev/null +++ b/test/data/eps/eps-flat_minimal_includeresource.xmp @@ -0,0 +1 @@ + diff --git a/test/data/eps/eps-nested_minimal_begindocument-at-page-start.eps b/test/data/eps/eps-nested_minimal_begindocument-at-page-start.eps new file mode 100644 index 00000000..57462d68 --- /dev/null +++ b/test/data/eps/eps-nested_minimal_begindocument-at-page-start.eps @@ -0,0 +1,14 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 5 5 105 105 +%%BeginDocument: dummy_document.eps +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 25 25 85 85 +20 setlinewidth +35 35 moveto +0 40 rlineto 40 0 rlineto 0 -40 rlineto closepath +stroke +%%EndDocument +10 setlinewidth +10 10 moveto +0 90 rlineto 90 0 rlineto 0 -90 rlineto closepath +stroke diff --git a/test/data/eps/eps-nested_minimal_begindocument.eps b/test/data/eps/eps-nested_minimal_begindocument.eps new file mode 100644 index 00000000..f65e4e7a --- /dev/null +++ b/test/data/eps/eps-nested_minimal_begindocument.eps @@ -0,0 +1,16 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 5 5 105 105 +save +%%BeginDocument: dummy_document.eps +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 25 25 85 85 +20 setlinewidth +35 35 moveto +0 40 rlineto 40 0 rlineto 0 -40 rlineto closepath +stroke +%%EndDocument +restore +10 setlinewidth +10 10 moveto +0 90 rlineto 90 0 rlineto 0 -90 rlineto closepath +stroke diff --git a/test/data/eps/eps-nested_minimal_includedocument-at-page-start.eps b/test/data/eps/eps-nested_minimal_includedocument-at-page-start.eps new file mode 100644 index 00000000..10f14c24 --- /dev/null +++ b/test/data/eps/eps-nested_minimal_includedocument-at-page-start.eps @@ -0,0 +1,9 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 5 5 105 105 +%%DocumentNeededResources: dummy_document.eps +%%EndComments +%%IncludeDocument: dummy_document.eps +10 setlinewidth +10 10 moveto +0 90 rlineto 90 0 rlineto 0 -90 rlineto closepath +stroke diff --git a/test/data/eps/eps-nested_minimal_includedocument-at-page-start.eps.delxmp b/test/data/eps/eps-nested_minimal_includedocument-at-page-start.eps.delxmp new file mode 100644 index 00000000..bb0e14fd --- /dev/null +++ b/test/data/eps/eps-nested_minimal_includedocument-at-page-start.eps.delxmp @@ -0,0 +1,16 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 5 5 105 105 +%%DocumentNeededResources: dummy_document.eps +%ADO_ContainsXMP: NoMain +%%Pages: 1 +%Exiv2Version: _Exiv2Version_ +%Exiv2Website: http://www.exiv2.org/ +%%EndComments +%%Page: 1 1 +%%EndPageComments +%%IncludeDocument: dummy_document.eps +10 setlinewidth +10 10 moveto +0 90 rlineto 90 0 rlineto 0 -90 rlineto closepath +stroke +%%EOF diff --git a/test/data/eps/eps-nested_minimal_includedocument-at-page-start.eps.newxmp b/test/data/eps/eps-nested_minimal_includedocument-at-page-start.eps.newxmp new file mode 100644 index 00000000..4b941819 --- /dev/null +++ b/test/data/eps/eps-nested_minimal_includedocument-at-page-start.eps.newxmp @@ -0,0 +1,72 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 5 5 105 105 +%%DocumentNeededResources: dummy_document.eps +%%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 +%%IncludeDocument: dummy_document.eps +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 +%%EOF diff --git a/test/data/eps/eps-nested_minimal_includedocument-at-page-start.xmp b/test/data/eps/eps-nested_minimal_includedocument-at-page-start.xmp new file mode 100644 index 00000000..12bbf745 --- /dev/null +++ b/test/data/eps/eps-nested_minimal_includedocument-at-page-start.xmp @@ -0,0 +1 @@ + diff --git a/test/data/eps/eps-nested_minimal_includedocument.eps.delxmp b/test/data/eps/eps-nested_minimal_includedocument.eps.delxmp new file mode 100644 index 00000000..9c1d4f77 --- /dev/null +++ b/test/data/eps/eps-nested_minimal_includedocument.eps.delxmp @@ -0,0 +1,18 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 5 5 105 105 +%%DocumentNeededResources: dummy_document.eps +%ADO_ContainsXMP: NoMain +%%Pages: 1 +%Exiv2Version: _Exiv2Version_ +%Exiv2Website: http://www.exiv2.org/ +%%EndComments +%%Page: 1 1 +%%EndPageComments +save +%%IncludeDocument: dummy_document.eps +restore +10 setlinewidth +10 10 moveto +0 90 rlineto 90 0 rlineto 0 -90 rlineto closepath +stroke +%%EOF diff --git a/test/data/eps/eps-nested_minimal_includedocument.eps.newxmp b/test/data/eps/eps-nested_minimal_includedocument.eps.newxmp new file mode 100644 index 00000000..fe316581 --- /dev/null +++ b/test/data/eps/eps-nested_minimal_includedocument.eps.newxmp @@ -0,0 +1,74 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 5 5 105 105 +%%DocumentNeededResources: dummy_document.eps +%%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 +save +%%IncludeDocument: dummy_document.eps +restore +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 +%%EOF diff --git a/test/data/eps/eps-nested_minimal_includedocument.xmp b/test/data/eps/eps-nested_minimal_includedocument.xmp new file mode 100644 index 00000000..12bbf745 --- /dev/null +++ b/test/data/eps/eps-nested_minimal_includedocument.xmp @@ -0,0 +1 @@ + diff --git a/test/data/eps/eps-test.out b/test/data/eps/eps-test.out index da302962..84a26908 100644 --- a/test/data/eps/eps-test.out +++ b/test/data/eps/eps-test.out @@ -291,6 +291,31 @@ Exit code: 0 Command: exiv2 -f -ex eps-flat_minimal_exiftool-8.56.eps Exit code: 0 +-----> eps-flat_minimal_includeresource.eps <----- + +Command: exiv2 -u -pa eps-flat_minimal_includeresource.eps +Exit code: 253 + +Command: exiv2 -dx eps-flat_minimal_includeresource.eps +Exit code: 0 + +Command: exiv2 -f -ex eps-flat_minimal_includeresource.eps +Exit code: 0 + +Restore: eps-flat_minimal_includeresource.eps + +Command: exiv2 -f -eX eps-flat_minimal_includeresource.eps +Exit code: 0 + +Command: exiv2 -ix eps-flat_minimal_includeresource.eps +Exit code: 0 + +Command: (2) exiv2 -ix eps-flat_minimal_includeresource.eps +Exit code: 0 + +Command: exiv2 -f -ex eps-flat_minimal_includeresource.eps +Exit code: 0 + -----> eps-flat_minimal_irremovable-xmp-after-endpagesetup.eps <----- Command: exiv2 -u -pa eps-flat_minimal_irremovable-xmp-after-endpagesetup.eps @@ -3523,13 +3548,71 @@ Exit code: 0 Command: exiv2 -f -ex eps-flat_photoshop-e9-win_exiv2.eps Exit code: 0 +-----> eps-nested_minimal_begindocument-at-page-start.eps <----- + +Command: exiv2 -u -pa eps-nested_minimal_begindocument-at-page-start.eps +Warning: Nested document at invalid position (before explicit or implicit EndPageSetup): 51 +Exiv2 exception in print action for file eps-nested_minimal_begindocument-at-page-start.eps: +Failed to read image data +Exit code: 1 + +-----> eps-nested_minimal_begindocument.eps <----- + +Command: exiv2 -u -pa eps-nested_minimal_begindocument.eps +Warning: Nested documents are currently not supported. Found nested document at position: 56 +Exiv2 exception in print action for file eps-nested_minimal_begindocument.eps: +Failed to read image data +Exit code: 1 + +-----> eps-nested_minimal_includedocument-at-page-start.eps <----- + +Command: exiv2 -u -pa eps-nested_minimal_includedocument-at-page-start.eps +Exit code: 253 + +Command: exiv2 -dx eps-nested_minimal_includedocument-at-page-start.eps +Exit code: 0 + +Command: exiv2 -f -ex eps-nested_minimal_includedocument-at-page-start.eps +Exit code: 0 + +Restore: eps-nested_minimal_includedocument-at-page-start.eps + +Command: exiv2 -f -eX eps-nested_minimal_includedocument-at-page-start.eps +Exit code: 0 + +Command: exiv2 -ix eps-nested_minimal_includedocument-at-page-start.eps +Exit code: 0 + +Command: (2) exiv2 -ix eps-nested_minimal_includedocument-at-page-start.eps +Exit code: 0 + +Command: exiv2 -f -ex eps-nested_minimal_includedocument-at-page-start.eps +Exit code: 0 + -----> eps-nested_minimal_includedocument.eps <----- Command: exiv2 -u -pa eps-nested_minimal_includedocument.eps -Warning: Unable to handle PostScript %%Include DSC comments yet. Please provide your sample EPS file to the Exiv2 project: http://dev.exiv2.org/projects/exiv2 -Exiv2 exception in print action for file eps-nested_minimal_includedocument.eps: -Failed to read image data -Exit code: 1 +Exit code: 253 + +Command: exiv2 -dx eps-nested_minimal_includedocument.eps +Exit code: 0 + +Command: exiv2 -f -ex eps-nested_minimal_includedocument.eps +Exit code: 0 + +Restore: eps-nested_minimal_includedocument.eps + +Command: exiv2 -f -eX eps-nested_minimal_includedocument.eps +Exit code: 0 + +Command: exiv2 -ix eps-nested_minimal_includedocument.eps +Exit code: 0 + +Command: (2) exiv2 -ix eps-nested_minimal_includedocument.eps +Exit code: 0 + +Command: exiv2 -f -ex eps-nested_minimal_includedocument.eps +Exit code: 0 -----> eps-nested_noxmp_ai-3-lev2.eps <-----