2017-04-17 1 views
1

Bonjour, j'utilise ce code pour obtenir la position des composants en PDF. Mais si le champ est de type Radiobutton alors fieldAreaArray = nullComment obtenir la position de Radiobutton en utilisant PDFbox

COSDictionary fieldDict = field.getCOSObject(); 
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(); 
+1

Vous devez être conscient qu'il existe une différence dans pdfs entre le champ de formulaire et ses widgets de visualisation. Si un champ de formulaire n'a qu'une seule visualisation, l'objet pdf modélisant le champ de formulaire et l'objet pdf modélisant la visualisation peuvent être fusionnés en un seul objet. Seulement dans une telle situation fusionnée votre code fonctionne. D'un autre côté, un champ de formulaire de bouton radio n'a presque jamais un seul widget car le champ de formulaire représente l'état de l'ensemble du groupe de boutons radio connectés. – mkl

+0

@ Tomm23 le mieux est de jeter un oeil au fichier avec PDFDebugger. Passez à "Afficher la structure interne", puis regardez Root/AcroForm/Fields. Re les widgets, obtenez votre champ, puis appelez 'getWidgets()', puis obtenez les rectangles de chaque widget (il existe une méthode directe). Par exemple, le bouton radio (qui ressemble à des coches, mais ce sont vraiment des boutons radio) dans le fichier https://issues.apache.org/jira/browse/PDFBOX-142 a 9 widgets, voir dans Root/AcroForm/Champs/[9]/Enfants ». –

+0

@ Tomm23 Est-ce que Tilman et mon commentaire t'ont aidé? Si oui, ce serait bien si vous avez créé une réponse réelle à votre question décrivant votre solution. Si non, qu'est-ce que vous n'avez pas compris spécifiquement? – mkl

Répondre

1

Un champ peut avoir plusieurs widgets (un bouton radio certainement, voir le commentaire par MKL ci-dessous la question) et la liste de widget se trouve dans le répertoire/Kids array, alors simplifiez-vous la vie et utilisez les méthodes fournies par PDFBox au lieu d'accéder directement au dictionnaire. Le code joint fonctionne avec le fichier du problème PDFBOX-142. Le champ "amt", bien qu'il ressemble à une coche, est un champ bouton radio avec 9 widgets - exécutez PDFDebugger et allez dans le menu "Affichage", et passez à "afficher la structure interne", puis regardez Root/AcroForm/Fields:

enter image description here

Pour obtenir les rectangles programme, utilisez ce code:

PDDocument document = PDDocument.load(new URL("https://issues.apache.org/jira/secure/attachment/12742551/Testformular1.pdf").openStream()); 
PDField field = document.getDocumentCatalog().getAcroForm().getField("amt"); 
System.out.println(field.getClass().getSimpleName()); 
for (PDAnnotationWidget widget : field.getWidgets()) 
{ 
    System.out.println(widget.getRectangle()); 
} 
document.close(); 

Et ceci est la sortie:

PDRadioButton 
[177.944,580.3095,190.1991,592.0744] 
[178.8963,350.25168,191.45924,361.8096] 
[535.79285,467.17078,548.0479,478.93567] 
[417.16348,467.17078,429.41858,478.93567] 
[298.04395,466.19037,310.29904,477.95526] 
[177.944,466.19037,190.1991,477.95526] 
[534.81244,581.2899,547.0675,593.0548] 
[417.16348,581.2899,429.41858,593.0548] 
[298.04395,581.2899,310.29904,593.0548] 

Vous pouvez vérifier ces positions en ouvrant le fichier avec PDFDebugger (s'il est déjà ouvert en mode "structure interne", puis dans le menu "Affichage" choisissez "afficher pages") et déplacez votre souris sur l'image rendue, les coordonnées seront montré en bas à gauche du cadre principal.