iText.Layout.Document игнорирует пространство, занятое объединенным pdf - PullRequest
0 голосов
/ 21 сентября 2018

Я создаю PDF-файлы, содержащие текст, изображения и существующие PDF-файлы.Существующие PDF-файлы добавляются путем слияния их в PDF-файл.Проблема заключается в том, что если сначала добавить файл PDF, а затем изображение, то iText.Layout.Document не учитывает пространство, занимаемое объединенным файлом PDF, а вместо этого добавляет изображение, следуя абзацу «Название документа» (см. Пример).

Это создает неупорядоченные изображения, а иногда даже перекрывающиеся изображения и объединенные PDF-файлы.Мне нужен правильный порядок без наложения, как я могу решить это?

using (var stream = new MemoryStream())
using (var writer = new PdfWriter(stream).SetSmartMode(true))
using (var pdf = new PdfDocument(writer))
using (var doc = new Document(pdf))
{
    doc.Add(new Paragraph("Document Title")

    //pdf is added via merging, results in pdf being on the second page which is ok
    using (var ms = new MemoryStream(somePdfByteArray))
    using (var reader = new PdfReader(ms))
    using (var pdfdoc = new PdfDocument(reader))
    {
        PdfMerger merger = new PdfMerger(pdf);
        merger.Merge(pdfdoc, 1, pdfdoc.GetNumberOfPages());
    }
    //then image is added but it is added BEFORE the pdf which is the problem
    doc.Add(new Image(ImageDataFactory.Create(someImageByteArray)));
}

1 Ответ

0 голосов
/ 05 октября 2018

Если подход, предложенный в комментариях (создание в памяти документов для слияния / добавления), невозможен из-за проблем с производительностью, и вы не возражаете против добавления контента на новую страницу в документе, вы можете попробовать этот подход:

public static void main(String[] args) throws Exception {
    PdfDocument pdfDocument = new PdfDocument(new PdfWriter(DEST));
    addContent(new Paragraph("Document Title"), pdfDocument);
    mergePdf(new PdfDocument(new PdfReader(SRC)), pdfDocument);
    addContent(new Div().add(new Image(ImageDataFactory.create("path_to_image"))), pdfDocument);
    pdfDocument.close();
}

public static void mergePdf(PdfDocument in, PdfDocument pdfDocument) throws Exception {
    in.copyPagesTo(1, in.getNumberOfPages(), pdfDocument, new PdfPageFormCopier());
}

public static void addContent(IBlockElement content, PdfDocument pdfDocument) throws Exception {
    Document document = new Document(pdfDocument);
    pdfDocument.addNewPage();
    document.add(new AreaBreak(AreaBreakType.LAST_PAGE));
    document.add(content);
}

Я написал пример кода на Java, но iText для Java и .NET используют одну и ту же кодовую базу, поэтому это не должно быть проблемой.

При таком подходе мы заставляем iText добавить новую страницу перед добавлением контента в высокоуровневый класс Document.Если вы хотите добавить изображения с использованием этого подхода, вам нужно будет обернуть их в IBlockElement, чтобы этот метод работал.Наиболее подходящим элементом будет Div one.

С уважением, Кевин

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