C#iTextSharp-将图像从一个图像字段复制到另一个图像字段

C#iTextSharp-将图像从一个图像字段复制到另一个图像字段,c#,.net,image,pdf,itext,C#,.net,Image,Pdf,Itext,我已经创建了两个表单可填充pdf,一个用作客户订单,另一个用作内部生产表。每个pdf都有相同的字段(每个字段的名称和类型相同)。我已经编写了一个应用程序,它使用iTextSharp读取给定客户订单中的所有字段,创建新的生产表,并填写订单中的所有数据。对于文本和日期字段(字符串数据),这一切都很顺利。但是,每个pdf上都有一个图像字段,我需要从订单上的图像字段中获取图像,并将其复制到生产表上的图像字段中。这就是我挂断电话的地方 我可以使用pr.Acrofields.GetFieldItem(“im

我已经创建了两个表单可填充pdf,一个用作客户订单,另一个用作内部生产表。每个pdf都有相同的字段(每个字段的名称和类型相同)。我已经编写了一个应用程序,它使用iTextSharp读取给定客户订单中的所有字段,创建新的生产表,并填写订单中的所有数据。对于文本和日期字段(字符串数据),这一切都很顺利。但是,每个pdf上都有一个图像字段,我需要从订单上的图像字段中获取图像,并将其复制到生产表上的图像字段中。这就是我挂断电话的地方

我可以使用
pr.Acrofields.GetFieldItem(“imageFieldName”)
Acrofields.item
对象的形式获取图像,但我似乎无法使用类似于
PdfStamper.Acrofields.SetField()
的方法将其放入图像字段,因为它只需要一个字符串


是否有办法获取该图像数据并将其存储为临时的.jpg或.bmp文件,然后将其插入生产工作表的图像字段?还是我完全错了?

正如在评论中所说,pdf格式没有任何图像字段。一些pdf设计人员允许使用按钮和一些javascript来模拟它们。但由于该字段只是模拟的,因此没有图像价值。你的两份文件确实如此

因此,要从源表单按钮检索图像,我们不能获取按钮值,而是必须从按钮外观提取图像。我们使用itext解析器名称空间类和收集位图图像的自定义
ImageRenderListener
render listener类来实现这一点

要将图像设置为目标表单按钮,此外,我们也不能简单地设置按钮值,而必须设置按钮外观。我们使用iText
AcroFields
方法
GetNewPushbuttonFromField
ReplacePushbuttonField
来实现这一点

ImageRenderListener
render侦听器类 此渲染侦听器所做的全部工作是收集位图图像:

public class ImageRenderListener : IRenderListener
{
    public List<System.Drawing.Image> Images = new List<System.Drawing.Image>();

    public void BeginTextBlock()
    { }

    public void EndTextBlock()
    { }

    public void RenderText(TextRenderInfo renderInfo)
    { }

    public void RenderImage(ImageRenderInfo renderInfo)
    {
        PdfImageObject imageObject = renderInfo.GetImage();
        if (imageObject == null)
        {
            Console.WriteLine("Image {0} could not be read.", renderInfo.GetRef().Number);
        }
        else
        {
            Images.Add(imageObject.GetDrawingImage());
        }
    }
}
一个例子 我使用AdobeAcrobatReader在源文档中填充了一个图像

并将此文档保存为
客户订单Willi.pdf

然后我应用了上面的复制方法:

String source = @"Customer Order Form-Willi.pdf";
String dest = @"Production Sheet.pdf";
String target = @"Production Sheet-withImage.pdf";

using (PdfReader sourceReader = new PdfReader(source))
using (PdfReader destReader = new PdfReader(dest))
using (PdfStamper targetStamper = new PdfStamper(destReader, File.Create(target), (char)0, true))
{
    Copy(sourceReader, "proofImage", targetStamper, "proofImage");
}
结果显示在带有image.pdf的
生产表中:

一些警告的话
上面的代码非常乐观,不包含合理性检查。对于生产,您应该明确地使其更具防御性,并检查
null
值、空列表等。

pdf格式没有任何图像字段。一些pdf设计人员允许使用按钮和一些javascript来模拟它们。但由于该字段只是模拟的,因此没有图像价值。尽管如此,复制图像数据还是有可能的。你能分享示例pdf来检查实现吗?这里有一个指向我正在使用的2个pdf文件的链接:我认为将pdf转换为位图会更容易,然后你可以从图像中剪切特定坐标并使用它们。虽然“.net pdf to bmp”有点麻烦,但很多库旁边都写有免费*的内容:P@DerekGlissman我没有访问这些文件的权限。@mkl抱歉;我只在内部共享了它。现在已经公开了,太棒了!谢谢你令人难以置信的详尽回答。这将是一个巨大的帮助,并帮助我了解pdf和iTextSharp的工作原理。
String source = @"Customer Order Form-Willi.pdf";
String dest = @"Production Sheet.pdf";
String target = @"Production Sheet-withImage.pdf";

using (PdfReader sourceReader = new PdfReader(source))
using (PdfReader destReader = new PdfReader(dest))
using (PdfStamper targetStamper = new PdfStamper(destReader, File.Create(target), (char)0, true))
{
    Copy(sourceReader, "proofImage", targetStamper, "proofImage");
}