我遇到坐标问题。 PDFTextStripperByArea区域似乎被推得太高了。
请考虑以下示例代码段:
...
PDPage page = (PDPage) allPages.get(0);
PDFTextStripperByArea stripper = new PDFTextStripperByArea();
// define region for extraction -- the coordinates and dimensions are x, y, width, height
Rectangle2D.Float region = new Rectangle2D.Float(x, y, width, height);
stripper.addRegion("test region", region);
// overlay the region with a cyan rectangle to check if I got the coordinates and dimensions right
PDPageContentStream contentStream = new PDPageContentStream(document, page, true, true);
contentStream.setNonStrokingColor( Color.CYAN );
contentStream.fillRect(x, y, width, height );
contentStream.close();
// extract the text from the defined region
stripper.extractRegions(page);
String content = stripper.getTextForRegion("test region");
...
document.save(...); ...
青色矩形很好地覆盖了所需的区域。另一方面,剥离器错过矩形底部的几条线,并在矩形上方包含几条线 - 它看起来像是“向上”移动(通过y坐标)。到底是怎么回事?
答案 0 :(得分:2)
第一个期望原点是页面的左下角,而第二个期望它是左上角。
因此,要使其工作,请将给予PDFTextStripperByArea的区域更改为:
Rectangle2D.Float region = new Rectangle2D.Float(x, ph - y - height, width, height);
其中ph是页面高度:
float ph = page.getMediaBox().getUpperRightY();
PS:我知道这是一个非常古老的问题,但是当我遇到同样的问题时谷歌把我带到了这里,所以我会添加我的答案。
答案 1 :(得分:1)
文本通常包含在定位矩形中。有时,文本不在该矩形内的预期位置,而PDFBox使用该矩形来尝试猜测文本的位置。因此,如果文本在捕获区域之外开始并流入其中,则可能无法提取文本。
粗略草图:文本框从捕获区域外部开始,但文本在其中流动。它可能没被捕获。
____________
|Page |
| _______|
| |Area ||
| | ||
| ..|.....||
| ⁞ |Text⁞||
| ⁞ |____⁞||
| ⁞......⁞ |
|__________|