2009-10-23 34 views
2

我使用BIRT报告库创建pdf文件。后来我需要对这些文件进行数字签名。我正在使用iText对文档进行数字签名。使用iText的pdf文件中元素的坐标

我面临的问题是,我需要将签名放在不同报告中的不同位置。我已经有了数字签名文件的代码,现在我总是将签名放在每个报告最后一页的底部。

最终我需要每个报告来说明我需要放置签名的位置。然后,我必须使用iText读取位置,然后将签名放在该位置。

这可能使用BIRT和iText的

感谢

+0

这请求听起来不太漂亮。你想要做什么呢? –

+0

为什么不使用签名表单字段来指定签名位置? – JonMR

+0

pdf文件是使用BIRT报告工具创建的。我怎样才能做到这一点? –

回答

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 ...我不应该期望太多。 `

编辑:如果您需要寻找特定的网址,你会想看看部分PDF参考的“12.5.6.5链接注释”,它可以在这里找到: http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf

1

我不知道什么BIRT,并且只有与iText的一点点的熟悉来实现。但也许这工作...

BIRT可以生成签名框的轮廓作为一个具有给定字段名称的常规表单字段吗?如果是这样,那么你应该能够:

  1. 在iText的AcroFields哈希映射中使用getField查找该字段的名称;
  2. 使用pdf压模创建一个新签名,并根据旧字段对象的值设置其几何图形;和
  3. 使用removeField删除旧字段。
+0

感谢您的建议,让我检查BIRT是否可以将表单字段添加到PDF中。 –