繁体   English   中英

使用iText创建PDF

[英]Using iText to create PDF

我正在尝试使用iText创建PDF,但遇到很多困难。 简而言之,我想做的是:

  • 阅读模板pdf
  • 在模板的内存中进行复制
  • 在副本上画一张桌子
  • 将pdf副本写入输出流

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

// 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();

研究[我的评论]所需要的样本正是[Tuan]所需要的,因此我将其表述为答案:

iText in Action(第二版) 第6章中的样本Stationery.java实质上显示了如何在给定PDF的前景填充新内容的同时,将给定PDF的内容用作新PDF的背景(类似于文具)。

中心代码如下:

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()调用已被删除最近越来越多的PdfReader reader在实例化useStationary nowerdays应存放在一些可变Stationery和后关闭createPdf已执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM