itext를 사용하여 PDF 파일의 요소 코디네스
-
05-07-2019 - |
문제
PDF 파일을 사용하고 있습니다 버트 보고 도서관. 나중에이 파일에 디지털로 서명해야합니다. 사용 중입니다 itext 문서에 디지털로 서명합니다.
내가 직면 한 문제는 다른 보고서에 다른 장소에 서명을 배치해야한다는 것입니다. 이미 문서에 디지털로 서명 할 코드가 있습니다. 이제 모든 보고서의 마지막 페이지 하단에 서명을 배치하고 있습니다.
결국 서명을 어디에 배치 해야하는지 말하려면 각 보고서가 필요합니다. 그런 다음 itext를 사용하여 위치를 읽은 다음 해당 위치에 서명을 놓습니다.
Birt 및 ITEXT를 사용하여 달성 할 수 있습니다
감사
해결책
당신이 조금 기꺼이 속이고 싶다면, 당신은 링크를 사용할 수 있습니다 ... birt가 지금 그들의 문서에 대한 내 작은 다이빙에 따라 Birt가 지원하는 링크를 사용할 수 있습니다.
링크는 주석입니다. 안타깝게도 ITEXT는 높은 수준의 주석 검사를 지원하지 않으며이를 생성하므로 저수준 객체 호출을 사용해야합니다.
추출하는 코드는 다음과 같습니다.
// getPageN is looking for a page number, not a page index
PdfDictionary lastPageDict = myReader.getPageN(myReader.getNumberOfPages());
PdfArray annotations = lastPageDict.getAsArray( PdfName.ANNOTS );
PdfArray linkRect = null;
if (annotations != null) {
int numAnnots = annotations.size();
for (int i = 0; i < numAnnots; ++i) {
PdfDictionary annotDict = annotations.getAsDict( i );
if (annotDict == null)
continue; // it'll never happen, unless you're dealing with a Really Messed Up PDF.
if (PdfName.LINK.equals( annotDict.getAsName( PdfName.SUBTYPE ) )) {
// if this isn't the only link on the last page, you'll have to check the URL, which
// is a tad more work.
linkRect = annotDict.getAsArray( PdfName.RECT );
// a little sanity check here wouldn't hurt, but I have yet to come across a PDF
// that was THAT screwed up, and I've seen some Really Messed Up PDFs over the years.
// and kill the link, it's just there for a placeholder anyway.
// iText doesn't maintain any extra info on links, so no need for other calls.
annotations.remove( i );
break;
}
}
}
if (linkRect != null) {
// linkRect is an array, thusly: [ llx, lly, urx, ury ].
// you could use floats instead, but I wouldn't go with integers.
double llx = linkRect.getAsNumber( 0 ).getDoubleValue();
double lly = linkRect.getAsNumber( 1 ).getDoubleValue();
double urx = linkRect.getAsNumber( 2 ).getDoubleValue();
double ury = linkRect.getAsNumber( 3 ).getDoubleValue();
// make your signature
magic();
}
BIRT가 시각적 표현을 위해 링크 아래 페이지 내용에서 일부 텍스트를 생성하는 경우 이는 사소한 문제 일뿐입니다. 귀하의 서명은 완전히 다루어야합니다.
처음에 Birt에서 직접 서명을 생성 할 수 있는지 확실히 더 낫지 만, 문서에 대한 작은 검사는 PDF 사용자 정의 능력에 대한 자신감으로 정확하게 채우지 못했습니다. . PDF를 생산할 수있는 보고서 생성기입니다. ~도 많이. `
편집 : 특정 URL을 찾아야하는 경우 PDF 참조의 "12.5.6.5 링크 주석"섹션을 살펴 보려면 여기에서 찾을 수 있습니다.http://www.adobe.com/content/dam/adobe/en/devnet/pdf/pdfs/pdf32000.pdf
다른 팁
나는 Birt에 대해 아무것도 모르고 ITEXT에 대해 약간의 친숙 함을 가지고 있습니다. 하지만 아마도 이것은 작동합니다 ...
Birt는 주어진 필드 이름을 가진 정규 양식 필드로 서명 상자의 개요를 생성 할 수 있습니까? 그렇다면 다음을 수행 할 수 있어야합니다.
- getfield를 사용하여 itext의 acrofields hashmap에서 이름으로 해당 필드를 조회하십시오.
- PDF 스탬퍼를 사용하여 새 서명을 만들고 이전 필드 객체의 값을 기반으로 지오메트리를 설정하십시오. 그리고
- removefield를 사용하여 이전 필드를 삭제하십시오.