我们有一个 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/