尝试使用 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
扩展 PdfTemplate
。 PdfTemplate
是用于 Form XObject 的 class。光栅图像存储为称为 Image XObjects 的外部对象。矢量数据(例如 WMF、导入的 PDF 页面、PDF 语法流)存储为 Form XObjects.
您现在有两个不同的选项可以将名为 page
的 PdfTemplate
(或 PdfImportedPage
)添加到文档中。
- 你可以使用
AddTemplate()
方法:writer.DirectContent.AddTemplate(page, x, y);
- 您可以将
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 的情况下制作的。
我想在 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
扩展 PdfTemplate
。 PdfTemplate
是用于 Form XObject 的 class。光栅图像存储为称为 Image XObjects 的外部对象。矢量数据(例如 WMF、导入的 PDF 页面、PDF 语法流)存储为 Form XObjects.
您现在有两个不同的选项可以将名为 page
的 PdfTemplate
(或 PdfImportedPage
)添加到文档中。
- 你可以使用
AddTemplate()
方法:writer.DirectContent.AddTemplate(page, x, y);
- 您可以将
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 的情况下制作的。