pdf - 使用 iText 获取 pdf 文件中元素的坐标

标签 pdf itext birt pdf-manipulation

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

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

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

使用 BIRT 和 iText 可以实现这一点吗

谢谢

最佳答案

如果您愿意稍微作弊,您可以使用一个链接...根据我刚才对他们的文档的深入了解,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

关于pdf - 使用 iText 获取 pdf 文件中元素的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1611210/

相关文章:

java - 如何使用 itext ColumnText 添加 pdf 标题的下划线?我将线宽设置为 100%,但它不起作用

c# - ITextSharp 从 5.3.3.0 升级到 5.5.0.0 合并文件问题 - 文档关闭时已关闭

java - 使用 itext 将图像文件插入 PDF 时找不到文件

grid - 选择显示字段取决于分组值

javascript - 使用 jsPDF 用 JSON 数据填充 PDF

angular - 下载为 PDF 时 Canvas 图表模糊

birt - 无法加载 BIRT 库

eclipse - 无法打开驱动程序 : org. eclipse.birt.report.data.oda.jdbc 的连接

javascript - 检测 pdf 何时在对象标签内完成加载

java - 如何使用 iText 为我的 (pdf-) 文本添加背景颜色以使用 Java 创建它