[ 
https://issues.apache.org/jira/browse/PDFBOX-5343?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17460828#comment-17460828
 ] 

Mohamed Sameem commented on PDFBOX-5343:
----------------------------------------

Yeah by default its a button, so i had to implement that way, i could share
yout the generic piece of code where i do , the thing is  image we paste
isn't persistent  after flattening.
The below is the script, ping me if u find anything wrong over here.

 PDNonTerminalField imageBoxes = (PDNonTerminalField) pdAcroForm.getField("#i");

      if (Objects.nonNull(imageBoxes)) {
        imageBoxes
            .getChildren()
            .forEach(
                x -> {
                  PDPushButton pdNonTerminalFieldX = (PDPushButton) x;
                  setField(
                      pdNonTerminalFieldX,
                      values.get(pdNonTerminalFieldX.getPartialName()),
                      pdfDocument);
                });
      }
      for (PDField field : pdAcroForm.getFieldTree()) {
        field.setReadOnly(true);
      }
      pdfDocument.save(byteArrayOutputStream);
      pdfDocument.close();
      return byteArrayOutputStream.toByteArray();
    } catch (Exception e) {
      log.error("exception caught while generating pdf: ", e);
      return null;
    }
  }

  private static PDRectangle getFieldArea(PDAnnotationWidget
pdAnnotationWidget) {
    COSDictionary fieldDict = pdAnnotationWidget.getCOSObject();
    COSArray fieldAreaArray = (COSArray)
fieldDict.getDictionaryObject(COSName.RECT);
    return new PDRectangle(fieldAreaArray);
  }

  private static void setField(PDField field, String value, PDDocument
pdfDocument) {
    if (Objects.isNull(field)) {
      return;
    }
    try {
      if (field instanceof PDCheckBox) {
        PDCheckBox checkbox = (PDCheckBox) field;
        if (value.isEmpty()) {
          checkbox.unCheck();
        } else {
          checkbox.check();
        }
      } else if (field instanceof PDComboBox) {
        field.setValue(value);
      } else if (field instanceof PDListBox) {
        field.setValue(value);
      } else if (field instanceof PDRadioButton) {
        field.setValue(value);
      } else if (field instanceof PDTextField) {
        PDTextField textField = (PDTextField) field;
        textField.setDefaultAppearance("/Helv 22 Tf 0 g");
        textField.setValue(value);
      } else if (field instanceof PDPushButton) {
        setImageField(field, value, pdfDocument);
      }
    } catch (Exception e) {
      log.error("Failed to set value {} at field {}", value,
field.getFullyQualifiedName(), e);
    }
  }

  static void setImageField(PDField field, String value, PDDocument pdfDocument)
      throws IOException {
    if (StringUtils.isEmpty(value)) {
      return;
    }
    PDPushButton pdPushButton = (PDPushButton) field;
    List<PDAnnotationWidget> widgets = pdPushButton.getWidgets();
    byte[] byteArray = Base64.getDecoder().decode(value);
    for (PDAnnotationWidget annotationWidget : widgets) {
      PDImageXObject pdImageXObject =
PDImageXObject.createFromByteArray(pdfDocument, byteArray,
field.getPartialName());
      float imageScaleRatio =
          (float) pdImageXObject.getHeight() / (float)
pdImageXObject.getWidth();
      PDRectangle buttonPosition = getFieldArea(annotationWidget);
      float height = buttonPosition.getHeight();
      float width = height / imageScaleRatio;
      float x = buttonPosition.getLowerLeftX();
      float y = buttonPosition.getLowerLeftY();
      PDAppearanceStream pdAppearanceStream = new
PDAppearanceStream(pdfDocument);
      pdAppearanceStream.setResources(new PDResources());
      try (PDPageContentStream pdPageContentStream =
          new PDPageContentStream(pdfDocument, pdAppearanceStream)) {
        pdPageContentStream.drawImage(pdImageXObject, x, y, width, height);
      }
      pdAppearanceStream.setBBox(new PDRectangle(x, y, width, height));
      PDAppearanceDictionary pdAppearanceDictionary =
annotationWidget.getAppearance();
      if (pdAppearanceDictionary == null) {
        pdAppearanceDictionary = new PDAppearanceDictionary();
        annotationWidget.setAppearance(pdAppearanceDictionary);
      }
      pdAppearanceDictionary.setNormalAppearance(pdAppearanceStream);
    }
  }
}


On Thu, Dec 16, 2021 at 7:17 PM Tilman Hausherr (Jira) <j...@apache.org>



> PdfBox images Alignation Issue after using flatten function
> -----------------------------------------------------------
>
>                 Key: PDFBOX-5343
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-5343
>             Project: PDFBox
>          Issue Type: Bug
>          Components: AcroForm
>    Affects Versions: 3.0.0 PDFBox
>            Reporter: Mohamed Sameem
>            Priority: Major
>              Labels: PDFBox, acroform, bug, flatten, pdf
>         Attachments: Screenshot_2021-12-15-22-49-00-277_com.adobe.reader.jpg, 
> Screenshot_2021-12-15-22-50-18-641_com.adobe.reader.jpg, bug.pdf, 
> irregular.png, irregular2.png
>
>
> Using flatten function of pdfbox changes the position of images from the 
> required box to be filled.I would like to know if there is a fix for this. I 
> would like the pdfbox team to look into it.Images attached The images are 
> moving out of their respective position after using PDAcroForm.flatten() 
> Images attached
> https://stackoverflow.com/questions/70361091/pdfbox-images-alignation-issue-after-using-flatten-function



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@pdfbox.apache.org
For additional commands, e-mail: dev-h...@pdfbox.apache.org

Reply via email to