【问题标题】:Merging several PDF forms on C#在 C# 上合并几个 PDF 表单
【发布时间】:2020-12-27 04:25:58
【问题描述】:

嘿,我坚持将多个 PDF 表单合并到一个表单中。 我尝试用 PDFSharp 来做,但它无法打开只读的 pdf 表单。我已经用 pdfsharp 和他的 unethicalreading 参数进行了测试,它完成了一些工作。它合并 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 表单进行了一些其他测试后,它似乎不是保护问题。我的 MergePDF 不使用表单内容。

所以任务还是“在 C# 上合并几个 PDF 表单”

EDIT2:这是我要合并的 2 个文件。一个是修改保护的,一个不是。两个都满了。 https://drop.infini.fr/r/XFt_Sd8gFc#7thQxyjeGdo8uIkXN6oys82KLB8VE0AHmflb0uYRkVM= https://drop.infini.fr/r/NUa2n2No0R#FaOAGyzk0SrTDtB6CiXUhF7WEKw0EHGHHM7gaKz20o4=

【问题讨论】:

  • 也许您无法阅读它的原因是因为它受到保护,因此您不应该被允许做您正在做的事情?你基本上是在试图伪造一个受保护的文件,所以在某些方面我很高兴它不起作用。
  • 您确定该 pdf 文件只是“只读”且不受 drm 保护吗?
  • PDF 受到保护,不能修改,不能填写表格。我可以手动填写表格并使用 itextsharp 并保存它而不会出现问题。当我尝试将这个与另一个合并时,受保护的内容正在合并,但不是表单内容。
  • 在非受保护表单上进行了一些其他测试后,内容未与合并一起出现。所以这不是保护问题。
  • 您的 PDF 不是 XFA 表格。但我只是仔细查看了您提供的代码,发现您使用了基于 PdfWriter/GetImportedPage/Image.GetInstance 的方法。 iText 开发人员通常不建议使用这种方法,因为它明确忽略了页面的静态内容以外的所有内容,特别是它会丢弃注释并且您的表单字段小部件是注释。您应该改用基于PdfCopy 的解决方案,请参阅this answer(其中的链接可能已变为非活动状态,但代码仍然显示该想法)。

标签: c# pdf itext


【解决方案1】:

感谢 cmets 中的 @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();
                }
            }
        }

实际上,我的第一个方法只复制基本文档而不是表单内容。

this post for more information

【讨论】:

    猜你喜欢
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多