itext 7 c # как обрезать существующий PDF - PullRequest
0 голосов
/ 14 декабря 2018

допустим, у меня есть несколько файлов PDF, которые я хочу перенести в новый файл PDF.НО новый pdf файл представляет собой файл с табличной структурой.И содержимое файлов PDF должно помещаться в первой ячейке таблицы с двумя столбцами.Я не уверен, что подход к работе с таблицами правильный.Я открыт для любых других решений.Все, что я хочу, это в конце какой-то пользовательский текст вверху, затем содержимое PDF и флажок справа.(По одному на каждый контент в формате pdf)

То, что у меня есть до сих пор: `

        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
        Document doc = new Document(pdfDoc, PageSize.A4);
        doc.SetMargins(0f, 0f, 18f, 18f);

        PdfReader reader = new PdfReader(src);
        PdfDocument srcDoc = new PdfDocument(reader);

        Table table = new Table(new float[] { 2f, 1f });

        PdfFormXObject imagePage = srcDoc.GetFirstPage().CopyAsFormXObject(pdfDoc);

        var image = new Image(imagePage);

        Cell cell = new Cell().Add(image);
        cell.SetHorizontalAlignment(HorizontalAlignment.LEFT);
        cell.SetVerticalAlignment(VerticalAlignment.TOP);
        table.AddCell(cell);


        Table checkTable = new Table(2);

        Cell cellCheck1 = new Cell();
        cellCheck1.SetNextRenderer(new CheckboxCellRenderer(cellCheck1, "cb1", 0));
        cellCheck1.SetHeight(50);

        checkTable.AddCell(cellCheck1);

        Cell cellCheck2 = new Cell();
        cellCheck2.SetNextRenderer(new CheckboxCellRenderer(cellCheck2, "cb2", 1));
        cellCheck2.SetHeight(50);
        checkTable.AddCell(cellCheck2);

        table.AddCell(checkTable);

        doc.Add(table);

        doc.Close();`

Моя проблема здесь заключается в том, что содержание pdf все еще имеет свои поля.Что полностью портит дизайн.Это так расстраивает, я ценю любую помощь.

1 Ответ

0 голосов
/ 11 января 2019

Вы говорите

Моя проблема здесь в том, что у содержимого PDF все еще есть запас.Что полностью портит дизайн.

PDF-файлы (обычно) ничего не знают о полях.Таким образом, вы должны определить поля страницы для импорта в первую очередь.Это можно сделать, проанализировав содержимое страницы в прослушивателе событий, который отслеживает ограничивающую рамку инструкций рисования, например TextMarginFinder.Затем вы можете уменьшить исходную страницу до этих размеров.Это можно сделать с помощью следующего метода:

PdfPage restrictToText(PdfPage page)
{
    TextMarginFinder finder = new TextMarginFinder();
    new PdfCanvasProcessor(finder).ProcessPageContent(page);
    Rectangle textRect = finder.GetTextRectangle();
    page.SetMediaBox(textRect);
    page.SetCropBox(textRect);
    return page;
}

Этот метод применяется в вашем коде непосредственно перед копированием страницы в виде XObject, т.е. вы заменяете

PdfFormXObject imagePage = srcDoc.GetFirstPage().CopyAsFormXObject(pdfDoc);

на

PdfFormXObject imagePage = restrictToText(srcDoc.GetFirstPage()).CopyAsFormXObject(pdfDoc);

Это приводит к тому, что Image, в который этот XObject будет встроен, будет иметь правильный размер.К сожалению, это будет несколько неправильно расположено, потому что ограниченная страница все еще имеет ту же систему координат, что и оригинальная, просто ее рамка обрезки определяет меньший раздел, чем раньше.Чтобы это исправить, нужно применить смещение, нужно вычесть координаты левого нижнего угла рамки обрезки страницы, которая стала ограничивающей рамкой XObject.Таким образом, добавьте после создания экземпляра Image следующий код:

Rectangle bbox = imagePage.GetBBox().ToRectangle();
image.SetProperty(Property.LEFT, -bbox.GetLeft());
image.SetProperty(Property.BOTTOM, -bbox.GetBottom());
image.SetProperty(Property.POSITION, LayoutPosition.RELATIVE);

Теперь страница с ограничениями правильно расположена в ячейке таблицы.

Остерегайтесь: TextMarginFinder (в качестве ее имениуказывает) определяет поля только по тексту.Таким образом, если страница также содержит другое содержимое, например украшения, например логотип, этот логотип игнорируется и может быть в конечном итоге вырезан.Если вы хотите, чтобы такие украшения также использовались в ваших обзорах, вы должны использовать другой класс поиска полей.

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