8 Stimmen

Wie man die Position eines Feldes unter Verwendung von PDFBox erhält?

Ich bin in einem Bereich stecken geblieben. Ich muss die Positionen der PDAcroForm-Felder in einem PDF identifizieren. Ich muss einige Verarbeitungen mit dem x- und y-Wert der Felder durchführen.

Hast du eine Idee, wie das geht? Ist die Information im COS-Objekt vorhanden?

13voto

Lukas Punkte 1047

Ich hatte heute dasselbe Problem. Der folgende Code funktioniert in meinem Fall:

private PDRectangle getFieldArea(PDField field) {
  COSDictionary fieldDict = field.getDictionary();
  COSArray fieldAreaArray = (COSArray) fieldDict.getDictionaryObject(COSName.RECT);

  float left = (float) ((COSFloat) fieldAreaArray.get(0)).doubleValue();
  float bottom = (float) ((COSFloat) fieldAreaArray.get(1)).doubleValue();
  float right = (float) ((COSFloat) fieldAreaArray.get(2)).doubleValue();
  float top = (float) ((COSFloat) fieldAreaArray.get(3)).doubleValue();

  return new PDRectangle(new BoundingBox(left, bottom, right, top));
}

Bearbeiten: karthicks Code ist kürzer. Also benutze ich jetzt diesen Code:

private PDRectangle getFieldArea(PDField field) {
  COSDictionary fieldDict = field.getDictionary();
  COSArray fieldAreaArray = (COSArray) fieldDict.getDictionaryObject(COSName.RECT);
  PDRectangle result = new PDRectangle(fieldAreaArray);
  return result;
}

Und du kannst diesen Code benutzen, wenn du testen möchtest, ob das zurückgegebene Rechteck korrekt ist:

private void printRect(final PDPageContentStream contentStream, final PDRectangle rect) throws IOException {
  contentStream.setStrokingColor(Color.YELLOW);
  contentStream.drawLine(rect.getLowerLeftX(), rect.getLowerLeftY(), rect.getLowerLeftX(), rect.getUpperRightY()); // links
  contentStream.drawLine(rect.getLowerLeftX(), rect.getUpperRightY(), rect.getUpperRightX(), rect.getUpperRightY()); // oben
  contentStream.drawLine(rect.getUpperRightX(), rect.getLowerLeftY(), rect.getUpperRightX(), rect.getUpperRightY()); // rechts
  contentStream.drawLine(rect.getLowerLeftX(), rect.getLowerLeftY(), rect.getUpperRightX(), rect.getLowerLeftY()); // unten
  contentStream.setStrokingColor(Color.BLACK);
}

7voto

peak Punkte 171

Die akzeptierte Antwort funktioniert nicht mehr. Ich habe den Ansatz ausprobiert und NullPointerException für einige Elemente erhalten. In PDFBOX 2.x können Sie das Rechteck ohne direktes Abfragen des COS-Objektbaums erhalten.

Die Informationen zur Feldposition werden in PDAnnotationWidget gespeichert. Es können mehrere Widgets mit dem Feld verknüpft sein. Um das erste zu erhalten (ohne zu überprüfen, ob eines vorhanden ist).

PDRectangle rectangle = field.getWidgets().get(0).getRectangle();

Um alle Rechtecke zu erhalten (in Fällen, in denen es mehr geben kann):

List rectangles = field.getWidgets().stream().map(PDAnnotation::getRectangle).collect(Collectors.toList());

2voto

karthick Punkte 11580

Ich kann die Details so erhalten

   COSDictionary trailer = document.getDocument().getTrailer();
   COSDictionary root = (COSDictionary) trailer.getDictionaryObject(COSName.ROOT);
   COSDictionary acroForm = (COSDictionary) root.getDictionaryObject(COSName.getPDFName("AcroForm"));
   if (null != acroForm) {
    COSArray fields1 = (COSArray) acroForm.getDictionaryObject(COSName.getPDFName("Fields"));
    for (int l = 0; l < fields1.size(); l++) {
     COSDictionary field = (COSDictionary) fields1.getObject(l);
     COSArray rectArray= (COSArray)field.getDictionaryObject("Rect");
     PDRectangle mediaBox = new PDRectangle( rectArray ); 
System.out.println("mediaBox: " + mediaBox.getLowerLeftX()  +"||" +mediaBox.getLowerLeftY());
System.out.println("mediaBox: " + mediaBox.getUpperRightX()  +"||" + mediaBox.getUpperRightY());

1voto

Verwenden Sie den folgenden Code für die neuesten PdfBox-Abhängigkeitsversionen

private PDRectangle getFieldArea(PDField field) {
    COSDictionary fieldDict = field.getCOSObject();
    COSArray fieldAreaArray = (COSArray) fieldDict.getDictionaryObject(COSName.RECT);
    PDRectangle rectangle = new PDRectangle(fieldAreaArray);
    System.out.println(rectangle);
    return rectangle;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X