2012-01-04 50 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