我被卡在一个区域。我需要在一个pdf中识别PDAcroForm
字段的位置。我需要对字段的x和y值进行一些处理。
知道怎么做吗?信息是否存在于COS对象中?
答案 0 :(得分:7)
我今天遇到了同样的问题。以下代码适用于我的情况:
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));
}
编辑:karthicks代码更短。所以我现在使用这个代码:
private PDRectangle getFieldArea(PDField field) {
COSDictionary fieldDict = field.getDictionary();
COSArray fieldAreaArray = (COSArray) fieldDict.getDictionaryObject(COSName.RECT);
PDRectangle result = new PDRectangle(fieldAreaArray);
return result;
}
如果要测试返回的矩形是否正确,可以使用此代码:
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()); // left
contentStream.drawLine(rect.getLowerLeftX(), rect.getUpperRightY(), rect.getUpperRightX(), rect.getUpperRightY()); // top
contentStream.drawLine(rect.getUpperRightX(), rect.getLowerLeftY(), rect.getUpperRightX(), rect.getUpperRightY()); // right
contentStream.drawLine(rect.getLowerLeftX(), rect.getLowerLeftY(), rect.getUpperRightX(), rect.getLowerLeftY()); // bottom
contentStream.setStrokingColor(Color.BLACK);
}
答案 1 :(得分:3)
接受的答案不再适用。我尝试了这种方法并收到了NullPointerException
的一些元素。在PDFBOX 2.x中,您可以直接获取矩形而无需查询COS对象树。
有关字段位置的信息存储在PDAnnotationWidget
中。可以有更多与该字段相关联的小部件。获得第一个(不检查这些是否是一个)。
PDRectangle rectangle = field.getWidgets().get(0).getRectangle();
获取所有矩形(如果可以有更多):
List<PDRectangle> rectangles = field.getWidgets().stream().map(PDAnnotation::getRectangle).collect(Collectors.toList());
答案 2 :(得分:0)
我能够得到像这样的细节
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());
答案 3 :(得分:0)
使用以下代码获取最新的PdfBox依赖版本
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;
}