![](/img/trans.png)
[英]java.lang.NullPointerException when I try to add value to Array
[英]I try to use itext7 to produce a pdf file with eclipse.but when I add the pages on it ,it will output a error"java.lang.NullPointerException"
itext7版本是7.1.3,生成pdf文件是正确的,但是当我在pdf文件中添加页面并且总页数超过4页时,它会产生错误:
线程“main”中的异常 java.lang.NullPointerException
我不明白为什么低于 4 的所有页面结果都是正确的,而超过 4 则无法产生正确的结果。 jdk 版本是 1.8。
我的项目有什么问题吗?
这是我的代码:
import java.io.FileNotFoundException;
import java.io.IOException;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
public class Test {
private static TextAlignment alignment;
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String dest = "C:\\Users\\wsco\\Desktop\\pdfDemo.pdf";
PdfDocument pdfDoc =new PdfDocument(new PdfWriter(dest));
Document document = new Document(pdfDoc,PageSize.A4);
PdfFont f1 = PdfFontFactory.createFont("STSong-Light","UniGB-UCS2-H",true);
for(int i =1;i<100;i++) {
document.add(new Paragraph(i+"line").setFont(f1).setFontSize(20).setTextAlignment(alignment.LEFT));
}
int n = pdfDoc.getNumberOfPages();
System.out.println("total:"+n+"page");
Rectangle pageSize ;
PdfCanvas canvas;
for(int i = 3;i<=n;i++) {
PdfPage page = pdfDoc.getPage(i);
pageSize = page.getPageSize();
canvas = new PdfCanvas(page);
canvas.beginText().setFontAndSize(f1, 12)
.moveText(pageSize.getWidth()/2-7, 10)
.showText(String.valueOf(i-2))
.showText("/")
.showText(String.valueOf(n-2))
.endText();
}
pdfDoc.close();
System.out.println("successfully");
}
}
这是错误消息:
total:6page
Exception in thread "main" java.lang.NullPointerException
at com.itextpdf.kernel.pdf.PdfDictionary.get(PdfDictionary.java:456)
at com.itextpdf.kernel.pdf.PdfDictionary.getAsArray(PdfDictionary.java:156)
at com.itextpdf.kernel.pdf.PdfPage.getMediaBox(PdfPage.java:516)
at com.itextpdf.kernel.pdf.PdfPage.getPageSize(PdfPage.java:125)
at Test.main(Test.java:33)
这是我导入的 jar:
我不完全确定问题的确切原因是什么,但在调用 page.getPageSize() 方法之前关闭文档可以解决问题。 很可能在您调用document.close()方法之前,某些属性不会被写入。
public static void main(String[] args) throws IOException {
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(SRC));
Document document = new Document(pdfDoc, PageSize.A4);
PdfFont f1 = PdfFontFactory.createFont(StandardFonts.HELVETICA);
for (int i = 1; i < 100; i++) {
document.add(new Paragraph(i + "line").setFont(f1).setFontSize(20).setTextAlignment(alignment.LEFT));
}
pdfDoc.close();
pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(DEST));
int n = pdfDoc.getNumberOfPages();
System.out.println("total:" + n + "page");
Rectangle pageSize;
PdfCanvas canvas;
f1 = PdfFontFactory.createFont(StandardFonts.HELVETICA);
for (int i = 3; i <= n; i++) {
PdfPage page = pdfDoc.getPage(i);
pageSize = page.getPageSize();
canvas = new PdfCanvas(page);
canvas.beginText().setFontAndSize(f1, 12)
.moveText(pageSize.getWidth() / 2 - 7, 10)
.showText(String.valueOf(i - 2))
.showText("/")
.showText(String.valueOf(n - 2))
.endText();
}
pdfDoc.close();
System.out.println("successfully");
}
需要注意的重要一点是,如果您希望重用它,则必须重新创建您的 PdfFont 对象。 否则 iText 将无法将字体数据刷新到 Pdf 文档。
您还可以通过在您的文档上禁用immediateFlush并使用简单的for 循环来处理这个'page x of y' 用例,而根本不需要page.getPageSize()方法,就像在这个iText 示例中一样。 这样您就无需关闭并重新打开您的文档。
您可以通过以下方式完成此操作:我们告诉Document不应立即刷新其内容。
Document document = new Document(pdf, PageSize.A4, false);
添加完所有内容后,我们遍历文档中的每一页,并为每一页添加一个段落。
int n = pdf.getNumberOfPages();
Paragraph footer;
for (int page = 1; page <= n; page++) {
footer = new Paragraph(String.format("Page %s of %s", page, n));
document.showTextAligned(footer, 297.5f, 20, page, TextAlignment.CENTER, VerticalAlignment.MIDDLE, 0);
}
(我提供的链接中有一个完整的例子)
亲切的问候,凯文
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.