Вы говорите
Моя проблема здесь в том, что у содержимого 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
(в качестве ее имениуказывает) определяет поля только по тексту.Таким образом, если страница также содержит другое содержимое, например украшения, например логотип, этот логотип игнорируется и может быть в конечном итоге вырезан.Если вы хотите, чтобы такие украшения также использовались в ваших обзорах, вы должны использовать другой класс поиска полей.