Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用PDFbox获取单选按钮的位置_Java_Pdfbox - Fatal编程技术网

Java 如何使用PDFbox获取单选按钮的位置

Java 如何使用PDFbox获取单选按钮的位置,java,pdfbox,Java,Pdfbox,您好,我正在使用此代码获取PDF中组件的位置。但若字段类型为Radiobutton,则fieldAreaArray=null COSDictionary fieldDict = field.getCOSObject(); COSArray fieldAreaArray = (COSArray) fieldDict.getDictionaryObject(COSName.RECT); float left = (float) ((COSFloat) fieldAreaAr

您好,我正在使用此代码获取PDF中组件的位置。但若字段类型为Radiobutton,则fieldAreaArray=null

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();

一个字段可以有几个小部件(单选按钮肯定会有,请参见问题下方mkl的注释),然后小部件列表将在/Kids数组中找到,因此您可以轻松地使用PDFBox提供的方法,而不是直接访问字典。所附代码适用于问题中的文件。字段“amt”虽然看起来像一个复选标记,但它是一个单选按钮字段,包含9个小部件-运行并转到“查看”菜单,更改为“显示内部结构”,然后查看根/AcroForm/字段:

要以编程方式获取矩形,请使用以下代码:

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();
这是输出:

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]

通过使用PDFDebugger打开文件(如果已在“显示内部结构”模式下打开,则在“查看”菜单中选择“显示页面”),并在渲染图像上移动鼠标,可以验证这些位置,坐标将显示在主框架的左下角。

您必须注意表单字段及其可视化窗口小部件之间的PDF差异。如果表单字段只有一个可视化,则建模表单字段的pdf对象和建模可视化的pdf对象可以合并到单个对象中。只有在这种合并的情况下,您的代码才能工作。另一方面,单选按钮表单字段几乎没有一个小部件,因为表单字段表示整个连接的单选按钮组的状态。@Tomm23最好使用PDFDebugger查看文件。更改为“显示内部结构”,然后查看Root/AcroForm/Fields。对于小部件,获取字段,然后调用
getWidgets()
,然后从每个小部件获取矩形(有一个直接方法)。例如,文件中的单选按钮(看起来像复选标记,但实际上是单选按钮)有9个小部件,请参见
Root/AcroForm/Fields/[9]/Kids
@Tomm23 Tilman和我的评论对您有帮助吗?如果是的话,如果你能为你的问题创建一个真实的答案来描述你的解决方案,那就太好了。如果没有,你具体不明白什么?@Tilman Hausherr是的,你的回答帮助了我。当JRadiobutton的字段实例是`的单选按钮组时,getWidgets()具有组中所有按钮的位置。