You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ms...@apache.org on 2016/12/09 20:11:16 UTC

svn commit: r1773459 - /pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFlattenTest.java

Author: msahyoun
Date: Fri Dec  9 20:11:16 2016
New Revision: 1773459

URL: http://svn.apache.org/viewvc?rev=1773459&view=rev
Log:
PDFBOX-3396, PDFBOX-3587: add unit test to compare rendering before and after flattening. Individual test disabled per default.

Added:
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFlattenTest.java   (with props)

Added: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFlattenTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFlattenTest.java?rev=1773459&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFlattenTest.java (added)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFlattenTest.java Fri Dec  9 20:11:16 2016
@@ -0,0 +1,325 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.pdmodel.interactive.form;
+
+import static org.junit.Assert.assertTrue;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+
+import javax.imageio.ImageIO;
+
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.rendering.PDFRenderer;
+import org.apache.pdfbox.rendering.TestPDFToImage;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test flatten different forms and compare with rendering.
+ * 
+ * The tests are currently disabled to not run within the CI environment
+ * as the test results need manual inspection. Enable as needed.
+ * 
+ */
+public class PDAcroFormFlattenTest {
+	
+	private static final File IN_DIR = new File("target/test-output/flatten/in");
+	private static final File OUT_DIR = new File("target/test-output/flatten/out");
+	
+    @Before
+    public void setUp()
+    {
+    	IN_DIR.mkdirs();;
+    	OUT_DIR.mkdirs();;
+    }
+
+	/*
+	 * PDFBOX-142 Filled template.
+	 */
+	// @Test
+    public void testFlattenPDFBOX142() throws IOException
+    {
+		String sourceUrl = "https://issues.apache.org/jira/secure/attachment/12742551/Testformular1.pdf";
+		String targetFileName = "Testformular1.pdf";
+		
+		flattenAndCompare(sourceUrl, targetFileName);       
+    }	
+	
+	/*
+	 * PDFBOX-563 Filled template.
+	 */
+	// @Test
+    public void testFlattenPDFBOX563() throws IOException
+    {
+		String sourceUrl = "https://issues.apache.org/jira/secure/attachment/12425859/TestFax_56972.pdf";
+		String targetFileName = "TestFax_56972.pdf";
+		
+		flattenAndCompare(sourceUrl, targetFileName);       
+    }
+	
+	/*
+	 * PDFBOX-2469 Empty template.
+	 */
+	// @Test
+    public void testFlattenPDFBOX2469Empty() throws IOException
+    {
+		String sourceUrl = "https://issues.apache.org/jira/secure/attachment/12682897/FormI-9-English.pdf";
+		String targetFileName = "FormI-9-English.pdf";
+		
+		flattenAndCompare(sourceUrl, targetFileName);       
+    }
+	
+	/*
+	 * PDFBOX-2469 Filled template.
+	 */
+	// @Test
+    public void testFlattenPDFBOX2469Filled() throws IOException
+    {
+		String sourceUrl = "https://issues.apache.org/jira/secure/attachment/12678455/testPDF_acroForm.pdf";
+		String targetFileName = "testPDF_acroForm.pdf";
+		
+		flattenAndCompare(sourceUrl, targetFileName);       
+    }
+	
+	/*
+	 * PDFBOX-2586 Empty template.
+	 */
+	// @Test
+    public void testFlattenPDFBOX2586() throws IOException
+    {
+		String sourceUrl = "https://issues.apache.org/jira/secure/attachment/12689788/test.pdf";
+		String targetFileName = "test-2586.pdf";
+		
+		flattenAndCompare(sourceUrl, targetFileName);       
+    }
+	
+	/*
+	 * PDFBOX-3083 Filled template rotated.
+	 */
+	// @Test
+    public void testFlattenPDFBOX3083() throws IOException
+    {
+		String sourceUrl = "https://issues.apache.org/jira/secure/attachment/12770263/mypdf.pdf";
+		String targetFileName = "mypdf.pdf";
+		
+		flattenAndCompare(sourceUrl, targetFileName);       
+    }
+	
+	/*
+	 * PDFBOX-3396 Signed Document 1.
+	 */
+	// @Test
+    public void testFlattenPDFBOX3396_1() throws IOException
+    {
+		String sourceUrl = "https://issues.apache.org/jira/secure/attachment/12816014/Signed-Document-1.pdf";
+		String targetFileName = "Signed-Document-1.pdf";
+		
+		flattenAndCompare(sourceUrl, targetFileName);       
+    }
+
+	/*
+	 * PDFBOX-3396 Signed Document 2.
+	 */
+	// @Test
+    public void testFlattenPDFBOX3396_2() throws IOException
+    {
+		String sourceUrl = "https://issues.apache.org/jira/secure/attachment/12816016/Signed-Document-2.pdf";
+		String targetFileName = "Signed-Document-2.pdf";
+		
+		flattenAndCompare(sourceUrl, targetFileName);       
+    }
+	
+	/*
+	 * PDFBOX-3396 Signed Document 3.
+	 */
+	// @Test
+    public void testFlattenPDFBOX3396_3() throws IOException
+    {
+		String sourceUrl = "https://issues.apache.org/jira/secure/attachment/12821307/Signed-Document-3.pdf";
+		String targetFileName = "Signed-Document-3.pdf";
+		
+		flattenAndCompare(sourceUrl, targetFileName);       
+    }
+	
+	/*
+	 * PDFBOX-3396 Signed Document 4.
+	 */
+	// @Test
+    public void testFlattenPDFBOX3396_4() throws IOException
+    {
+		String sourceUrl = "https://issues.apache.org/jira/secure/attachment/12821308/Signed-Document-4.pdf";
+		String targetFileName = "Signed-Document-4.pdf";
+		
+		flattenAndCompare(sourceUrl, targetFileName);       
+    }	
+    
+	/*
+	 * PDFBOX-3587 Empty template.
+	 */
+	// @Test
+    public void testFlattenOpenOfficeForm() throws IOException
+    {
+		String sourceUrl = "https://issues.apache.org/jira/secure/attachment/12839977/OpenOfficeForm.pdf";
+		String targetFileName = "OpenOfficeForm.pdf";
+		
+		flattenAndCompare(sourceUrl, targetFileName);     
+    }
+	
+	/*
+	 * PDFBOX-3587 Filled template.
+	 */
+	// @Test
+    public void testFlattenOpenOfficeFormFilled() throws IOException
+    {
+		String sourceUrl = "https://issues.apache.org/jira/secure/attachment/12840280/OpenOfficeForm_filled.pdf";
+		String targetFileName = "OpenOfficeForm_filled.pdf";
+		
+		flattenAndCompare(sourceUrl, targetFileName);        
+    }
+	
+	/*
+	 * Flatten and compare with generated image samples.
+	 */
+	private static void flattenAndCompare(String sourceUrl, String targetFileName) throws IOException
+	{
+		
+		generateSamples(sourceUrl,targetFileName);
+		
+		File inputFile = new File(IN_DIR, targetFileName);
+        File outputFile = new File(OUT_DIR, targetFileName);
+		
+        PDDocument testPdf = PDDocument.load(inputFile);
+        testPdf.getDocumentCatalog().getAcroForm().flatten();
+        testPdf.setAllSecurityToBeRemoved(true);
+        assertTrue(testPdf.getDocumentCatalog().getAcroForm().getFields().isEmpty());
+        testPdf.save(outputFile);
+        testPdf.close();
+
+        // compare rendering
+        TestPDFToImage testPDFToImage = new TestPDFToImage(TestPDFToImage.class.getName());
+        if (!testPDFToImage.doTestFile(outputFile, IN_DIR.getAbsolutePath(), OUT_DIR.getAbsolutePath()))
+        {
+            // don't fail, rendering is different on different systems, result must be viewed manually
+            System.out.println("Rendering of " + outputFile + " failed or is not identical to expected rendering in " + IN_DIR + " directory");
+            removeMatchingRenditions(inputFile);
+        }
+        else
+        {
+        	// cleanup input and output directory for matching files.
+        	removeAllRenditions(inputFile);
+        	inputFile.delete();
+        	outputFile.delete();
+        }
+	}	
+	
+	/*
+	 * Generate the sample images to which the PDF will be compared after flatten.
+	 */
+	private static void generateSamples(String sourceUrl, String targetFile) throws IOException
+	{
+		getFromUrl(sourceUrl, targetFile);
+		
+		File file = new File(IN_DIR,targetFile);
+		PDDocument document = PDDocument.load(file, (String)null);
+        String outputPrefix = IN_DIR.getAbsolutePath() + '/' + file.getName() + "-";
+        int numPages = document.getNumberOfPages();
+		
+        PDFRenderer renderer = new PDFRenderer(document);
+        for (int i = 0; i < numPages; i++)
+        {
+            String fileName = outputPrefix + (i + 1) + ".png";
+            BufferedImage image = renderer.renderImageWithDPI(i, 96); // Windows native DPI
+            ImageIO.write(image, "PNG", new File(fileName));
+        }
+        
+        document.close();
+	}
+	
+	/*
+	 * Get a PDF from URL and copy to file for processing.
+	 */
+	private static void getFromUrl(String sourceUrl, String targetFile) throws IOException
+	{
+		URL url = new URL(sourceUrl);
+		InputStream is = url.openStream();
+		OutputStream os = new FileOutputStream(new File(IN_DIR,targetFile));
+
+		byte[] b = new byte[2048];
+		int length;
+
+		while ((length = is.read(b)) != -1) {
+			os.write(b, 0, length);
+		}
+
+		is.close();
+		os.close();
+	}
+
+	/*
+	 * Remove renditions for the PDF from the input directory for which there is no
+	 * corresponding rendition in the output directory.
+	 * Renditions in the output directory which were identical to the ones in the
+	 * input directory will have been deleted by the TestPDFToImage utility.
+	 */
+	private static void removeMatchingRenditions(final File inputFile)
+	{
+        File[] testFiles = inputFile.getParentFile().listFiles(new FilenameFilter()
+        {
+            @Override
+            public boolean accept(File dir, String name)
+            {
+                return (name.startsWith(inputFile.getName()) && name.toLowerCase().endsWith(".png"));
+            }
+        });
+        
+        for (File testFile : testFiles)
+        {
+        	if (! new File(OUT_DIR, testFile.getName()).exists())
+        	{
+        		testFile.delete();
+        	}
+        }
+	}
+	
+	/*
+	 * Remove renditions for the PDF from the input directory.
+	 * The output directory will have been cleaned by the TestPDFToImage utility.
+	 */
+	private static void removeAllRenditions(final File inputFile)
+	{
+        File[] testFiles = inputFile.getParentFile().listFiles(new FilenameFilter()
+        {
+            @Override
+            public boolean accept(File dir, String name)
+            {
+                return (name.startsWith(inputFile.getName()) && name.toLowerCase().endsWith(".png"));
+            }
+        });
+              
+        for (File testFile : testFiles)
+        {
+        	testFile.delete();
+        }
+	}
+}

Propchange: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFlattenTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFlattenTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain