ITextsharp: Ошибка чтения PDF-файла в содержимом байта [] (PdfReader) - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь объединить несколько PDF-файлов в один файл через список, содержащий их содержимое в байтах [].При открытии документа из списка Byte [] с помощью PdfReader программа запускает следующее исключение: «в документе нет страниц» .Когда я просматриваю содержимое списка 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;

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

В вашем цикле вы делаете

            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 будет закрыт, PDF-файл будет неполным в mStream!

Чтобы получить полный PDF-файл из mStream, пожалуйста, измените порядок инструкций и выполните

            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());

вместо.

0 голосов
/ 21 сентября 2018

Я что-то создал для вас, надеюсь, это будет работать так же, как и для меня.Класс:

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;
}

Дайте мне знать, если это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...