我有一个现有的PDF,我可以使用FdFWriter输入文本框。它运作良好。现在我有了一张图片。我已阅读文档并查看了许多示例,但它们都创建了新文档并插入了图像。我想拍摄现有的PDF并将图像插入图像字段或按钮的图标图像。我试过但它破坏了文件。
我需要能够获取现有文档并在其上放置图像。我不想打开,阅读,替换和删除原始文件。此原始更改和名称“原始”仅表示此上下文中的源文件。像这样的许多PDF文件都需要图像。
感谢您的帮助。
编辑 - 我非常感谢下面的代码。它工作得很好,但对我来说问题是现有的PDF上有数字签名。当像这样复制文档(到result.pdf)时,这些签名虽然仍然存在,但具有不同的字节数或其他已损坏的项。这意味着签名虽然出现在result.pdf上,但旁边有一个图标,表示“无效签名”。
如果重要,我使用Topaz签名板创建我的签名,这有自己的安全性。仅仅复制PDF不会破坏它,但下面的过程将会。
我试图将图像放在现有文档上,而不是它的副本,在这种情况下很重要。
另外,签名是指手写,而不是密码。
再次感谢你。
编辑 - 可以使用PdfSignatureAppearance吗?
编辑 - 我似乎能够做到:
var stamper = new PdfStamper(reader,outputPdfStream,'1',true);
答案 0 :(得分:66)
如果要更改现有PDF文件的内容并添加额外内容(如水印,页面编号,额外标题),PdfStamper是您需要的对象。我已成功使用以下代码将图像插入到现有pdf文件中的给定绝对位置:
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
class Program
{
static void Main(string[] args)
{
using (Stream inputPdfStream = new FileStream("input.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
using (Stream inputImageStream = new FileStream("some_image.jpg", FileMode.Open, FileAccess.Read, FileShare.Read))
using (Stream outputPdfStream = new FileStream("result.pdf", FileMode.Create, FileAccess.Write, FileShare.None))
{
var reader = new PdfReader(inputPdfStream);
var stamper = new PdfStamper(reader, outputPdfStream);
var pdfContentByte = stamper.GetOverContent(1);
Image image = Image.GetInstance(inputImageStream);
image.SetAbsolutePosition(100, 100);
pdfContentByte.AddImage(image);
stamper.Close();
}
}
}
插入图像时,您可以调整图像大小。您可以在iTextSharp文档中查看transformation matrix。
答案 1 :(得分:1)
这是一个类似的例子,它使用压模在页面上插入图像:
答案 2 :(得分:1)
我可以通过在我的签名代码中添加以下行来添加图像来解决我的问题
var image = iTextSharp.text.Image.GetInstance(@"C:\Users\sushil\Documents\sansign.jpg");
appearance.Acro6Layers = true;
appearance.SignatureGraphic = image;
appearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.GRAPHIC_AND_DESCRIPTION;
当我签署带有可见数字签名的文档时,现在我可以同时拥有图像和数字签名属性
答案 3 :(得分:-1)
pdftk可以做到这一点。它不是一个库,但您可以从代码中轻松地将其称为.exe。
请参阅stamp
和background
命令:
http://www.pdflabs.com/docs/pdftk-man-page/