从itext5移到itext7:如何替换pdf中的某个图像?

时间:2017-01-23 10:12:25

标签: c# itext itext7

我只是在评估iText7是否需要编写一个关于在pdf文件中添加/替换图像水印的小工具。

我可以使用官方网站上的示例来处理添加部分,但我很担心删除/替换我添加的图像。

这里有一篇类似的帖子:https://stackoverflow.com/a/4308500

但是我无法将其改编为itext7 .. API似乎已经发生了很大变化,官方文档也没有太大帮助(或者我找不到合适的位置)

基本上我需要从pdf后面找到我自己添加的图像,这意味着要通过ID来识别它,我可以在添加OR时通过它通过它的高度/宽度识别它(这对我们来说足够独特) 。

非常欢迎任何帮助!

更新

添加水印的代码(有趣的可能是如何标记图像以便以后更容易找到它,但一般来说这已经很好了):

var reader = new PdfReader($"c:\\testconv\\test.pdf");
PdfDocument pdfDoc = new PdfDocument(reader, new PdfWriter($"c:\\testconv\\test+watermark.pdf"));

Rectangle pageSize;
PdfCanvas canvas;
int n = pdfDoc.GetNumberOfPages();

iText.IO.Image.ImageData myImageData = ImageDataFactory.Create($"c:\\testconv\\label@0,25x.jpg");

var height = 0.45f/2.54f*72f;
for (int i = 1; i <= n; i++)
{
    var page = pdfDoc.GetPage(i);
    pageSize = page.GetPageSizeWithRotation();
    var top =  1.2f/2.54f*72f - height;
    var left = pageSize.GetWidth() - myImageData.GetWidth() / myImageData.GetHeight() * height - 1.2f / 2.54f * 72f;
    canvas = new PdfCanvas(page);
    canvas.AddImage(myImageData, left, top, height, false, false);
}
pdfDoc.Close();

再次找到/删除标签我还没有任何正常工作的代码:

var page = pdfDoc.GetPage(i);
var res = page.GetResources();
var xobj = res.GetResource(PdfName.XObject);

foreach (var xobject in xobj.KeySet())
{
    PdfObject obj = xobj.Get(xobject);
    if (obj.IsIndirect())
    {
        var stream = xobj.GetAsStream(xobject);
        var subtype = stream.GetAsName(PdfName.Subtype);
        if (PdfName.Image.Equals(subtype)) //direct image
        {

        }
        else if (PdfName.Form.Equals(subtype)) // check for nested image?
        {

        }                        
    }
}

我无法弄清楚如何实际查找图像,然后比较它们的属性,以确定要删除的是正确还是错误(例如,通过名称或ID,或宽度/高度等属性)。

0 个答案:

没有答案