【问题标题】:iTextSharp is producing a corrupt PDFiTextSharp 正在生成损坏的 PDF
【发布时间】:2011-09-16 11:31:10
【问题描述】:

下面的代码 sn-p 返回一个损坏的 PDF 文档,但是如果我返回 mergeDocument,它总是返回一个有效的 PDF。 mergeDocument 是基于我使用 Word 创建的 PDF 文件,而完成的文档是完全以编程方式生成的。代码“有效”,因为它不会引发异常。为什么 iTextSharp 创建损坏的 PDF?

byte[] completedDocument = null;            
using (MemoryStream streamCompleted = new MemoryStream())
{
    using (Document document = new Document())
    {                    
        PdfCopy copy = new PdfCopy(document, streamCompleted);
        document.Open();
        copy.Open();                    

        foreach (var item in eventItems)
        {
            byte[] mergedDocument = null;
            PdfReader reader = new PdfReader(pdfTemplates[item.DataTokens[NotifyTokenType.OrganisationID]]);
            using (MemoryStream streamTemplate = new MemoryStream())
            {
                using (PdfStamper stamper = new PdfStamper(reader, streamTemplate))
                {
                    foreach (var token in item.DataTokens)
                    {
                        if (stamper.AcroFields.Fields.Any(fld => fld.Key == token.Key.ToString()))
                        {
                            stamper.AcroFields.SetField(token.Key.ToString(), token.Value);
                        }
                    }
                    stamper.FormFlattening = true;
                    stamper.Writer.CloseStream = false;
                }

                mergedDocument = new byte[streamTemplate.Length];
                streamTemplate.Position = 0;
                streamTemplate.Read(mergedDocument, 0, (int)streamTemplate.Length);
            }
            reader = new PdfReader(mergedDocument);

            for (int i = 1; i <= reader.NumberOfPages; i++)
            {
                document.SetPageSize(PageSize.A4);
                copy.AddPage(copy.GetImportedPage(reader, i));
            }
        }
        completedDocument = new byte[streamCompleted.Length];
        streamCompleted.Position = 0;
        streamCompleted.Read(completedDocument, 0, (int)streamCompleted.Length);
    }                
}
return completedDocument;

【问题讨论】:

    标签: c# .net itextsharp itext


    【解决方案1】:

    您需要关闭 documentcopy 对象以刷新 PDF 写入缓冲区。但是,这在尝试将流读入数组时会导致一些问题。解决方法是使用MemoryStreamToArray() 方法,它仍然适用于封闭的流。我所做的更改上有 cmets。

            byte[] completedDocument = null;
            using (MemoryStream streamCompleted = new MemoryStream())
            {
                using (Document document = new Document())
                {
                    PdfCopy copy = new PdfCopy(document, streamCompleted);
                    document.Open();
                    copy.Open();
    
                    foreach (var item in eventItems)
                    {
                        byte[] mergedDocument = null;
                        PdfReader reader = new PdfReader(pdfTemplates[item.DataTokens[NotifyTokenType.OrganisationID]]);
                        using (MemoryStream streamTemplate = new MemoryStream())
                        {
                            using (PdfStamper stamper = new PdfStamper(reader, streamTemplate))
                            {
                                foreach (var token in item.DataTokens)
                                {
                                    if (stamper.AcroFields.Fields.Any(fld => fld.Key == token.Key.ToString()))
                                    {
                                        stamper.AcroFields.SetField(token.Key.ToString(), token.Value);
                                    }
                                }
                                stamper.FormFlattening = true;
                                stamper.Writer.CloseStream = false;
                            }
                            //Copy the stream's bytes
                            mergedDocument = streamTemplate.ToArray();
                        }
                        reader = new PdfReader(mergedDocument);
    
                        for (int i = 1; i <= reader.NumberOfPages; i++)
                        {
                            document.SetPageSize(PageSize.A4);
                            copy.AddPage(copy.GetImportedPage(reader, i));
                        }
                        //Close the document and the copy
                        document.Close();
                        copy.Close();
                    }
                    //ToArray() can operate on closed streams
                    completedDocument = streamCompleted.ToArray();
                }
            }
            return completedDocument;
    

    【讨论】:

    • 如果可以的话,我会投票 1000 次。我在将图像和 pdf 合并为一个 pdf 文档时遇到了困难,这有助于阐明正确的过程。
    • 谢谢,将内存流放入数组解决了我取回空 PDF 文件的问题!
    【解决方案2】:

    在将 html 转换为 pdf 时,还要确保您的 html 不包含 hr 标签

    hdnEditorText.Value.Replace("\"", "'").Replace("<hr />", "").Replace("<hr/>", "")
    

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 2022-10-05
      • 2011-01-12
      • 2018-05-29
      • 1970-01-01
      相关资源
      最近更新 更多