我正在使用BIRT报告库创建一个pdf文件。后来我需要对这些文件进行数字签名。我正在使用iText对文档进行数字签名。
我面临的问题是,我需要将签名放在不同报告的不同位置。我已经有了对文档进行数字签名的代码,现在我总是将签名放在每个报告的最后一页的底部。
最终我需要每个报告说出我需要放置签名的位置。然后我将使用iText读取位置,然后将签名放在该位置。
这是否可以实现使用BIRT和iText
由于
答案 0 :(得分:3)
如果你愿意作弊,你可以使用一个链接... 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自定义能力充满信心......尽管坐在上面iText自己。它是一个恰好能够生成PDF的报告生成器......我不应该期望太多。 `
编辑:如果您需要查找特定的URL,您需要查看PDF参考的“12.5.6.5链接注释”部分,可在此处找到: http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf
答案 1 :(得分:1)
我对BIRT一无所知,对iText只有一点熟悉。但也许这有效......
BIRT能否将签名框的轮廓生成为具有给定字段名称的常规表单字段?如果是这样,那么你应该能够: