/* * * This file is part of the iText (R) project. Copyright (c) 1998-2017 iText Group NV * Authors: Bruno Lowagie, Paulo Soares, Kevin Day, et al. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License version 3 * as published by the Free Software Foundation with the addition of the * following permission added to Section 15 as permitted in Section 7(a): * FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY * ITEXT GROUP. ITEXT GROUP DISCLAIMS THE WARRANTY OF NON INFRINGEMENT * OF THIRD PARTY RIGHTS * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Affero General Public License for more details. * You should have received a copy of the GNU Affero General Public License * along with this program; if not, see http://www.gnu.org/licenses or write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA, 02110-1301 USA, or download the license from the following URL: * http://itextpdf.com/terms-of-use/ * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License. * * In accordance with Section 7(b) of the GNU Affero General Public License, * a covered work must retain the producer line in every PDF that is created * or manipulated using iText. * * You can be released from the requirements of the license by purchasing * a commercial license. Buying such a license is mandatory as soon as you * develop commercial activities involving the iText software without * disclosing the source code of your own applications. * These activities include: offering paid services to customers as an ASP, * serving PDFs on the fly in a web application, shipping iText with a closed * source product. * * For more information, please contact iText Software Corp. at this * address: sales@itextpdf.com */ package com.itextpdf.text.pdf; import com.itextpdf.testutils.CompareTool; import com.itextpdf.testutils.TestResourceUtils; import com.itextpdf.text.Chunk; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.PageSize; import com.itextpdf.text.Paragraph; import com.itextpdf.text.Phrase; import com.itextpdf.text.Rectangle; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.junit.After; import org.junit.Before; import org.junit.Test; import junit.framework.Assert; /** * @author kevin */ public class PdfCopyTest { @Before public void setUp() throws Exception { TestResourceUtils.purgeTempFiles(); } @After public void tearDown() throws Exception { TestResourceUtils.purgeTempFiles(); } @Test /** * Test to demonstrate issue https://sourceforge.net/tracker/?func=detail&aid=3013642&group_id=15255&atid=115255 */ public void testExtraXObjects() throws Exception { PdfReader sourceR = new PdfReader(createImagePdf()); try { int sourceXRefCount = sourceR.getXrefSize(); final Document document = new Document(); ByteArrayOutputStream out = new ByteArrayOutputStream(); PdfCopy copy = new PdfCopy(document, out); document.open(); PdfImportedPage importedPage = copy.getImportedPage(sourceR, 1); copy.addPage(importedPage); document.close(); PdfReader targetR = new PdfReader(out.toByteArray()); int destinationXRefCount = targetR.getXrefSize(); // TestResourceUtils.saveBytesToFile(createImagePdf(), new File("./source.pdf")); // TestResourceUtils.saveBytesToFile(out.toByteArray(), new File("./result.pdf")); Assert.assertEquals(sourceXRefCount, destinationXRefCount); } finally { sourceR.close(); } } @Test /** * Test to make sure that the following issue is fixed: http://sourceforge.net/mailarchive/message.php?msg_id=30891213 */ public void testDecodeParmsArrayWithNullItems() throws IOException, DocumentException { Document document = new Document(); ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); PdfSmartCopy pdfSmartCopy = new PdfSmartCopy(document, byteStream); document.open(); PdfReader reader = TestResourceUtils.getResourceAsPdfReader(this, "imgWithDecodeParms.pdf"); pdfSmartCopy.addPage(pdfSmartCopy.getImportedPage(reader, 1)); document.close(); reader.close(); reader = new PdfReader(byteStream.toByteArray()); PdfDictionary page = reader.getPageN(1); PdfDictionary resources = page.getAsDict(PdfName.RESOURCES); PdfDictionary xObject = resources.getAsDict(PdfName.XOBJECT); PdfStream img = xObject.getAsStream(new PdfName("Im0")); PdfArray decodeParms = img.getAsArray(PdfName.DECODEPARMS); Assert.assertEquals(2, decodeParms.size()); Assert.assertTrue(decodeParms.getPdfObject(0) instanceof PdfNull); reader.close(); } @Test public void testNeedAppearances() throws DocumentException, IOException, InterruptedException { String f1 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances1.pdf"; String f2 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances2.pdf"; String f3 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances3.pdf"; String f4 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances4.pdf"; new File("./target/com/itextpdf/test/pdf/PdfCopyTest/").mkdirs(); FileOutputStream outputPdfStream = new FileOutputStream("./target/com/itextpdf/test/pdf/PdfCopyTest/appearances.pdf"); Document document = new Document(); PdfCopy copy = new PdfCopy(document, outputPdfStream); copy.setMergeFields(); document.open(); for (String f : new String[]{f1, f2, f3, f4}) { PdfReader r = new PdfReader(f); copy.addDocument(r); } copy.close(); CompareTool compareTool = new CompareTool(); String errorMessage = compareTool.compareByContent("./target/com/itextpdf/test/pdf/PdfCopyTest/appearances.pdf", "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/cmp_appearances.pdf", "./target/com/itextpdf/test/pdf/PdfCopyTest/", "diff"); if (errorMessage != null) { Assert.fail(errorMessage); } } @Test public void testNeedAppearancesFalse() throws DocumentException, IOException, InterruptedException { String f1 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances1(needAppearancesFalse).pdf"; String f2 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances2(needAppearancesFalse).pdf"; String f3 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances3(needAppearancesFalse).pdf"; String f4 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances4(needAppearancesFalse).pdf"; new File("./target/com/itextpdf/test/pdf/PdfCopyTest/").mkdirs(); FileOutputStream outputPdfStream = new FileOutputStream("./target/com/itextpdf/test/pdf/PdfCopyTest/appearances(needAppearancesFalse).pdf"); Document document = new Document(); PdfCopy copy = new PdfCopy(document, outputPdfStream); copy.setMergeFields(); document.open(); for (String f : new String[]{f1, f2, f3, f4}) { PdfReader r = new PdfReader(f); copy.addDocument(r); } copy.close(); CompareTool compareTool = new CompareTool(); String errorMessage = compareTool.compareByContent("./target/com/itextpdf/test/pdf/PdfCopyTest/appearances(needAppearancesFalse).pdf", "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/cmp_appearances(needAppearancesFalse).pdf", "./target/com/itextpdf/test/pdf/PdfCopyTest/", "diff"); if (errorMessage != null) { Assert.fail(errorMessage); } } @Test public void testNeedAppearancesFalseWithStreams() throws DocumentException, IOException, InterruptedException { String f1 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances1(needAppearancesFalseWithStreams).pdf"; String f2 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances2(needAppearancesFalseWithStreams).pdf"; String f3 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances3(needAppearancesFalseWithStreams).pdf"; String f4 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances4(needAppearancesFalseWithStreams).pdf"; new File("./target/com/itextpdf/test/pdf/PdfCopyTest/").mkdirs(); FileOutputStream outputPdfStream = new FileOutputStream("./target/com/itextpdf/test/pdf/PdfCopyTest/appearances(needAppearancesFalseWithStreams).pdf"); Document document = new Document(); PdfCopy copy = new PdfCopy(document, outputPdfStream); copy.setMergeFields(); document.open(); for (String f : new String[]{f1, f2, f3, f4}) { PdfReader r = new PdfReader(f); copy.addDocument(r); } copy.close(); CompareTool compareTool = new CompareTool(); String errorMessage = compareTool.compareByContent("./target/com/itextpdf/test/pdf/PdfCopyTest/appearances(needAppearancesFalseWithStreams).pdf", "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/cmp_appearances(needAppearancesFalseWithStreams).pdf", "./target/com/itextpdf/test/pdf/PdfCopyTest/", "diff"); if (errorMessage != null) { Assert.fail(errorMessage); } } @Test public void testNeedAppearancesMixed() throws DocumentException, IOException, InterruptedException { String f1 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances1.pdf"; String f2 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances2(needAppearancesFalse).pdf"; String f3 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances3(needAppearancesFalseWithStreams).pdf"; String f4 = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances4.pdf"; new File("./target/com/itextpdf/test/pdf/PdfCopyTest/").mkdirs(); FileOutputStream outputPdfStream = new FileOutputStream("./target/com/itextpdf/test/pdf/PdfCopyTest/appearances(mixed).pdf"); Document document = new Document(); PdfCopy copy = new PdfCopy(document, outputPdfStream); copy.setMergeFields(); document.open(); for (String f : new String[]{f1, f2, f3, f4}) { PdfReader r = new PdfReader(f); copy.addDocument(r); } copy.close(); CompareTool compareTool = new CompareTool(); String errorMessage = compareTool.compareByContent("./target/com/itextpdf/test/pdf/PdfCopyTest/appearances(mixed).pdf", "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/cmp_appearances(mixed).pdf", "./target/com/itextpdf/test/pdf/PdfCopyTest/", "diff"); if (errorMessage != null) { Assert.fail(errorMessage); } } @Test public void testFullCompression1() throws DocumentException, IOException { String outfile = "./target/com/itextpdf/test/pdf/PdfCopyTest/out-noforms.pdf"; String first = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/hello.pdf"; String second = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/hello_memory.pdf"; new File("./target/com/itextpdf/test/pdf/PdfCopyTest/").mkdirs(); OutputStream out = new FileOutputStream(outfile); PdfReader reader = new PdfReader(first); PdfReader reader2 = new PdfReader(second); Document pdfDocument = new Document(); PdfCopy pdfCopy = new PdfCopy(pdfDocument, out); pdfCopy.setMergeFields(); pdfCopy.setFullCompression(); pdfCopy.setCompressionLevel(PdfStream.BEST_COMPRESSION); pdfDocument.open(); pdfCopy.addDocument(reader); pdfCopy.addDocument(reader2); pdfCopy.close(); reader.close(); reader2.close(); out.close(); reader = new PdfReader("./target/com/itextpdf/test/pdf/PdfCopyTest/out-noforms.pdf"); Assert.assertNotNull(reader.getPageN(1)); reader.close(); } @Test public void testFullCompression2() throws DocumentException, IOException { String outfile = "./target/com/itextpdf/test/pdf/PdfCopyTest/out-forms.pdf"; String first = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/subscribe.pdf"; String second = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/filled_form_1.pdf"; new File("./target/com/itextpdf/test/pdf/PdfCopyTest/").mkdirs(); OutputStream out = new FileOutputStream(outfile); PdfReader reader = new PdfReader(first); PdfReader reader2 = new PdfReader(second); Document pdfDocument = new Document(); PdfCopy pdfCopy = new PdfCopy(pdfDocument, out); pdfCopy.setMergeFields(); pdfCopy.setFullCompression(); pdfCopy.setCompressionLevel(PdfStream.BEST_COMPRESSION); pdfDocument.open(); pdfCopy.addDocument(reader); pdfCopy.addDocument(reader2); pdfCopy.close(); reader.close(); reader2.close(); out.close(); reader = new PdfReader("./target/com/itextpdf/test/pdf/PdfCopyTest/out-forms.pdf"); Assert.assertNotNull(reader.getPageN(1)); reader.close(); } @Test public void copyFields1Test() throws DocumentException, IOException, InterruptedException { Document pdfDocument = new Document(); new File("./target/com/itextpdf/test/pdf/PdfCopyTest/").mkdirs(); PdfCopy copier = new PdfCopy(pdfDocument, new FileOutputStream("./target/com/itextpdf/test/pdf/PdfCopyTest/copyFields.pdf")); copier.setMergeFields(); pdfDocument.open(); PdfReader readerMain = new PdfReader("./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/fieldsOn3-sPage.pdf"); PdfReader secondSourceReader = new PdfReader("./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/fieldsOn2-sPage.pdf"); PdfReader thirdReader = new PdfReader("./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/appearances1.pdf"); copier.addDocument(readerMain); copier.copyDocumentFields(secondSourceReader); copier.addDocument(thirdReader); copier.close(); readerMain.close(); secondSourceReader.close(); thirdReader.close(); CompareTool compareTool = new CompareTool(); String errorMessage = compareTool.compareByContent("./target/com/itextpdf/test/pdf/PdfCopyTest/copyFields.pdf", "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/cmp_copyFields.pdf", "./target/com/itextpdf/test/pdf/PdfCopyTest/", "diff"); if (errorMessage != null) { Assert.fail(errorMessage); } } @Test public void copyFields2Test() throws DocumentException, IOException, InterruptedException { Document pdfDocument = new Document(); new File("./target/com/itextpdf/test/pdf/PdfCopyTest/").mkdirs(); PdfCopy copier = new PdfCopy(pdfDocument, new FileOutputStream("./target/com/itextpdf/test/pdf/PdfCopyTest/copyFields2.pdf")); copier.setMergeFields(); pdfDocument.open(); PdfReader reader = new PdfReader("./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/hello_with_comments.pdf"); copier.addDocument(reader); copier.close(); CompareTool compareTool = new CompareTool(); String errorMessage = compareTool.compareByContent("./target/com/itextpdf/test/pdf/PdfCopyTest/copyFields2.pdf", "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/cmp_copyFields2.pdf", "./target/com/itextpdf/test/pdf/PdfCopyTest/", "diff"); if (errorMessage != null) { Assert.fail(errorMessage); } } @Test public void copyFields3Test() throws DocumentException, IOException, InterruptedException { Document pdfDocument = new Document(); new File("./target/com/itextpdf/test/pdf/PdfCopyTest/").mkdirs(); PdfCopy copier = new PdfCopy(pdfDocument, new FileOutputStream("./target/com/itextpdf/test/pdf/PdfCopyTest/copyFields3.pdf")); copier.setMergeFields(); pdfDocument.open(); PdfReader reader = new PdfReader("./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/hello2_with_comments.pdf"); copier.addDocument(reader); copier.close(); CompareTool compareTool = new CompareTool(); String errorMessage = compareTool.compareByContent("./target/com/itextpdf/test/pdf/PdfCopyTest/copyFields3.pdf", "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/cmp_copyFields3.pdf", "./target/com/itextpdf/test/pdf/PdfCopyTest/", "diff"); if (errorMessage != null) { Assert.fail(errorMessage); } } @Test public void copyFields4Test() throws IOException, DocumentException, InterruptedException { String outputFolder = "./target/com/itextpdf/test/pdf/PdfCopyTest/"; String outputFile = "copyFields4.pdf"; String resources = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/"; String inputFile1 = "link.pdf"; Document doc = new Document(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfWriter.getInstance(doc, baos); com.itextpdf.text.Font font = new com.itextpdf.text.Font(BaseFont.createFont( resources + "fonts/georgia.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED), 9); doc.open(); doc.add(new Phrase("text", font)); doc.close(); Document pdfDocument = new Document(); new File(outputFolder).mkdirs(); PdfCopy copier = new PdfCopy(pdfDocument, new FileOutputStream(outputFolder + outputFile)); copier.setMergeFields(); pdfDocument.open(); PdfReader reader1 = new PdfReader(resources + inputFile1); PdfReader reader2 = new PdfReader(baos.toByteArray()); copier.addDocument(reader1); copier.addDocument(reader2); copier.close(); CompareTool compareTool = new CompareTool(); String errorMessage = compareTool.compareByContent(outputFolder + outputFile, resources + "cmp_" + outputFile, outputFolder, "diff"); if (errorMessage != null) { Assert.fail(errorMessage); } } @Test(timeout = 60000) public void largeFilePerformanceTest() throws IOException, DocumentException, InterruptedException { String target = "./target/com/itextpdf/test/pdf/PdfCopyTest/"; String resources = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/"; String output = "copyLargeFile.pdf"; String cmp = "cmp_copyLargeFile.pdf"; new File(target).mkdirs(); long timeStart = System.nanoTime(); PdfReader firstSourceReader = new PdfReader( resources +"frontpage.pdf"); PdfReader secondSourceReader = new PdfReader(resources + "large_pdf.pdf"); Document document = new Document(); PdfCopy copy = new PdfCopy(document, new FileOutputStream(target + output)); copy.setMergeFields(); document.open(); copy.addDocument(firstSourceReader); copy.addDocument(secondSourceReader); copy.close(); document.close(); System.out.println(((System.nanoTime() - timeStart) / 1000 / 1000)); CompareTool cmpTool = new CompareTool(); String errorMessage = cmpTool.compareByContent(target + output, resources + cmp, target, "diff"); if (errorMessage != null) { Assert.fail(errorMessage); } } @Test public void mergeNamedDestinationsTest() throws IOException, DocumentException, InterruptedException { String outputFolder = "./target/com/itextpdf/test/pdf/PdfCopyTest/"; String outputFile = "namedDestinations.pdf"; String resources = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/"; // Create simple document ByteArrayOutputStream main = new ByteArrayOutputStream(); Document doc = new Document(new Rectangle(612f,792f),54f,54f,36f,36f); PdfWriter pdfwrite = PdfWriter.getInstance(doc,main); doc.open(); doc.add(new Paragraph("Testing Page")); doc.close(); // Create TOC document ByteArrayOutputStream two = new ByteArrayOutputStream(); Document doc2 = new Document(new Rectangle(612f,792f),54f,54f,36f,36f); PdfWriter pdfwrite2 = PdfWriter.getInstance(doc2, two); doc2.open(); Chunk chn = new Chunk("<<-- Link To Testing Page -->>"); chn.setRemoteGoto("DUMMY.PDF","page-num-1"); doc2.add(new Paragraph(chn)); doc2.close(); // Merge documents ByteArrayOutputStream three = new ByteArrayOutputStream(); PdfReader reader1 = new PdfReader(main.toByteArray()); PdfReader reader2 = new PdfReader(two.toByteArray()); Document doc3 = new Document(); PdfCopy DocCopy = new PdfCopy(doc3,three); doc3.open(); DocCopy.addPage(DocCopy.getImportedPage(reader2,1)); DocCopy.addPage(DocCopy.getImportedPage(reader1,1)); DocCopy.addNamedDestination("page-num-1",2,new PdfDestination(PdfDestination.FIT)); doc3.close(); // Fix references and write to file PdfReader finalReader = new PdfReader(three.toByteArray()); finalReader.makeRemoteNamedDestinationsLocal(); PdfStamper stamper = new PdfStamper(finalReader,new FileOutputStream(outputFolder + outputFile)); stamper.close(); CompareTool compareTool = new CompareTool(); String errorMessage = compareTool.compareByContent(outputFolder + outputFile, resources + "cmp_" + outputFile, outputFolder, "diff"); if (errorMessage != null) { Assert.fail(errorMessage); } } @Test public void recursiveSmartMergeTest() throws Exception { String inputDocPath = "recursiveSmartMerge.pdf"; String outputFolder = "./target/com/itextpdf/test/pdf/PdfCopyTest/"; String resources = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/"; byte[] part1 = ExtractPages(resources + inputDocPath, 1, 2); OutputStream os1 = new FileOutputStream(outputFolder + "part1_c.pdf"); os1.write(part1); File outputPath1 = new File(outputFolder, "part1_c.pdf"); byte[] part2 = ExtractPages(resources + inputDocPath, 3, 7); OutputStream os2 = new FileOutputStream(outputFolder + "part2_c.pdf"); os2.write(part2); File outputPath2 = new File(outputFolder, "part2_c.pdf"); byte[] merged = Merge(new File[] { outputPath1, outputPath2 }); OutputStream os3 = new FileOutputStream(outputFolder + "outputRecursiveSmartMerge.pdf"); os3.write(merged); File mergedPath = new File(outputFolder, "outputRecursiveSmartMerge.pdf"); CompareTool compareTool = new CompareTool(); String errorMessage = compareTool.compareByContent(outputFolder + "outputRecursiveSmartMerge.pdf", resources + "cmp_" + inputDocPath, outputFolder, "diff"); if (errorMessage != null) { Assert.fail(errorMessage); } } @Test public void copySignedDocuments() throws IOException, DocumentException { String file = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/hello_signed1.pdf"; new File("./target/com/itextpdf/test/pdf/PdfCopyTest/").mkdirs(); Document pdfDocument = new Document(); PdfCopy copier = new PdfCopy(pdfDocument, new FileOutputStream("./target/com/itextpdf/test/pdf/PdfCopyTest/CopySignedDocuments.pdf")); pdfDocument.open(); PdfReader reader1 = new PdfReader(file); copier.addPage(copier.getImportedPage(reader1, 1)); copier.freeReader(reader1); reader1 = new PdfReader(file); copier.addPage(copier.getImportedPage(reader1, 1)); copier.freeReader(reader1); pdfDocument.close(); PdfReader reader = new PdfReader("./target/com/itextpdf/test/pdf/PdfCopyTest/CopySignedDocuments.pdf"); PdfDictionary sig = (PdfDictionary)reader.getPdfObject(9); PdfDictionary sigRef = sig.getAsArray(PdfName.REFERENCE).getAsDict(0); Assert.assertTrue(PdfName.SIGREF.equals(sigRef.getAsName(PdfName.TYPE))); Assert.assertFalse(sigRef.contains(PdfName.DATA)); sig = (PdfDictionary)reader.getPdfObject(21); sigRef = sig.getAsArray(PdfName.REFERENCE).getAsDict(0); Assert.assertTrue(PdfName.SIGREF.equals(sigRef.getAsName(PdfName.TYPE))); Assert.assertFalse(sigRef.contains(PdfName.DATA)); } @Test public void smartCopySignedDocuments() throws IOException, DocumentException { String file = "./src/test/resources/com/itextpdf/text/pdf/PdfCopyTest/hello_signed1.pdf"; new File("./target/com/itextpdf/test/pdf/PdfCopyTest/").mkdirs(); Document pdfDocument = new Document(); PdfSmartCopy copier = new PdfSmartCopy(pdfDocument, new FileOutputStream("./target/com/itextpdf/test/pdf/PdfCopyTest/SmartCopySignedDocuments.pdf")); pdfDocument.open(); PdfReader reader1 = new PdfReader(file); copier.addPage(copier.getImportedPage(reader1, 1)); copier.freeReader(reader1); reader1 = new PdfReader(file); copier.addPage(copier.getImportedPage(reader1, 1)); copier.freeReader(reader1); pdfDocument.close(); PdfReader reader = new PdfReader("./target/com/itextpdf/test/pdf/PdfCopyTest/SmartCopySignedDocuments.pdf"); PdfDictionary sig = (PdfDictionary)reader.getPdfObject(8); PdfDictionary sigRef = sig.getAsArray(PdfName.REFERENCE).getAsDict(0); Assert.assertTrue(PdfName.SIGREF.equals(sigRef.getAsName(PdfName.TYPE))); Assert.assertFalse(sigRef.contains(PdfName.DATA)); } public static byte[] Merge(File[] documentPaths) throws IOException, DocumentException { byte[] mergedDocument; ByteArrayOutputStream memoryStream = new ByteArrayOutputStream(); Document document = new Document(); PdfSmartCopy pdfSmartCopy = new PdfSmartCopy(document, memoryStream); document.open(); for (File docPath : documentPaths) { PdfReader reader = new PdfReader(docPath.toString()); try { reader.consolidateNamedDestinations(); int numberOfPages = reader.getNumberOfPages(); for (int page = 0; page < numberOfPages;) { PdfImportedPage pdfImportedPage = pdfSmartCopy.getImportedPage(reader, ++page); pdfSmartCopy.addPage(pdfImportedPage); } } finally { reader.close(); } } document.close(); mergedDocument = memoryStream.toByteArray(); return mergedDocument; } public static byte[] ExtractPages(String pdfDocument, int startPage, int endPage) throws IOException, DocumentException { InputStream pdfDocumentStream = new FileInputStream(pdfDocument); PdfReader reader = new PdfReader(pdfDocumentStream); int numberOfPages = reader.getNumberOfPages(); int endPageResolved = endPage > 0 ? endPage : numberOfPages; if (startPage > numberOfPages || endPageResolved > numberOfPages) System.err.printf("Error: page indices (%s, %s) out of bounds. Document has {2} pages.", startPage, endPageResolved, numberOfPages); byte[] outputDocument; ByteArrayOutputStream msOut = new ByteArrayOutputStream(); Document doc = new Document(); PdfCopy pdfCopyProvider = new PdfCopy(doc, msOut); doc.open(); for (int i = startPage; i <= endPageResolved; i++) { PdfImportedPage page = pdfCopyProvider.getImportedPage(reader, i); pdfCopyProvider.addPage(page); } doc.close(); reader.close(); outputDocument = msOut.toByteArray(); return outputDocument; } private static byte[] createImagePdf() throws Exception { final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); final Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, byteStream); document.setPageSize(PageSize.LETTER); document.open(); BufferedImage awtImg = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = awtImg.createGraphics(); g2d.setColor(Color.green); g2d.fillRect(10, 10, 80, 80); g2d.dispose(); com.itextpdf.text.Image itextImg = com.itextpdf.text.Image.getInstance(awtImg, null); document.add(itextImg); document.close(); final byte[] pdfBytes = byteStream.toByteArray(); return pdfBytes; } }