Я использую 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();
// ...
Как решить эту проблему?
Вот что я сделал бы: я бы установил высоту страницы в очень большое значение, а затем я бы сделал документ. После его получения вы можете получить доступ ко всей информации о местоположении и размерности (для этого может потребоваться добавить новый метод, описанный в этом потоке: http://forum.pdfsharp.net/viewtopic.php?p=1904#p1904).
Вероятно, я бы добавил пустой фиктивный абзац в конце и использовал Y-позицию этого фиктивного абзаца, чтобы определить требуемую высоту.
Снова создайте документ с новым размером страницы или откройте PDF файл с помощью PDFsharp и установите MediaBox на новый размер.
У меня была аналогичная проблема, когда мне приходилось создавать документы для принтера скольжения (налоговая накладная, смена отчета и т.д.) С динамическими высотами страниц.
Загрузите (внизу страницы) исходный код /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 за информацию и ссылку, это помогло мне разобраться в этом.