2012-01-04 157 views
2

我遇到坐标问题。 PDFTextStripperByArea区域似乎被推得太高。Pdfbox 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坐标)。到底是怎么回事?

回答

1

文本通常包含在一个定位矩形内。有时,文本不在该矩形内的预期位置,PDFBox使用该矩形尝试猜测文本的位置。所以如果文本开始在捕获区域之外并且流入它,它可能不会被提取。

粗略草图:文本框在捕获区域之外开始,但文本在其内部流动。它可能不会被捕获。

____________ 
|Page  | 
| _______| 
| |Area || 
| |  || 
| ..|.....|| 
| ⁞ |Text⁞|| 
| ⁞ |____⁞|| 
| ⁞......⁞ | 
|__________| 
+0

嗨,我有几乎相同的问题:我从PDF文档中提取块,并希望根据其坐标绘制矩形。我得到正确的宽度和高度,但正如你所提到的,最后的矩形是垂直移动的:块的第一行不包含在矩形中。 有什么窍门可以避免这种情况? – 2012-07-16 12:22:57

+0

@NicolasW。 Pdfbox在猜测文本的实际位置与开始位置相反时存在问题 - 因此,如果文本在矩形外部开始并在文本内部流动,则可能无法捕获文本。诀窍是尝试一个稍大的捕获区域,以捕获在当前捕获区域之外开始的文本。我没有找到比这更聪明的东西。 – ipavlic 2012-07-16 12:33:09

+0

好的,谢谢,我会看看我能做些什么:) – 2012-07-16 12:35:52

2

基督教在他的评论中说,问题是,对于fillRect()方法和一个用于PDFTextStripperByArea的坐标系是不同的。

第一个要求原点是页面的左下角,而第二个要求它是左上角。

因此,要使其工作,给予PDFTextStripperByArea地区更改为:

Rectangle2D.Float region = new Rectangle2D.Float(x, ph - y - height, width, height); 

其中Ph是页面的高度:

float ph = page.getMediaBox().getUpperRightY(); 

PS:我知道这是一个这是一个非常古老的问题,但当我遇到同样的问题时,Google把我带到了这里,所以我会添加我的答案。

+0

*“第一个要求原点是页面的左下角”* - 更确切地说:它预期由裁剪框/媒体框定义的坐标。媒体框*通常*在左下角有原点,但不是*。因此,通用解决方案也相应地转换* x *。 – mkl 2017-08-05 06:48:18