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

标签 asp.net image templates pdf itext

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

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

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

谢谢

最佳答案

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

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);
}

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

//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();
  ...
}

关于asp.net - 使用 itext (itextsharp) 替换一个 PDF 模板页面上的多个不同图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4302056/

相关文章:

templates - Go模板中不区分大小写的字符串比较

c# - 在 asp.net mvc 中获取用户的 session ID

asp.net - 在哪里可以下载 DLR 的托管 JScript?

linux - 直接成像到 USB 驱动器

c# - 将图像保存到文件

html - 检测图像方向(横向、纵向)以正确打印 XHTML 报告

c++ - 有没有办法限制模板类?

c# - SendGrid 给邮件添加类别

asp.net - 如何以编程方式在 ASP.NET MVC 中的 Razor View 中显示/隐藏区域

c++ - 为什么可变参数模板的模板特化与非可变模板的特化不同?