diff --git a/.gitignore b/.gitignore index 2c8ae2af..f615f659 100644 --- a/.gitignore +++ b/.gitignore @@ -105,6 +105,7 @@ $tf/ _ReSharper*/ *.[Rr]e[Ss]harper *.DotSettings.user +.idea # JustCode is a .NET coding add-in .JustCode diff --git a/src/UglyToad.PdfPig.Tests/Integration/Documents/_citUR2jB1_ay56u6vELzk.pdf b/src/UglyToad.PdfPig.Tests/Integration/Documents/_citUR2jB1_ay56u6vELzk.pdf new file mode 100644 index 00000000..bbb4a61d Binary files /dev/null and b/src/UglyToad.PdfPig.Tests/Integration/Documents/_citUR2jB1_ay56u6vELzk.pdf differ diff --git a/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs b/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs index 62d2bc67..286c6040 100644 --- a/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs +++ b/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs @@ -780,6 +780,24 @@ } } + [Fact] + public void CanCopyIssue1017() + { + using (var document = PdfDocument.Open(IntegrationHelpers.GetDocumentPath("_citUR2jB1_ay56u6vELzk.pdf"))) + { + using (var pdfWriter = new PdfDocumentBuilder()) + { + var page = document.GetPage(1); + + var newPage = pdfWriter.AddPage(page.Width, page.Height); + newPage.CopyFrom(page); + + var b = pdfWriter.Build(); + Assert.NotEmpty(b); + } + } + } + [Fact] public void CanCopyPage() { diff --git a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs index fa99a38b..b6e17e47 100644 --- a/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs +++ b/src/UglyToad.PdfPig/Writer/PdfPageBuilder.cs @@ -974,13 +974,16 @@ gstateName = newName; } - - if (!(gstate.Value is IndirectReferenceToken fontReferenceToken)) + + // According to PDF spec 32000-1:2008, section 8.4.5, ExtGState can contain both direct values and indirect references + if (gstate.Value is IndirectReferenceToken fontReferenceToken) { - throw new PdfDocumentFormatException($"Expected a IndirectReferenceToken for the XObject, got a {gstate.Value.GetType().Name}"); + pageGstateDictionary[gstateName] = documentBuilder.CopyToken(srcPage.pdfScanner, fontReferenceToken); + } + else + { + pageGstateDictionary[gstateName] = documentBuilder.CopyToken(srcPage.pdfScanner, gstate.Value); } - - pageGstateDictionary[gstateName] = documentBuilder.CopyToken(srcPage.pdfScanner, fontReferenceToken); } }