2013-05-06 144 views
0

我试图用iText创建一个PDF,而且我遇到了很多困难。总之,我想要做的是:使用iText创建PDF

  • 读入模板PDF
  • 制作副本模板
  • 的记忆画上的副本
  • 表写复制PDF到OutputStream的

到目前为止,它看起来像这样

// read in template pdf 
InputStream templateStream = getServletContext().getResourceAsStream(labelsTemplate); 
PdfReader reader = new PdfReader(templateStream); 

// create a table in a new document 
Document document = new Document(); 
PdfCopy copy = new PdfCopy(document, os); 
document.open(); 

PdfPTable table = new PdfPTable(2); 
PdfPCell cell; 
cell = new PdfPCell(new Phrase("row 1; cell 1")); 
table.addCell(cell); 
cell = new PdfPCell(new Phrase("row 1; cell 2")); 
table.addCell(cell); 
document.add(table); 

是否有人可以解释一旦我使用PdfReader读取它后,如何制作模板的副本?有没有办法将表格写入模板副本而不是新文档?

以备将来参考,这里是我做了什么:

response.setContentType("application/pdf"); 
response.setHeader("Content-Disposition", "inline;filename=\"scheduler-labels.pdf\""); 
ServletOutputStream os = response.getOutputStream(); 

// read in template pdf 
InputStream templateStream = getServletContext().getResourceAsStream(labelsTemplate); 
PdfReader reader = new PdfReader(templateStream); 

// make new pdf document to draw table and output to memory 
Document document = new Document(reader.getPageSize(1)); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
PdfWriter.getInstance(document, baos); 

// write table 
document.open(); 
PdfPTable table = new PdfPTable(2); 
table.setWidthPercentage(110); 
PdfPCell cell; 
cell = new PdfPCell(new Phrase("row 1; cell 1")); 
table.addCell(cell); 
cell = new PdfPCell(new Phrase("row 1; cell 2")); 
table.addCell(cell); 
cell = new PdfPCell(new Phrase("row 2; cell 1")); 
table.addCell(cell); 
cell = new PdfPCell(new Phrase("row 2; cell 2")); 
table.addCell(cell); 
document.add(table); 
document.close(); 

// read in newly generated table pdf 
PdfReader tableReader = new PdfReader(baos.toByteArray()); 
ByteArrayOutputStream baosCombined = new ByteArrayOutputStream(); 
PdfStamper stamper = new PdfStamper(tableReader, baosCombined); 

// get a page from the template pdf 
PdfImportedPage page = stamper.getImportedPage(reader, 1); 

// add to background of table pdf 
PdfContentByte background; 
background = stamper.getUnderContent(1); 
background.addTemplate(page, 0, 0); 

stamper.close(); 
tableReader.close(); 
reader.close(); 

// write to servlet output 
baosCombined.writeTo(os); 
os.flush(); 
os.close(); 
+0

你可以使用其他API吗?如果是的话,你有没有试过碧玉? – NullPointerException 2013-05-06 17:56:14

+1

您是否研究过iText示例[Stationery.java](http://itextpdf.com/examples/iia.php?id=114)? – mkl 2013-05-06 18:02:10

+0

NullPointerException我必须为此项目使用iText。 – Tuan 2013-05-06 19:01:30

回答

0

为研究在我的评论中引用的样本是正是需要[疃],我制订它作为一个答案:

来自chapter 6的样本Stationery.javaiText in Action — 2nd Edition基本上显示了如何使用给定PDF的内容作为新PDF的背景(类似信纸),同时用新内容填充其前景。

中央代码如下:createPdf已被执行之后

public class Stationery extends PdfPageEventHelper 
{ 
    [...] 

    public void createPdf(String filename) throws Exception 
    { 
     // step 1 
     Document document = new Document(PageSize.A4, 36, 36, 72, 36); 
     // step 2 
     PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename)); 
     useStationary(writer); 
     // step 3 
     document.open(); 
     // step 4 
     [... add content to PDF ...] 
     // step 5 
     document.close(); 
    } 

    [...] 

    public void useStationary(PdfWriter writer) throws IOException 
    { 
     writer.setPageEvent(this); 
     PdfReader reader = new PdfReader(STATIONERY); 
     page = writer.getImportedPage(reader, 1); 
    } 

    public void onEndPage(PdfWriter writer, Document document) 
    { 
     writer.getDirectContentUnder().addTemplate(page, 0, 0); 
    } 

    [...] 
} 

正如隐式close()呼叫已被删除最近越来越多,在useStationary nowerdays实例化的PdfReader reader应存储在的Stationery一些变量和关闭。