使用 itext (itextsharp) 替换一个 PDF 模板页面上的多个不同图像

2023-11-30

我们有一个 ASP.NET 应用程序,用户可以用它来生成某些报告。到目前为止,我们有一个 PDF 模板,上面有一张图像,我们只需用我们以编程方式生成的图像(图表)替换该图像。
我们使用了该网站的代码:http://blog.rubypdf.com/2007/12/12/how-to-replace-images-in-a-pdf/

现在的问题是,我们在一个 PDF 页面上有两个不同的图像,上面链接中的代码选择一页上的两个图像,并用我们生成的图像一次性替换它们。

有谁知道如何用 itext 替换一页上的多个不同图像?

Thanks


啊。首先,让我重写一些源代码。

PdfReader pdf = new PdfReader("in.pdf");
PdfStamper stp = new PdfStamper(pdf, new FileOutputStream("c:\\out.pdf"));
PdfWriter writer = stp.getWriter();
Image img = Image.getInstance("image.png");
PdfDictionary pg = pdf.getPageN(1);
PdfDictionary res = pg.getAsDict.get(PdfName.RESOURCES);
PdfDictionary xobj = res.getAsDict(PdfName.XOBJECT);
if (xobj != null) {
  for (Iterator<PdfName> it = xobj.getKeys().iterator(); it.hasNext(); ) {
    PdfObject obj = xobj.get(it.next());
    if (obj.isIndirect()) {
      PdfDictionary tg = (PdfDictionary)PdfReader.getPdfObject(obj);
      PdfName type = tg.getAsName(PdfName.SUBTYPE));
      if (PdfName.IMAGE.equals(type)) {
        PdfReader.killIndirect(obj);
        Image maskImage = img.getImageMask();
        if (maskImage != null)
          writer.addDirectImageSimple(maskImage);
        writer.addDirectImageSimple(img, (PRIndirectReference)obj);
        break;
      }
    }
  }
}

呼。这getAs函数可以为您节省大量麻烦,并使您的代码更加清晰。

现在。您需要能够区分各种图像。如果您愿意对事物进行硬编码,您可以找出资源名称并按照该路线进行:

String imageResName[] = {"Img1", "Img2" ... };
Image img[] = {Image.getInstance("foo.png"), Image.getInstance("bar.png"), ... };
for (int i = 0; i < imageResName.length; ++i) {
  PdfName curKey = new PdfName(imageResName[i]);
  PdfIndirectReference ref = xobj.getAsIndirect(curKey);
  PdfReader.killIndirect( ref );
  Image maskImage = img[i].getImageMask();
  if (maskImage != null) {
    writer.addDirectImageSimple(maskImage);
  }
  writer.addDirectImageSimple(img[i], (PRIndirectReference)ref);
}

如果您不愿意使用硬编码的资源名称(并且没有人会责怪您,恰恰相反,特别是当它们出现的顺序(以及末尾的数字)取决于它们在哈希映射中的顺序时...... [颤抖]),您也许可以根据图像的宽度和高度进行区分。

