Migradoc динамический размер страницы

1

Я использую Migradoc для создания PDF-документов в своем приложении.

Теперь мне нужно создать документ с одной страницей с фиксированной шириной и динамически рассчитанной высотой в зависимости от высоты содержимого.

var document = new Document();
var section = doc.AddSection();
section.PageSetup.PageWidth = "100mm";
// section.PageSetup.PageHeight = ???
var p1 = section.AddParagraph();
// ...
var p2 = section.AddParagraph();
// ...

Как решить эту проблему?

Теги:
pdf-generation
pdfsharp
migradoc

2 ответа

2

Вот что я сделал бы: я бы установил высоту страницы в очень большое значение, а затем я бы сделал документ. После его получения вы можете получить доступ ко всей информации о местоположении и размерности (для этого может потребоваться добавить новый метод, описанный в этом потоке: http://forum.pdfsharp.net/viewtopic.php?p=1904#p1904).

Вероятно, я бы добавил пустой фиктивный абзац в конце и использовал Y-позицию этого фиктивного абзаца, чтобы определить требуемую высоту.

Снова создайте документ с новым размером страницы или откройте PDF файл с помощью PDFsharp и установите MediaBox на новый размер.

0

У меня была аналогичная проблема, когда мне приходилось создавать документы для принтера скольжения (налоговая накладная, смена отчета и т.д.) С динамическими высотами страниц.

Загрузите (внизу страницы) исходный код /​​pdfsharp/PDFsharp 1.50 (beta 3)/PDFsharp-MigraDocFoundation-1_50-beta3b.zip (на момент написания этой статьи), создайте его и добавьте DLL в свой проект.

Установите смехотворно большую высоту в начале для вашего PageHeight

Document document = new Document();

Section section = document.AddSection();
section.PageSetup.PageWidth = Unit.FromMillimeter(100);
section.PageSetup.PageHeight = Unit.FromMillimeter(10000);

//add tables etc.
//note: all my tables are added using document.LastSection.Add(table)

DocumentRenderer renderer = new DocumentRenderer(document);
renderer.PrepareDocument();

RenderInfo[] info = renderer.GetRenderInfoFromPage(1);
int index = info.Length - 1;

double stop = info[index].LayoutInfo.ContentArea.Y.Millimeter + info[index].LayoutInfo.ContentArea.Height.Millimeter; //add more if you have bottom page margin, borders on the last table etc.
section.PageSetup.PageHeight = Unit.FromMillimeter(stop);

Это может не сработать на 100% именно для вашего сценария, но вы сможете получить координаты и размер последней таблицы, а затем оттуда выработать высоту своей страницы.

Спасибо ThomasH за информацию и ссылку, это помогло мне разобраться в этом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню