Обрезать / изменить размер страницы после добавления контента? - PullRequest
0 голосов
/ 25 октября 2010

Мне интересно, можно ли изменить размеры страницы после того, как содержание было добавлено к ней?

Я создаю документ PDF в коде, используя iTextSharp, и размещаю некоторый контент на странице. Я только узнаю высоту содержимого после его рисования, а затем мне нужно «обрезать» страницу, чтобы она была такой же высокой, как и содержимое.

Я знаю, что могу сделать это, записав содержимое в pdfTemplate, затем выполнив SetPageSize () и NewPage (), а затем добавив шаблон на новую страницу. Однако этот документ должен иметь только 1 страница . В этом-то и суть - я не могу установить размер страницы 1 после факта, только последующие страницы, но документ должен содержать только одну страницу.

Если нет способа удалить страницу 1 после добавления второй страницы правильного размера, я не могу думать о том, как этого добиться: одностраничный PDF-файл, размер страницы которого мне нужно изменить после записи на него содержимого.

1 Ответ

3 голосов
/ 25 октября 2010

В итоге я сделал следующее:

  1. Создание документа в виде потока памяти.
  2. Создайте шаблон PDF, добавьте к нему контент и запомните, насколько он велик.
  3. Добавьте новую (2-ю) страницу того же размера, что и содержимое, и добавьте к ней шаблон.
  4. Перейдите к началу потока памяти, откройте на нем PdfReader.
  5. Создайте новый PDF-файл с помощью PdfCopy, скопировав 2-ю страницу из памяти в файл.

После целого дня поиска более прямого метода это казалось наиболее целесообразным.В основном:

dim ms As New IO.MemoryStream
dim doc As New Document
dim pw As PdfWriter = PdfWriter.GetInstance(doc, ms)
doc.Open
Dim cb As PdfContentByte = pw.DirectContent
Dim tpl = cb.CreateTemplate(doc.PageSize.Width, doc.PageSize.Height)
... add content to template ...

' Add template to a new page of the right dimensions
doc.Add(New Paragraph(" ")) ' page 1 content required for NewPage to work
doc.SetPageSize(New Rectangle(width, height)) ' size of content we added
doc.NewPage()
cb.AddTemplate(tpl, 0, 0)
' Close our in-memory doc but leave stream open.
pw.CloseStream = False
pw.Close()
doc.Close()

' Now create actual file and write only second page of doc.
ms.Seek(0, IO.SeekOrigin.Begin) ' Go back to start of memorystream
Dim pr As New PdfReader(ms)
doc = New Document(pr.GetPageSizeWithRotation(2)) ' New doc, size of page 2
Dim copier As New PdfCopy(doc, New IO.FileStream(<filename>, IO.FileMode.Create))
doc.Open()
copier.AddPage(copier.GetImportedPage(pr, 2)) ' Add page 2 of our in-memory document.
copier.Close()
doc.Close()
pr.Close()

Теперь у меня есть PDF с одной страницей, настроенной по размеру к добавленному контенту.
Надеюсь, это поможет кому-то другому!

...