【问题标题】:Create PDF by copying it from template with PdfCopy (lost of data)通过使用 PdfCopy 从模板复制来创建 PDF(丢失数据)
【发布时间】:2014-08-29 14:13:32
【问题描述】:

我正在尝试使用 PdfCopy 基于另一个文件创建一个新的 pdf 文件。 生成过程中一切正常,生成的文件可以在我的桌面上毫无问题地打开,但文件似乎已损坏并且我必须使用的服务不接受:

调用“sign”时出现SignService错误,可能是文件格式错误。

我注意到生成的 pdf 总是比原始模板轻,所以我将模板版本与生成的版本进行了比较。丢失数据有一些很大的部分,尤其是一大堆 xml。我猜 PdfCopy 不会复制我的每一个原始 pdf,但我不知道我错过了什么。

这是我的方法:

byte[] completedDocument = null;
string originalUri = Path.Combine(this.PdfPath, pdfName);
string generatedUri = Path.Combine(this.PdfGeneratedPath, generatedPdfName);

        using(MemoryStream streamCompleted = new MemoryStream())
        {
            using(Document doc = new Document())
            {
                PdfCopy copy = new PdfCopy(doc, streamCompleted);

                copy.PdfVersion = PdfWriter.VERSION_1_6;
                doc.Open();
                copy.Open();

                byte[] mergedDocument = null;
                PdfReader pdfReader = new PdfReader(originalUri);
                int pdfPageNumber = pdfReader.NumberOfPages;

                using(MemoryStream streamTemplate = new MemoryStream())
                {
                    using (PdfStamper pdfStamper = new PdfStamper(pdfReader, streamTemplate))
                    {
                        AcroFields acrofields = pdfStamper.AcroFields;

                        foreach (KeyValuePair<string, AcroFields.Item> field in acrofields.Fields)
                        {
                            string data;
                            if (pdfFieldsValues.TryGetValue(field.Key, out data))
                            {
                                if (data == null)
                                {
                                    data = string.Empty;
                                }

                                acrofields.SetField(field.Key, data);
                            }
                        }

                        pdfStamper.FormFlattening = true;
                        pdfStamper.Writer.CloseStream = false;
                    }

                    mergedDocument = streamTemplate.ToArray();
                }

                pdfReader = new PdfReader(mergedDocument);

                for (int page = 1; page <= pdfPageNumber; page++)
                {
                    if (!excludedPages.Any(s => s == page))
                    {
                        copy.AddPage(copy.GetImportedPage(pdfReader, page));
                    }
                }

                doc.Close();
                copy.Close();
            }

            completedDocument = streamCompleted.ToArray();
        }

        File.WriteAllBytes(generatedUri, completedDocument);

我尝试上传“mergedDocument”而不是“completedDocument”并且我的服务接受它,所以我很确定它与这部分有关:

for (int page = 1; page <= pdfPageNumber; page++)
{
    if (!excludedPages.Any(s => s == page))
    {
        copy.AddPage(copy.GetImportedPage(pdfReader, page));
    }
}

或 pdfCopy 初始化

【问题讨论】:

  • 与其创建新文档并仅导入您想要的页面,您是否可以尝试只删除您不想要的页面? stackoverflow.com/a/8751668/231316
  • 我必须使用的服务 - 请说明该服务对 PDF 文件的要求。如果没有,请询​​问服务提供商导致错误的原因。
  • 请不要编辑您的帖子以“添加解决方案”,这违反了 Stack Overflow 的政策和意图。 (您可能不知道,因为您在注册时没有阅读介绍性教程......)只需添加您的解决方案作为答案。

标签: c# pdf copy itextsharp


【解决方案1】:

你从一个表格开始。您填写表格并将其展平。通过将其展平,您故意抛弃了所有交互性。我很惊讶您对文件越来越小感到惊讶:您正在丢弃表单基础架构!

然后,您将平面文件上传到我们不知道的某个服务。该服务抱怨:

调用“sign”时出现SignService错误,可能是文件格式错误。

由于我们不知道您说的是哪种服务,我们只能猜测。有根据的猜测是原始表单包含需要由签名服务签名的签名字段。

显然该字段已消失:您将表单展平!我可能错了,但我认为该服务也会尝试读取您填写的字段,但这也不可能当您抛弃所有交互性时。请删除以下行:

pdfStamper.FormFlattening = true;

然后是 Chris 的评论:您似乎在使用 PdfCopy。如果您使用的是旧版本的 iTextSharp(iText 5.5.1 之前),则不应期望保留该表单。如果您使用的是最新版本,则应指示 PdfCopy 保留该表单(但缺少该行)。您无需问“我如何保存表单?”,因为无论如何您都不应该使用PdfCopy

您只需要PdfStamper。您已经使用PdfStamper 来填写字段,现在您还可以使用selectPages() 方法来选择要保留的页面(或排除要删除的页面)。

最后,不清楚你写的时候是什么意思:

丢失数据的部分很大,尤其是一大堆xml。

您是说表单不是纯 AcroForm,而是它还包含 XFA 流?如果是这样,那么你绝对不能使用PdfCopy

【讨论】:

  • 好吧,我必须承认我对 iTextSharp 和 PDF 不是很熟悉,我可能犯了一些错误。现在我使用 selectPages() 方法作为 Chriss Hase,你提到了它,它的工作就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 2012-05-17
  • 1970-01-01
  • 2014-07-30
相关资源
最近更新 更多