如何使用PDFbox获取Radiobutton的位置

时间:2017-04-17 13:38:56

标签: java pdfbox

您好我正在使用此代码获取PDF中组件的位置。但如果field是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();

1 个答案:

答案 0 :(得分:1)

一个字段可以有几个小部件(当然会有一个单选按钮,在问题下方看到mkl的评论)然后可以在/ Kids数组中找到小部件列表,这样可以简化生活并使用由PDFBox而不是直接访问字典。附加的代码适用于PDFBOX-142问题的文件。字段“amt”虽然看起来像一个复选标记,但是带有9个小部件的单选按钮字段 - 运行PDFDebugger并转到“查看”菜单,然后更改为“显示内部结构”,然后查看Root / AcroForm /领域:

enter image description here

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

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打开文件来验证这些位置(如果已经在“显示内部结构”模式下打开,然后在“查看”菜单中选择“显示页面”)并在渲染图像上移动鼠标,坐标将显示在主框架的左下角。