添加内容后裁剪/调整页面大小?

时间:2010-10-25 08:32:38

标签: itextsharp

我想知道在添加内容之后是否可以更改页面的尺寸?

我正在使用iTextSharp在代码中创建PDF文档,并在页面上放置一些内容。我只会在绘制内容后知道内容的高度,然后我需要基本上“裁剪”页面,以便它只与内容一样高。

我知道我可以通过将内容写入pdfTemplate,然后执行SetPageSize()和NewPage(),然后将模板添加到新页面来完成此操作。但是,此文档必须只有 1页。这就是问题 - 我不能在事后确定第1页的大小,只能在后续页面中设置,但文档只能包含一页。

除非在添加正确大小的第二页后有一种删除页面1的方法,否则我无法想到如何实现这一点:一页PDF,其页面大小我必须在写完内容后更改。

1 个答案:

答案 0 :(得分:3)

我最终做了以下事情:

  1. 将文档创建为内存流。
  2. 创建pdfTemplate,向其添加内容并记住内容有多大。
  3. 添加一个与内容大小相同的新(第二)页面,并为其添加模板。
  4. 重新启动内存流,打开一个PdfReader。
  5. 使用PdfCopy创建一个新的PDF文件,将第二页从内存复制到该文件。

经过一天寻找更直接的方法,这似乎是最权宜之计。基本上是:

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,其中包含一个自定义大小的页面,以添加内容 希望它可以帮助别人!