嗨,我一直在将多个 PDF 表单合并为一个表单。 我尝试使用 PDFSharp 来完成此操作,但它无法打开只读 pdf 表单。我已经用 pdfsharp 和他的不道德阅读参数进行了测试,它完成了一些工作。它合并 PDF,但删除表单内容...(遗憾的是我已经失去了填写它的时间...)
这是我的代码的一些部分,也许它只是一个我没有考虑到的缺失参数......
private void MergePDFs(string outPutFilePath, params string[] filesPath)
{
List<PdfReader> readerList = new List<PdfReader>();
foreach (string filePath in filesPath)
{
PdfReader pdfReader = new PdfReader(filePath);
PdfReader.unethicalreading = true;
readerList.Add(pdfReader);
}
Document document = new Document(PageSize.A4, 0, 0, 0, 0);
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outPutFilePath, FileMode.Create));
document.Open();
foreach (PdfReader reader in readerList)
{
for (int i = 1; i <= reader.NumberOfPages; i++)
{
PdfImportedPage page = writer.GetImportedPage(reader, i);
document.Add(iTextSharp.text.Image.GetInstance(page));
}
}
document.Close();
}
因此,如果有人知道如何合并“修改保护”PDF 表单,我已准备好对其进行测试!
编辑: 在对非受保护的 PDF 表单进行一些其他测试后,这似乎不是一个保护问题。我的 MergePDFs 不使用表单内容。
所以任务仍然是“在 C# 上合并多个 PDF 表单”
EDIT2:这是我要合并的 2 个文件。一种受修改保护,另一种则不受保护。两个都满了。 https://drop.infini.fr/r/XFt_Sd8gFc#7thQxyjeGdo8uIkXN6oys82KLB8VE0AHmflb0uYRkVM= https://drop.infini.fr/r/NUa2n2No0R#FaOAGyzk0SrTDtB6CiXUhF7WEKw0EHGHHM7gaKz20o4=
感谢评论中的@mkl,我找到了解决方案。
private void Merge2PDFs(string outPutFilePath, params string[] filesPath)
{
byte[] mergedPdf = null;
using (FileStream fs = new FileStream(outPutFilePath, FileMode.OpenOrCreate))
{
using (MemoryStream ms = new MemoryStream())
{
using (Document PDFdocument = new Document())
{
using (PdfCopy copy = new PdfCopy(PDFdocument, ms))
{
PDFdocument.Open();
foreach (string filePath in filesPath)
{
PdfReader reader = new PdfReader(filePath);
PdfReader.unethicalreading = true;
// loop over the pages in that document
int n = reader.NumberOfPages;
for (int page = 0; page < n;)
{
copy.AddPage(copy.GetImportedPage(reader, ++page));
}
}
}
}
mergedPdf = ms.ToArray();
fs.Write(mergedPdf, 0, mergedPdf.Length);
fs.Close();
}
}
}
实际上,我的第一个方法仅复制基本文档,而不复制表单内容。
SautinSoft.Pdf 库 提供以下解决方案。该库中的拆分和合并方法是完全免费,甚至用于商业用途。
using SautinSoft.Pdf;
using SautinSoft.Pdf.Facades;
var inpFiles = new List<string>() {"1.pdf", "2.pdf", "3.pdf"};
string outFile = @"Merged.pdf";
var merger = new PdfMerger();
foreach (var inpFile in inpFiles)
merger.Append(inpFile);
merger.Save(outFile);
这是更全面的示例: https://sautinsoft.com/products/pdf/help/net/developer-guide/merge-pdf-files.php.
免责声明:我是 SautinSoft.Pdf 库的共同作者。