Author: msahyoun
Date: Fri Apr  5 07:43:07 2024
New Revision: 1916816

URL: http://svn.apache.org/viewvc?rev=1916816&view=rev
Log:
PDFBOX-5784: fix character alignment, draw dviders for comb

Added:
    
pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/interactive/form/PDFBOX-5784.pdf
   (with props)
    
pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/interactive/form/PDFBOX-5784.pdf-1.png
   (with props)
Modified:
    
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
    
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/CombAlignmentTest.java

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java?rev=1916816&r1=1916815&r2=1916816&view=diff
==============================================================================
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
 (original)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
 Fri Apr  5 07:43:07 2024
@@ -379,6 +379,23 @@ class AppearanceGeneratorHelper {
                         clipRect.getHeight());
                 contents.closeAndStroke();
             }
+
+            // draw the dividers for a comb field
+            if (borderColour != null && shallComb()) {
+                int maxLen = ((PDTextField) field).getMaxLen();
+                PDRectangle bbox = resolveBoundingBox(widget, 
appearanceStream);
+                PDRectangle clipRect = applyPadding(bbox, 
Math.max(DEFAULT_PADDING, lineWidth/2));
+                float lowerLeft = clipRect.getLowerLeftX();
+                float height = clipRect.getHeight();
+                    
+                float combWidth = bbox.getWidth() / maxLen;
+
+                for (int i= 0; i < maxLen - 1; i++) {
+                    contents.moveTo(combWidth + combWidth * i, height);
+                    contents.lineTo(combWidth + combWidth * i, lowerLeft);
+                }
+                contents.closeAndStroke();
+            }
         }
 
         contents.close();
@@ -647,26 +664,29 @@ class AppearanceGeneratorHelper {
         int quadding = field.getQ();
         int numChars = Math.min(value.length(), maxLen);
 
-        PDRectangle paddingEdge = applyPadding(appearanceStream.getBBox(), 1);
-
         float combWidth = appearanceStream.getBBox().getWidth() / maxLen;
         float ascentAtFontSize = font.getFontDescriptor().getAscent() / 
FONTSCALE * fontSize;
-        float baselineOffset = paddingEdge.getLowerLeftY()
-                + (appearanceStream.getBBox().getHeight() - ascentAtFontSize) 
/ 2;
+
+        float baselineOffset = appearanceStream.getBBox().getLowerLeftY() +  
+                (appearanceStream.getBBox().getHeight() - ascentAtFontSize)/2;
 
         float prevCharWidth = 0f;
 
-        float xOffset = combWidth / 2;
+        // set initial offset based on width of first char.
+        float firstCharWidth = font.getStringWidth(value.substring(0, 1)) / 
FONTSCALE * fontSize;
+        float initialOffset = (combWidth - firstCharWidth)/2;
 
         // add to initial offset if right aligned or centered
         if (quadding == 2)
         {
-            xOffset = xOffset + (maxLen - numChars) * combWidth;
+            initialOffset = initialOffset + (maxLen - numChars) * combWidth;
         }
         else if (quadding == 1)
         {
-            xOffset = xOffset + (maxLen - numChars) / 2 * combWidth;
+            initialOffset = initialOffset + Math.floorDiv(maxLen - numChars, 
2) * combWidth;
         }
+
+        float xOffset = initialOffset;
  
         for (int i = 0; i < numChars; i++)
         {
@@ -675,7 +695,11 @@ class AppearanceGeneratorHelper {
 
             xOffset = xOffset + prevCharWidth / 2 - currCharWidth / 2;
 
-            contents.newLineAtOffset(xOffset, baselineOffset);
+            if (i == 0) {
+                contents.newLineAtOffset(initialOffset, baselineOffset);
+            } else {
+                contents.newLineAtOffset(xOffset, baselineOffset);
+            }
             contents.showText(combString);
 
             baselineOffset = 0;

Modified: 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/CombAlignmentTest.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/CombAlignmentTest.java?rev=1916816&r1=1916815&r2=1916816&view=diff
==============================================================================
--- 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/CombAlignmentTest.java
 (original)
+++ 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/CombAlignmentTest.java
 Fri Apr  5 07:43:07 2024
@@ -18,6 +18,7 @@ package org.apache.pdfbox.pdmodel.intera
 
 import java.io.File;
 import java.io.IOException;
+
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.rendering.TestPDFToImage;
 import org.junit.Before;
@@ -55,6 +56,33 @@ public class CombAlignmentTest
         // compare rendering
         File file = new File(OUT_DIR, NAME_OF_PDF);
         document.save(file);
+        TestPDFToImage testPDFToImage = new 
TestPDFToImage(TestPDFToImage.class.getName());
+        if (!testPDFToImage.doTestFile(file, IN_DIR.getAbsolutePath(), 
OUT_DIR.getAbsolutePath()))
+        {
+            // don't fail, rendering is different on different systems, result 
must be viewed manually
+            System.err.println("Rendering of " + file +
+                    " failed or is not identical to expected rendering in " + 
IN_DIR + " directory");
+        }
+        document.close();
+    }
+
+    // PDFBOX-5784
+    @Test
+    public void testPDFBOX5784() throws IOException
+    {
+
+        final String NAME_OF_PDF = "PDFBOX-5784.pdf";
+
+        PDDocument document = PDDocument.load(new File(IN_DIR, NAME_OF_PDF));
+        PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm();
+        for (PDField field : acroForm.getFieldTree()) {
+            if (!field.getPartialName().contains("acrobat")) {
+                field.setValue("WIaqg");
+            }
+        }
+        // compare rendering
+        File file = new File(OUT_DIR, NAME_OF_PDF);
+        document.save(file);
         TestPDFToImage testPDFToImage = new 
TestPDFToImage(TestPDFToImage.class.getName());
         if (!testPDFToImage.doTestFile(file, IN_DIR.getAbsolutePath(), 
OUT_DIR.getAbsolutePath()))
         {

Added: 
pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/interactive/form/PDFBOX-5784.pdf
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/interactive/form/PDFBOX-5784.pdf?rev=1916816&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/interactive/form/PDFBOX-5784.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: 
pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/interactive/form/PDFBOX-5784.pdf-1.png
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/interactive/form/PDFBOX-5784.pdf-1.png?rev=1916816&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/interactive/form/PDFBOX-5784.pdf-1.png
------------------------------------------------------------------------------
    svn:mime-type = image/png


Reply via email to