使用iText协调pdf文件中的元素

时间:2009-10-23 03:13:58

标签: pdf itext birt pdf-manipulation

我正在使用BIRT报告库创建一个pdf文件。后来我需要对这些文件进行数字签名。我正在使用iText对文档进行数字签名。

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

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

这是否可以实现使用BIRT和iText

由于

2 个答案:

答案 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能否将签名框的轮廓生成为具有给定字段名称的常规表单字段?如果是这样,那么你应该能够:

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