//keep the original for loop, stepping through resource names
if (PdfName.IMAGE.equals(type)) {
  float width = tg.getAsNumber(PdfName.WIDTH).floatValue();
  float height = tg.getAsNumber(PdfName.HEIGHT).floatValue();

  Image img = getImageFromDimensions(width, height);

  Image maskImage = img.getImageMask();
  ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 itext (itextsharp) 替换一个 PDF 模板页面上的多个不同图像 的相关文章

随机推荐

  • FlannBasedMatcher 返回不同的结果

    使用FlannBasedMatcher在 OpenCV 中 我使用相同的参数调用匹配器得到不同的结果 谁能建议我做错了什么 下面的代码显示了我遇到的问题的一个最小示例 它简化了我如何使用FlannBasedMatcher 这不是真正的代码
  • Java 中的访问器方法

    所以我对 setter 和 getter 方法以及它们是否有用有疑问 假设我只编写了一个非常基本的程序 如下所示 public class Account String name String address double balance
  • 具有不同返回类型和参数数量的 Func 委托列表

    我有一个类需要在构造函数中传递不同数量的 Func 委托 这些委托中的每一个都将指向不同的函数 每个函数都有不同的返回类型 并且具有不同数量的参数 双精度类型 然后将相应地调用每个函数 问题 1 现在 为了让使用此类的人更容易 我正在考虑允
  • 如何从 xml 节点查询值?

    我有一个包含 XML 列的表 CREATE TABLE Batches BatchID int RawXml xml 该 xml 包含以下项目
  • 调用未定义的方法 Goutte\Client::setClient()

    我被这个错误困住了 但客户端已定义 我的代码是这样的 use Goutte Client use Illuminate Http Request use GuzzleHttp Client as GuzzleClient class Web
  • 锁屏时如何获取音量键事件?

    Override public boolean dispatchKeyEvent KeyEvent event int action event getAction int keyCode event getKeyCode switch k
  • 协议中的 Swift 协议属性 - 候选者具有不匹配的类型

    我有一个协议 ProtocolA 其中包含符合第二个协议 ProtocolB 的单个属性 public protocol ProtocolA var prop ProtocolB get public protocol ProtocolB
  • 与嵌套的 Flexbox 网格作斗争

    我试图用基于负边距的网格系统 susy 实现类似网格的模式 但失败了 我尝试使用 Flexbox 但我不确定它是否真的可行 我认为最好的方法是 2 列 A 侧和 B 侧 并为框 1 提供框 2 的 50 的伸缩高度 但它不知何故似乎不起作用
  • PHP - 合并两个数组类似于 array_combine,但具有重复的键

    我有两个数组 arrKeys array str str otherStr arrVals array 1 22 1 99 5 17 我想将它们合并成这样的东西 arrResult array array str gt 1 22 array
  • .xaml 和 .xaml.cs 文件之间有什么联系

    对于视图 有相应的 xaml 和 xaml cs 文件 这些文件是如何关联的 我对 xaml 非常陌生 我想我在 xaml 文件中看到了动态占位符 但明确引用了文件作为除相应 cs 文件之外的源 我想我看到了控制器视图行为 其中用户交互触发
  • 如何在 VB.NET 中为以编程方式创建的对象创建事件处理程序?

    假设我有一个动态创建的对象 例如 假设我创建一个名为 MyButton 的按钮 Dim MyButton as New Button MyButton Name MyButton 例如 如何创建 点击 事件 如果它是静态创建的 我可以创建一
  • 匹配可迭代类型(带有 begin()/end() 的数组和类)[重复]

    这个问题在这里已经有答案了 我编写了类型特征 例如可以用来测试给定类型是否 可迭代 的类 这对于数组来说是正确的 对于T N 不是为了T 并且对于具有begin and an end返回看起来像迭代器的东西的方法 我想知道是否可以比我做的更
  • 如何使用 json 库解析嵌套的 JSON 对象?

    我想使用 json 库解析 json 对象 batters batter id 1001 type Regular id 1002 type Chocolate id 1003 type Blueberry id 1004 type Dev
  • 有没有办法在 R 图中对齐 2 个独立轴?

    我正在绘制具有不同轴的图表 问题是我希望两个轴交叉一个点 其余的并不重要 是否可以 这是一个可重现的代码 plot x 10 10 y 10 10 abline v 0 lty 2 par new TRUE plot x 10 50 y s
  • 无法运行从 Scala 文件创建的 jar 文件

    这是我用 Scala 编写的代码 object Main extends App println Hello World from Scala 这是我的构建 sbt name hello world version 1 0 scalaVer
  • VB.NET 中通过后期绑定实现的多态性不允许使用事件,有解决方法吗?

    我正在开发一个与一系列 USB 传感器通信的应用程序 我创建了一个使用名为 Sensor 的类的基本实现 该类包含允许与传感器交互的事件和方法 还涉及一个线程任务处理器 但我将举一个简单的示例 我的问题是 这个简单的概念验证示例运行良好 但
  • 在 Android 手机中启动图库

    当用户单击通知时 我试图从我的应用程序启动图库 我发现只有当您知道 Gallery 应用程序的包和类名时才有可能 我已经成功地为四家设备制造商找到了相同的内容 到目前为止 该代码有效 我只需要 Motorola 和 LG Android 手
  • 需要帮助在 tomcat 中调试 SSL 握手

    我有一个非常奇怪的问题并正在寻找一些提示 我有一个由客户端发送的证书 我需要安装该证书才能访问 HTTPS Web 服务 Windows 和 Linux 操作系统中均已安装证书 使用 keytool 命令 keytool import al
  • EDMX .NET 4.5 到 4.0?

    我们使用实体框架 并在项目设置为构建 NET 4 5 时创建了 EDMX 现在我们想要切换到 NET 4 0 但是当我们这样做时 我们会收到 EDMX 文件的编译错误 它指出以下错误 Error 10027 The XML namespac
  • 使用 itext (itextsharp) 替换一个 PDF 模板页面上的多个不同图像

    我们有一个 ASP NET 应用程序 用户可以用它来生成某些报告 到目前为止 我们有一个 PDF 模板 上面有一张图像 我们只需用我们以编程方式生成的图像 图表 替换该图像 我们使用了该网站的代码 http blog rubypdf com