PdfWriter和事件

时间:2010-11-01 16:21:10

标签: itext

我想创建一个PdfWriter对象并为页眉和页脚设置事件。 问题是如果我创建一个新的PDF它是有效的。但我的问题是我已经在输出流中有一个PDF。请在下面找到我的示例代码。

Document document = new Document();
    try {
        // step 2:
        FileInputStream is = new FileInputStream("D://2.pdf");
        int nRead;
        byte[] data = new byte[16384];
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        while ((nRead = is.read(data, 0, data.length)) != -1) {
          buffer.write(data, 0, nRead);           
        }

        buffer.flush();
        PdfWriter writer = PdfWriter.getInstance(document,buffer);
        writer.setViewerPreferences(PdfWriter.PageLayoutTwoColumnLeft);
        writer.setPageEvent(new DossierPortalUtil());

        document.setMargins(36, 36, 54, 72);
        // step 3:
        document.open();

        document.add( new Chunk("testing")); 

    } catch (Exception de) {
        de.printStackTrace();
    } 
    finally{
        document.close();
    }

如果我评论该行

document.add( new Chunk("testing"));

我得到了一个例外

  

线程“main”中的异常ExceptionConverter:java.io.IOException:文档没有页面。

没有评论没有例外,但它没有添加页眉和页脚。任何线索都受到高度赞赏。

此致 蒂娜

enter code here

1 个答案:

答案 0 :(得分:3)

是的。

当您使用PdfWriter时,您尝试使用PdfStamper修改现有PDF。

使用压模添加文字远不如使用PdfWriterDocument这样做。

您需要创建一个ColumnText对象,并通过调用PdfContentByte获取myStamper.getOverContent(pageNum)

您将段落/块/等添加到ColumnText,并将PdfContentByte(以及一些位置参数)传递给它以绘制文本。

或者,您可以使用文本(以及其他任何内容)创建单独的PDF,然后使用PdfStamper& PdfImportedPage导入这些页面并将其写在现有页面之上。 PDF页面背景是透明的,直到你在它们上面绘制一些东西,因此文本(和东西)将出现在现有页面的顶部。这显然效率较低,因为必须将第二个文档转换为PDF语法中的字节数组(如果您使用ByteArrayOutputStream而不是写入文件,这将更慢),再次解析,然后加入原始文档并第二次写出来。

使用ColumnText值得花一点额外的努力。

您还需要使用PdfContentByte来电直接编写页眉和页脚,但您必须在PdfPageEvent内完成此操作,因此这些更改应该非常简单。