尝试使用 iTextSharp 添加 PDF 图章,"The byte array is not a recognized imageformat"

Trying to add a PDF stamp using iTextSharp, "The byte array is not a recognized imageformat"

我想在 PDF 中添加图章,图章文件本身就是一个 PDF。这是我的代码:

void addImage(string inputPath,string imagePath,string outputPath,int pageNumber)
{ 
    Stream inputImageStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read, FileShare.Read);
    PdfReader pdfReader = new PdfReader(inputPath);
    PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(outputPath, FileMode.Create));
    PdfContentByte pdfContentByte = pdfStamper.GetOverContent(pageNumber);
    iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(inputImageStream);
    image.SetAbsolutePosition(100, 100);
    pdfContentByte.AddImage(image);
}

void addImageTest()
{
    string sourceFile = @"C:\somefolder\source.pdf";
    string stampFile = @"C:\somefolder\stamp.pdf";
    string destFile = @"C:\somefolder\destination.pdf";
    addImage(sourceFile, stampFile, destFile, 1);
    return;
}

在调用 GetInstance() 时,我得到了这个异常:

The byte array is not a recognized imageformat.

更新:查看 the source code for GetInstance(),我发现它适用于 GIF、TIFF、JPEG、PNG、WMF 和 BMP,但不适用于 PDF。所以我想我需要想出另一种方法来将 PDF 用作图像。有什么想法吗?

PDF 是一种文档格式,而不是图像格式,因此 Image.GetInstance() 不接受 PDF 字节。这并不意味着没有解决方法。

PDF 文档可以被 PdfReader 对象读取:

PdfReader reader = new PdfReader(src);

您可以使用 PdfImportedPage 对象重用正在阅读的 PDF 中的页面:

PdfImportedPage page = writer.GetImportedPage(reader, 1);

在上面的行中,writer 是您正在创建的文档的 PdfWriter 实例。 GetImportedPage 方法将 page 所需的资源复制到新文件。资源可以是字体、图像...

PdfImportedPage 扩展 PdfTemplatePdfTemplate 是用于 Form XObject 的 class。光栅图像存储为称为 Image XObjects 的外部对象。矢量数据(例如 WMF、导入的 PDF 页面、PDF 语法流)存储为 Form XObjects.

您现在有两个不同的选项可以将名为 pagePdfTemplate(或 PdfImportedPage)添加到文档中。

  1. 你可以使用AddTemplate()方法:writer.DirectContent.AddTemplate(page, x, y);
  2. 您可以将 PdfTemplate 包装在 Image 对象中:iTextSharp.text.Image Img = iTextSharp.text.Image.GetInstance(page);

请注意,无论您选择哪个选项,PDF 都不会转换为光栅图像。它将作为矢量数据添加。

更新:

在你的情况下,你必须像这样替换 writer

  • pdfStamper.GetImportedPage(reader, 1);
  • pdfStamper.GetOverContent(pageNumber).AddTemplate(page, x, y);

我的示例是在您从头开始创建 PDF 的情况下制作的。