Почему я не могу добавить PDF к другому PDF с этим кодом, используя iTextSharp? - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь объединить содержимое двух файлов PDF в один новый файл PDF с помощью iTextSharp. Я использовал PDFStamper прежде, чтобы выполнить это в подобных ситуациях, но по некоторым причинам он не работает в этот раз. Добавление не работает вообще;файл создан, но размер остается равным 0 байт к концу этого блока кода. Буду очень признателен за любую помощь.

File.Create(session.getLocalDir() + newPdfFile);

// pasting content from original file to new file
PdfReader reader = new PdfReader(originalFile);
string pageSelection = "1-" + reader.NumberOfPages;
reader.SelectPages(pageSelection);
PdfStamper stamper = new PdfStamper(reader, new FileStream(newPdfFile, FileMode.Append, FileAccess.Write));
stamper.Close();
reader.Close();

// pasting content from temp file to new file
reader = new PdfReader(temp);
pageSelection = "1-" + reader.NumberOfPages;
reader.SelectPages(pageSelection);
stamper = new PdfStamper(reader, new FileStream(newPdfFile, FileMode.Append, FileAccess.Write));
stamper.Close();
reader.Close();

1 Ответ

0 голосов
/ 22 октября 2019

Самое простое решение здесь - использовать MemoryStream для сохранения временного файла PDF во время добавления в него. После некоторых исследований я обнаружил, что, как показывает mkl, класс PdfStamper не подходит для этой операции. В iTextSharp вы можете добавлять 2 PDF-файла другим способом:

        MemoryStream stream = new MemoryStream();
        PdfCopyFields copy = new PdfCopyFields(stream);


        var ms1 = new MemoryStream(File.ReadAllBytes(file1Path));
        ms1.Position = 0;
        copy.AddDocument(new PdfReader(ms1));
        ms1.Dispose();

        var ms2 = new MemoryStream(File.ReadAllBytes(file2Path));
        ms2.Position = 0;
        copy.AddDocument(new PdfReader(ms2));
        ms2.Dispose();
        copy.Close();

Полученная переменная «stream» содержит объединенные PDF-файлы и может быть записана в файл с помощью PdfStamper.

При переключении наiText 7 для .net является опцией, PdfStamper может быть опущен, а взамен может использоваться метод PdfDocument.copyPagesTo ().

простой пример (с iText 7 для .net):

    MemoryStream stream = new MemoryStream();
    PdfDocument outputDocument = new PdfDocument(new PdfWriter(stream));
    PdfDocument pdfSource = new PdfDocument(new PdfReader("c:\\firstInput.pdf"));

    pdfSource.CopyPagesTo(1, pdfSource.GetNumberOfPages(), outputDocument);
    pdfSource = new PdfDocument(new PdfReader("c:\\secondInput.pdf"));
    pdfSource.CopyPagesTo(1, pdfSource.GetNumberOfPages(), outputDocument);
    pdfSource.Close();
    outputDocument.Close();

    MemoryStream outputStream = new MemoryStream(stream.ToArray());
    outputDocument = new PdfDocument(new PdfReader(outputStream), new PdfWriter("c:\\result.pdf"));

Отредактировано во второй раз с решением для конкретного варианта использования.

...