【问题标题】:ITextsharp: Error reading a pdf file in Byte[] content (PdfReader)ITextsharp:读取 Byte[] 内容中的 pdf 文件时出错 (PdfReader)
【发布时间】:2018-09-21 14:25:58
【问题描述】:

我正在尝试通过一个列表将多个 PDF 合并到一个文件中,该列表在 byte[] 中包含它们的内容。使用 PdfReader 从 Byte[] 列表打开文档时,程序会启动以下异常:“文档没有页面”。当我查看 Byte[] 列表的内容是完整的,但总是启动异常。

我尝试单独下载该单个页面的内容,并且生成的文档在打开时启动错误。 pdf 的分割做得很好,因为它生成了物理的每个文档,并使其非常适合 PDF 的每一页。

感谢您在这种情况下的帮助或意见。

这是我用来拆分和合并文档的代码:

    public List<byte[]> SplitPDF(byte[] contentPdf)
    {
        try
        {
            var listBythe = new List<byte[]>();
            PdfImportedPage page = null;
            PdfCopy PdfCopy = null;
            PdfReader reader = new PdfReader(contentPdf);
            for (int numPage = 1; numPage <= reader.NumberOfPages; numPage++)
            {
                Document doc = new Document(PageSize.LETTER);
                var mStream = new MemoryStream();
                PdfCopy = new PdfCopy(doc, mStream);
                doc.Open();
                page = PdfCopy.GetImportedPage(reader, numPage);
                PdfCopy.AddPage(page);
                listBythe.Add(mStream.ToArray());
                doc.Close();
            }

            MergePdfToPage(listBythe);
            return listBythe;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    private byte[] MergePdfToPage(List<byte[]>contentPage)
    {
        byte[] docPdfByte = null;
        var ms = new MemoryStream();
        using (Document doc = new Document(PageSize.LETTER))
        {
            PdfCopy copy = new PdfCopy(doc, ms);
            doc.Open();
            var num = doc.PageNumber;
            foreach (var file in contentPage.ToArray())
            {
                using (var reader = new PdfReader(file))
                {
                    copy.AddDocument(reader);
                }
            }
            doc.Close();
            docPdfByte = ms.ToArray();
        }
        return docPdfByte;

【问题讨论】:

    标签: c# asp.net itext


    【解决方案1】:

    在你的循环中你做

                Document doc = new Document(PageSize.LETTER);
                var mStream = new MemoryStream();
                PdfCopy = new PdfCopy(doc, mStream);
                doc.Open();
                page = PdfCopy.GetImportedPage(reader, numPage);
                PdfCopy.AddPage(page);
                listBythe.Add(mStream.ToArray());
                doc.Close();
    

    特别是您检索mStream 字节之前关闭doc。但是在doc关闭之前,mStream中的pdf是不完整的!

    要从mStream 获取完整的 pdf,请更改说明的顺序并执行

                Document doc = new Document(PageSize.LETTER);
                var mStream = new MemoryStream();
                PdfCopy = new PdfCopy(doc, mStream);
                doc.Open();
                page = PdfCopy.GetImportedPage(reader, numPage);
                PdfCopy.AddPage(page);
                doc.Close();
                listBythe.Add(mStream.ToArray());
    

    相反。

    【讨论】:

    • 这确实是问题所在。一些我没有意识到的废话。谢谢mkl。
    【解决方案2】:

    我为您创建了一些东西,希望它会像它为我所做的一样工作。 类:

    public class PDFFactory
    {
        public PDFFactory()
        {
            PdfDocument = new Document(iTextSharp.text.PageSize.A4, 65, 65, 60, 60);
        }
    
        private Document _pdfDocument;
        public Document PdfDocument
        {
            get
            {
                return _pdfDocument;
            }
            set
            {
                _pdfDocument = value;
            }
        }
    
        private MemoryStream _pdfMemoryStream;
        public MemoryStream PDFMemoryStream
        {
            get
            {
                return _pdfMemoryStream;
            }
            set
            {
                _pdfMemoryStream = value;
            }
        }
    
        private string _pdfBase64;
        public string PDFBase64
        {
            get
            {
                if (this.DocumentClosed)
                    return _pdfBase64;
                else
                    return null;
            }
            set
            {
                _pdfBase64 = value;
            }
        }
    
        private byte[] _pdfBytes;
        public byte[] PDFBytes
        {
            get
            {
                if (this.DocumentClosed)
                    return _pdfBytes;
                else
                    return null;
            }
            set
            {
                _pdfBytes = value;
            }
        }
    
        public byte[] GetPDFBytes()
        {
            PDFDocument.Close();
            return PDFMemoryStream.GetBuffer();
        }
    
        public void closeDocument()
        {
            PDFDocument.Close();
            PDFBase64 = Convert.ToBase64String(this.PDFMemoryStream.GetBuffer());
            PDFBytes = this.PDFMemoryStream.GetBuffer();
        }
    }
    

    服务:

    public byte[] ()
    {
        PDFFactory pdf_1 = new PDFFactory();
        PDFFactory pdf_2 = new PDFFactory();
        List<byte[]> sourceFiles = new List<byte[]>();
        sourceFiles.Add(pdf_1.GetPDFBytes);
        sourceFiles.Add(pdf_2.GetPDFBytes);
    
        PDFFactory pdfFinal = new PDFFactory();
        for (int fileCounter = 0; fileCounter <= sourceFiles.Count - 1; fileCounter += 1)
        {
            PdfReader reader2 = new PdfReader(sourceFiles[fileCounter]);
            int numberOfPages = reader2.NumberOfPages;
    
            for (int currentPageIndex = 1; currentPageIndex <= numberOfPages; currentPageIndex++)
            {
                // Determine page size for the current page
                pdfFinal.PDFDocument.SetPageSize(reader2.GetPageSizeWithRotation(currentPageIndex));
    
                // Create page
                pdfFinal.PDFDocument.NewPage();
                PdfImportedPage importedPage = pdfFinal.PDFWriter.GetImportedPage(reader2, currentPageIndex);
    
                // Determine page orientation
                int pageOrientation = reader2.GetPageRotation(currentPageIndex);
                if ((pageOrientation == 90) || (pageOrientation == 270))
                    pdfFinal.PDFWriter.DirectContent.AddTemplate(importedPage, 0, -1.0F, 1.0F, 0, 0, reader2.GetPageSizeWithRotation(currentPageIndex).Height);
                else
                    pdfFinal.PDFWriter.DirectContent.AddTemplate(importedPage, 1.0F, 0, 0, 1.0F, 0, 0);
            }
        }
    
        pdfFinal.closeDocument();
        return pdfFinal.PDFBytes;
    }
    

    如果有帮助,请告诉我。

    【讨论】:

    • 感谢您的回答,内斯特。您的代码对我的订购有所帮助,但问题是在读取此行上的文件内容时:“ var reader = new PdfReader(file);”
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    相关资源
    最近更新 更多