c# – 如何使用iText创建多个副本文档

我正在使用iText生成一个PDF文档,其中包含几个几乎相同信息的副本.

例如:发票.向客户提供一份副本,另一份提交,第三份提交给会计师以进行簿记.

所有副本必须完全相同,除了一小段文本表明谁是(客户,会计,文件……)的副本.

有两种可能的情况(我不知道两种方案的解决方案是否相同):

a)每个副本都在不同的页面中.

b)所有副本都在同一页面(纸张将有切割孔以分离副本).

将有一个包装器或帮助器类,它使用iText生成PDF,以便能够执行类似var pdf = HelperClass.CreateDocument(DocuemntInfo info);的操作.多包拷贝问题将在此包装器/帮助器中解决.

iText为实现这一目标提供了什么?我是否需要在不同的位置/页面中多次写入文档中的每个元素?或者iText是否提供了一种方法来将一个副本写入文档然后将其复制到其他位置/页面?

注意:这是一个.Net项目,但我用java和c#标记了这个问题,因为这个qustion是关于如何正确使用iText的,答案将有助于两个语言开发人员.

这是我看到这个工作的方式.

PdfReader reader = new PdfReader( templatePDFPath );
Document doc = new Document();
PdfWriter writer = PdfWriter.createInstance( doc, new FileOutputStream("blah.pdf" ) );

PdfImportedPage inputPage = writer.getImportedPage( reader, 1 );

PdfDirectContent curPageContent = writer.getDirectContent();

String extraStuff[] = getExtraStuff();

for (String stuff : extraStuff) {
  curPageContent.saveState();
  curPageContent.addTemplate( inputPage /*, x, y*/ );
  curPageContent.restoreState();

  curPageContent.beginText();
  curPageContent.setTextMatrix(x, y);
  curPageContent.setFontAndSize( someFont, someSize );

  // the actual work:
  curPageContent.showText( stuff );

  curPageContent.EndText();       

  // save the contents of curPageContent out to the file and reset it for the next page.
  doc.newPage();
}

这是计算机上最少的工作.相当高效,它将导致更小的PDF.通过调整,您可以在N页上重复使用该页面的一个副本,而不是通过调整获得该页面的N个副本.

你可以做同样的事情,并使用addTemplate中的“x,y”参数在同一页面上绘制它们.由你决定.

PS:你需要事先弄清楚setTextMatrix的坐标.

相关文章
相关标签/搜索