Я пытаюсь объединить несколько 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;
0
Kevin 21 Сен 2018 в 17:25

2 ответа

Лучший ответ

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

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

Вместо.

1
mkl 22 Сен 2018 в 07:23

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

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

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

1
Nestor Kompothanassis 21 Сен 2018 в 15:10