Itext PDF编写器和事件

Itext PDF编写器和事件,itext,Itext,我想创建一个PdfWriter对象,并为页眉和页脚设置事件。 问题是,如果我创建一个新的PDF,它就会工作。但我的问题是,我的输出流中已经有一个PDF。请在下面找到我的示例代码 Document document = new Document(); try { // step 2: FileInputStream is = new FileInputStream("D://2.pdf"); int nRead; byte[]

我想创建一个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”中的异常异常转换程序:java.io.IOException:文档没有页面

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

问候,, 蒂娜

是的

您正试图使用
PdfWriter
修改现有PDF,而此时您应该使用
PdfStamper

使用压模添加文本远比使用
PdfWriter
文档
轻松

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

将段落/块/etc添加到
ColumnText
,并向其传递
PdfContentByte
(以及一些位置参数)以绘制文本

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

使用
ColumnText
值得付出额外的努力


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

谢谢。我让它工作了。但现在我面临的问题是——它不是写标题。虽然我做了一个getOverContent,一个getUnderContent,然后添加了表,但不知怎么的,标题没有被写入。有什么建议吗?
enter code here