2012-01-04 2 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 문서에서 블록을 추출하고 좌표에 따라 직사각형을 그립니다. 올바른 너비와 높이를 얻지 만 앞에서 설명한대로 최종 사각형은 수직으로 이동합니다. 블록의 첫 번째 줄은 사각형에 포함되지 않습니다. 이를 피하기위한 트릭이 있습니까? –

+0

@ NicolasW. Pdfbox는 실제로 텍스트가 시작되는 위치와 반대되는 위치를 추측하는 데 문제가 있습니다. 텍스트가 사각형 외부에서 시작되어 그 내부로 흐를 경우 캡처되지 않을 수 있습니다. 트릭은 약간 큰 캡처 영역을 시도하여 현재 캡처 영역 외부에서 시작하는 텍스트를 캡처하는 것입니다. 나는 그보다 더 똑똑한 것을 찾지 못했습니다. – ipavlic

+0

그래, 고마워, 내가 뭘 할 수 있는지 알 겠어. –

2

기독교 그의 의견에 말했듯이, 문제가 fillRect 할() 메소드와 PDFTextStripperByArea에 대한 하나의 좌표계가 다른 점이다.

원점은 원점이 페이지의 왼쪽 아래 모퉁이이고 두 번째 원점이 왼쪽 위를 기대한다고 가정합니다.

그래서

, 그것은 작동에 PDFTextStripperByArea에게 주어진 지역 변경 만들려면 :

산도가 페이지 높이
Rectangle2D.Float region = new Rectangle2D.Float(x, ph - y - height, width, height); 

:

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

PS : 나는 알고이가이다 아주 오래된 질문이지만, 같은 문제에 직면했을 때 Google이 나를 데려왔다. 그래서 나는 내 대답을 추가 할 것이다.

+0

* "첫 번째 점은 원점이 페이지의 왼쪽 아래 모서리가 될 것으로 기대합니다."* - 더 정확히 말하면 자르기 상자/미디어 상자에서 정의한대로 좌표가 필요합니다. 미디어 박스 *는 종종 왼쪽 하단 모서리에 원점을 가지고 있지만 반드시 그렇지는 않습니다 *. 따라서 일반적인 솔루션은 또한 그에 따라 * x *를 변환합니다. – mkl