我想要获取2个pdf文件并将它们合并在一起。
每个文件长一页。合并它们的原因是一个文件只是一个页脚。页脚需要附加到现有文件。
我正在使用压模尝试合并2个文件。
我成功创建了输出文件,但它没有页脚。它只是原始输入文件的副本。知道为什么他们不合并吗?
using (Stream inputPdfStream = new FileStream(inputFile, FileMode.Open, FileAccess.Read, FileShare.Read))
using (Stream inputPdfFooterStream = new FileStream(footerPdf, FileMode.Open, FileAccess.Read, FileShare.Read))
using (Stream outputPdfStream = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None))
{
var reader = new PdfReader(inputPdfStream);
var stamper = new PdfStamper(reader, outputPdfStream);
var pdfContentByte = stamper.GetOverContent(1);
stamper.FormFlattening = true;
stamper.Close();
}
答案 0 :(得分:2)
您的问题存在不同的问题。
问题#1:为什么要添加第stamper.FormFlattening = true;
行?你在使用表格吗?我没有看到你对表格做任何事情,那你为什么要压扁文件呢?
问题#2:您说您希望合并两个文档PdfStamper
。这是误导。 合并文档是使用PdfCopy
完成的。根据您的解释,我收集您想要叠加两个文档。你是正确的,你需要PdfStamper
这样做。
问题3:您希望将包含页脚的特定文档用作公司信纸。在这种情况下,您要在下添加实际内容的文具的内容。那你为什么要用stamper.GetOverContent(1);
?请改用stamper.GetUnderContent(1);
。
问题#4:您正在创建inputPdfFooterStream
以使用页脚阅读文档,但我不会在任何地方看到您使用该流。你期待什么?
问题5:您没有阅读文档。这是你的主要问题。下载chapter 6 of my book(它是免费提供的,我在StackOverflow上的几十个答案中都提到了它)。转到第176页,其中显示"将公司信纸添加到现有文档"。该示例完全符合您的要求!
// Create readers
PdfReader reader = new PdfReader(src);
PdfReader s_reader = new PdfReader(stationery);
using (MemoryStream ms = new MemoryStream()) {
// Create the stamper
using (PdfStamper stamper = new PdfStamper(reader, ms)) {
// Add the stationery to each page
PdfImportedPage page = stamper.GetImportedPage(s_reader, 1);
int n = reader.NumberOfPages;
PdfContentByte background;
for (int i = 1; i <= n; i++) {
background = stamper.GetUnderContent(i);
background.AddTemplate(page, 0, 0);
}
}
return ms.ToArray();
}
在您的代码中,您只有一个阅读器。在我的代码中,我还有一个名为s_reader
的对象,它使用footerPdf
文档并允许您创建PdfImportedPage
:
PdfImportedPage page = stamper.GetImportedPage(s_reader, 1);
然后在实际文档的现有内容下添加此页面:
background = stamper.GetUnderContent(i);
background.AddTemplate(page, 0, 0);
请注意,此示例假定两个文档具有相同的页面大小,并且具有实际内容的文档的坐标系的原点与左下角重合。如果您的PDF不是这种情况,则可能会出现页脚不可见或仅部分可见的情况。另外:如果具有实际内容的文档是不透明的,它也会使页脚不可见。