Author: msahyoun
Date: Fri Apr  5 07:37:34 2024
New Revision: 1916815

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

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

Modified: 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java?rev=1916815&r1=1916814&r2=1916815&view=diff
==============================================================================
--- 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
 (original)
+++ 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
 Fri Apr  5 07:37:34 2024
@@ -402,6 +402,23 @@ class AppearanceGeneratorHelper
                     
contents.addRect(clipRect.getLowerLeftX(),clipRect.getLowerLeftY(),clipRect.getWidth(),
 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();
+                }
             }
             
             writeToStream(output.toByteArray(), appearanceStream);
@@ -695,28 +712,31 @@ class AppearanceGeneratorHelper
         int maxLen = ((PDTextField) field).getMaxLen();
         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() +  
+
+        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 + Math.floorDiv(maxLen - numChars, 2) * 
combWidth;
+            initialOffset = initialOffset + Math.floorDiv(maxLen - numChars, 
2) * combWidth;
         }
 
+        float xOffset = initialOffset;
+
         for (int i = 0; i < numChars; i++) 
         {
             String combString = value.substring(i, i+1);
@@ -724,7 +744,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/3.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/CombAlignmentTest.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/3.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/CombAlignmentTest.java?rev=1916815&r1=1916814&r2=1916815&view=diff
==============================================================================
--- 
pdfbox/branches/3.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/CombAlignmentTest.java
 (original)
+++ 
pdfbox/branches/3.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/CombAlignmentTest.java
 Fri Apr  5 07:37:34 2024
@@ -18,6 +18,7 @@ package org.apache.pdfbox.pdmodel.intera
 
 import java.io.File;
 import java.io.IOException;
+
 import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.rendering.TestPDFToImage;
@@ -57,6 +58,33 @@ class CombAlignmentTest
             // compare rendering
             File file = new File(OUT_DIR, NAME_OF_PDF);
             document.save(file);
+            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");
+            }
+        }
+    }
+
+    // PDFBOX-5784
+    @Test
+    void testPDFBOX5784() throws IOException
+    {
+
+        final String NAME_OF_PDF = "PDFBOX-5784.pdf";
+
+        try (PDDocument document = Loader.loadPDF(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);
             if (!TestPDFToImage.doTestFile(file, IN_DIR.getAbsolutePath(), 
OUT_DIR.getAbsolutePath()))
             {
                 // don't fail, rendering is different on different systems, 
result must be viewed manually

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

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

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

Propchange: 
pdfbox/branches/3.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