2017-04-17 5 views
1

안녕하세요.이 코드를 사용하여 PDF에서 구성 요소의 위치를 ​​가져 오는 중입니다. 그러나 필드가있는 경우/다음 fieldAreaArray = null이PDFbox를 사용하여 Radiobutton의 위치를 ​​얻는 방법

COSDictionary fieldDict = field.getCOSObject(); 
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(); 
+1

양식 필드와 그 시각화 즉, 위젯 사이에는 pdfs의 차이가 있음을 알아야합니다. 양식 필드에 시각화가 하나만있는 경우 양식 필드를 모델링하는 pdf 객체와 시각화를 모델링하는 pdf 객체를 단일 객체로 병합 할 수 있습니다. 이러한 병합 된 상황에서만 코드가 작동합니다. 반면 라디오 버튼 양식 필드는 양식 필드가 연결된 모든 라디오 버튼 그룹의 상태를 나타 내기 때문에 하나의 위젯 만 가지는 것은 거의 없습니다. – mkl

+0

@ Tomm23 PDFDebugger로 파일을 보는 것이 가장 좋습니다. "내부 구조 표시"로 변경 한 다음 Root/AcroForm/Fields를 확인하십시오. 위젯을 다시 작성하고 필드를 얻은 다음'getWidgets()'를 호출 한 다음 각 위젯에서 직사각형을 가져옵니다 (직접 메소드가 있습니다). 예를 들어 https://issues.apache.org/jira/browse/PDFBOX-142의 파일에있는 라디오 버튼 (체크 표시와 비슷하지만 실제로는 라디오 버튼)은 9 개의 위젯을 가지고 있습니다 ('Root/AcroForm/Fields/[9]/Kids'. –

+0

@ Tomm23 Tilman과 저의 의견은 도움이 되었습니까? 그렇다면 솔루션을 설명하는 질문에 대한 실제 답변을 만든 경우 유용합니다. 그렇지 않다면 무엇을 구체적으로 이해하지 못했습니까? – mkl

답변

1

필드가 여러 위젯을 가질 수 있습니다 (라디오 버튼 확실히, 질문 아래 MKL하여 설명을 볼 수 있습니다) 다음 위젯 목록이 발견 될 것입니다 라디오 버튼을 입력 키즈 배열이므로 사전을 직접 액세스하는 대신 PDFBox에서 제공하는 방법을 사용하여 편리하게 생활하십시오. 첨부 된 코드는 PDFBOX-142 문제의 파일과 함께 작동합니다. "amt"필드는 체크 표시처럼 보이지만 9 개의 위젯이있는 라디오 버튼 필드입니다. PDFDebugger을 실행하고 "보기"메뉴로 이동 한 다음 "내부 구조 표시"로 변경 한 다음 Root/AcroForm/Fields를 봅니다.

enter image description here

는 프로그래밍 방식으로 사각형을 얻을이 코드를 사용하려면

PDDocument document = PDDocument.load(new URL("https://issues.apache.org/jira/secure/attachment/12742551/Testformular1.pdf").openStream()); 
PDField field = document.getDocumentCatalog().getAcroForm().getField("amt"); 
System.out.println(field.getClass().getSimpleName()); 
for (PDAnnotationWidget widget : field.getWidgets()) 
{ 
    System.out.println(widget.getRectangle()); 
} 
document.close(); 

을 그리고 이것은 출력 :

PDRadioButton 
[177.944,580.3095,190.1991,592.0744] 
[178.8963,350.25168,191.45924,361.8096] 
[535.79285,467.17078,548.0479,478.93567] 
[417.16348,467.17078,429.41858,478.93567] 
[298.04395,466.19037,310.29904,477.95526] 
[177.944,466.19037,190.1991,477.95526] 
[534.81244,581.2899,547.0675,593.0548] 
[417.16348,581.2899,429.41858,593.0548] 
[298.04395,581.2899,310.29904,593.0548] 

PDFDebugger로 파일을 열면이 위치를 확인할 수 있습니다 ("내부 구조 표시"모드에서 이미 열린 상태에서 "보기"메뉴에서 "페이지 표시"선택)하고 렌더링 된 이미지 위로 마우스를 이동하면 좌표가 메인 프레임의 왼쪽 하단에 표시됩니다.