Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在尝试使用iTextSharp添加PDF戳记;字节数组不是可识别的imageformat“;_C#_Pdf_Itextsharp - Fatal编程技术网

C# 正在尝试使用iTextSharp添加PDF戳记;字节数组不是可识别的imageformat“;

C# 正在尝试使用iTextSharp添加PDF戳记;字节数组不是可识别的imageformat“;,c#,pdf,itextsharp,C#,Pdf,Itextsharp,我想在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

我想在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.

更新:看看,我发现它可以与GIF、TIFF、JPEG、PNG、WMF和BMP一起使用,但不能与PDF一起使用。所以我想我需要想出另一种方法来使用PDF作为图像。有什么想法吗?

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

PDF文档可以通过
PdfReader
对象读取:

PdfReader reader = new PdfReader(src);
PdfImportedPage page = writer.GetImportedPage(reader, 1);
您可以使用
PdfImportedPage
对象重用正在读取的PDF中的页面:

PdfReader reader = new PdfReader(src);
PdfImportedPage page = writer.GetImportedPage(reader, 1);
在上面的一行中,
writer
是您正在创建的文档的
PdfWriter
实例。
GetImportedPage
方法将
page
所需的资源复制到新文件中。资源可以是字体、图像等

PdfImportedPage
扩展了
PdfTemplate
PdfTemplate
是用于表单XObject的类。光栅图像存储为称为图像XObject的外部对象。矢量数据(例如WMF、导入的PDF页面、PDF语法流)存储为表单XObject

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

  • 您可以使用
    AddTemplate()
    方法:
    writer.DirectContent.AddTemplate(第页,x,y)
  • 您可以将
    PdfTemplate
    包装在
    Image
    对象中:
    iTextSharp.text.Image Img=iTextSharp.text.Image.GetInstance(第页)
  • 请注意,无论选择哪个选项,PDF都不会转换为光栅图像。它将作为矢量数据添加

    更新:

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

    • pdfStamper.GetImportedPage(读取器,1)
    • pdfStamper.GetOverContent(页码).AddTemplate(第x、y页)

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

    您看到的不是iTextSharp的官方来源,而是fork的官方来源。官方来源可在以下网址找到:。另外,您使用的版本已经有几年的历史了。这确实使我能够添加PDF,但我确实希望将其添加为普通戳记,以便可以选择、拖动页面并删除它。使用
    AddTemplate()
    似乎将其添加为静态内容——我是否遗漏了什么?您可以将模板用作戳记批注的外观。如果这对你不起作用,请告诉我。请看,我遵循的是itextpdf.com示例,但是
    app.AddImage(stampImg)
    引发了异常:
    图像必须具有绝对位置。
    没关系,忘记了
    SetAbsolutePosition(0,0)
    调用。很好!