Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用iText创建PDF_Java_Itext - Fatal编程技术网

Java 使用iText创建PDF

Java 使用iText创建PDF,java,itext,Java,Itext,我正试图用iText创建一个PDF,但我遇到了很大的困难。简而言之,我想做的是: 阅读pdf模板 在模板的内存中复制一份 在复印件上画一张桌子 将pdf副本写入outputstream 到目前为止,情况是这样的 // read in template pdf InputStream templateStream = getServletContext().getResourceAsStream(labelsTemplate); PdfReader reader = new PdfReader

我正试图用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();

由于研究我评论中提到的样本正是[Tuan]所需要的,我将其表述为一个答案:

来自的示例本质上展示了如何使用给定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()
调用最近越来越被删除,现在在
useStative
中实例化的
PdfReader阅读器
应该存储在
信纸的某个变量中
并在执行
createPdf
后关闭。

可以使用其他api吗?如果是,你试过jasper了吗?你研究过iText示例了吗?NullPointerException我必须在这个项目中使用iText。谢谢!这个例子正是我需要的。现在我在定位桌子时遇到了其他问题。但我有它的工作方式,就像这个例子一样。看起来你的问题已经解决了。如果你回答这个问题并接受自己的答案,这会有所帮助。否则,它总是作为一个未回答的问题吸引我的眼球。