4 回答
TA贡献1807条经验 获得超9个赞
如果不使用第 3 方库,用 C# 或任何其他语言合并 pdf 并不简单。
我假设您不使用库的要求是大多数免费库、nuget 包都有限制或/并且商业用途需要花钱。
我做了研究,找到了一个名为PdfClown的开源库,带有nuget包,它也适用于 Java。它是免费的,没有限制(如果您愿意,请捐赠)。该库有很多功能。您可以将 2 个或多个文档合并为一个文档。
我提供了一个示例,该示例采用一个包含多个 pdf 文件的文件夹,将其合并并将其保存到同一个或另一个文件夹中。也可以使用 MemoryStream,但我认为在这种情况下没有必要。
代码是自我解释的,这里的关键点是使用SerializationModeEnum.Incremental
:
public static void MergePdf(string srcPath, string destFile)
{
var list = Directory.GetFiles(Path.GetFullPath(srcPath));
if (string.IsNullOrWhiteSpace(srcPath) || string.IsNullOrWhiteSpace(destFile) || list.Length <= 1)
return;
var files = list.Select(File.ReadAllBytes).ToList();
using (var dest = new org.pdfclown.files.File(new org.pdfclown.bytes.Buffer(files[0])))
{
var document = dest.Document;
var builder = new org.pdfclown.tools.PageManager(document);
foreach (var file in files.Skip(1))
{
using (var src = new org.pdfclown.files.File(new org.pdfclown.bytes.Buffer(file)))
{ builder.Add(src.Document); }
}
dest.Save(destFile, SerializationModeEnum.Incremental);
}
}
测试一下
var srcPath = @"C:\temp\pdf\input";
var destFile = @"c:\temp\pdf\output\merged.pdf";
MergePdf(srcPath, destFile);
输入示例
PDF 文档 A 和 PDF 文档 B
输出示例
TA贡献1829条经验 获得超7个赞
这个答案有用:
using (PdfDocument one = PdfReader.Open("pdf 1.pdf", PdfDocumentOpenMode.Import))
using (PdfDocument two = PdfReader.Open("pdf 2.pdf", PdfDocumentOpenMode.Import))
using (PdfDocument outPdf = new PdfDocument())
{
CopyPages(one, outPdf);
CopyPages(two, outPdf);
outPdf.Save("file1and2.pdf");
}
void CopyPages(PdfDocument from, PdfDocument to)
{
for (int i = 0; i < from.PageCount; i++)
{
to.AddPage(from.Pages[i]);
}
}
TA贡献1784条经验 获得超7个赞
PDF 的工作原理并不完全是这样。PDF 是特定格式的结构化文件。您不能只是将一个字节附加到另一个字节并期望结果是有效的文档。
您将必须使用一个能够理解格式并可以为您执行操作的库,或者开发您自己的解决方案。
TA贡献1793条经验 获得超6个赞
PDF 文件不仅仅是文本和图像。在幕后有一个严格的文件格式来描述 PDF 版本、文件中包含的对象以及在哪里可以找到它们等内容。
为了合并 2 个 PDF,您需要操作流。
首先,您需要仅保留其中一个文件的标头。这非常简单,因为它只是第一行。
然后你可以写第一页的正文,然后是第二页。
现在最困难的部分,也可能是说服您使用库的部分,是您必须重新构建外部参照表。外部参照表是一个交叉引用表,它描述了文档的内容,更重要的是在哪里可以找到每个元素。您必须计算第二页的字节偏移量,将其外部参照表中的所有元素移动那么多,然后将其外部参照表添加到第一页。您还需要确保在外部参照表中为分页符创建对象。
完成后,您需要重新构建文档预告片,它告诉应用程序文档的各个部分的位置。
- 4 回答
- 0 关注
- 148 浏览
添加回答
举报