2013-05-06 235 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一些變量和關閉。