我想创建一个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
答案 0 :(得分:3)
是的。
当您使用PdfWriter
时,您尝试使用PdfStamper
修改现有PDF。
使用压模添加文字远不如使用PdfWriter
和Document
这样做。
您需要创建一个ColumnText
对象,并通过调用PdfContentByte
获取myStamper.getOverContent(pageNum)
。
您将段落/块/等添加到ColumnText
,并将PdfContentByte
(以及一些位置参数)传递给它以绘制文本。
或者,您可以使用文本(以及其他任何内容)创建单独的PDF,然后使用PdfStamper
& PdfImportedPage
导入这些页面并将其写在现有页面之上。 PDF页面背景是透明的,直到你在它们上面绘制一些东西,因此文本(和东西)将出现在现有页面的顶部。这显然效率较低,因为必须将第二个文档转换为PDF语法中的字节数组(如果您使用ByteArrayOutputStream
而不是写入文件,这将更慢),再次解析,然后加入原始文档并第二次写出来。
使用ColumnText
值得花一点额外的努力。
您还需要使用PdfContentByte
来电直接编写页眉和页脚,但您必须在PdfPageEvent
内完成此操作,因此这些更改应该非常简单。