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 <-----