【发布时间】:2016-10-10 23:31:24
【问题描述】:
我目前在使用 Apache PdfBox 2.0.3 的 linux 上遇到问题。
你可以从代码sn-p和下面的异常中看到。我尝试做的只是设置字体,然后在页面上书写。不幸的是,我们在 Ubuntu 上使用 Tomcat 7 和 Java 7 的 linux 测试和实时环境没有成功。在我的 Windows 开发机器上一切正常。
我已经尝试过使用内置的 helvetica 和 currier 字体,你在 sn-p 中看到的 ttf 是从 google 字体下载的。
你知道我做错了什么吗?
我正在使用的代码 sn-p:
PDPage page = detailsDocument.getPage(0);
PDPageContentStream contentStream = new PDPageContentStream(detailsDocument, page, PDPageContentStream.AppendMode.APPEND, true, true);
File fontFile = new File(getClass().getClassLoader().getResource("fonts/OpenSans-Regular.ttf").getFile());
PDFont font = PDTrueTypeFont.load(document, fontFile, Encoding.getInstance(COSName.STANDARD_ENCODING));
contentStream.beginText();
contentStream.setFont( font, 22 );
contentStream.newLineAtOffset(57, 495);
contentStream.showText( collection.getDocument().getIndication().getName() + " - " + collection.getDocument().getTitle() );
contentStream.endText();
例外:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:981)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:860)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:274)
org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:271)
java.security.AccessController.doPrivileged(Native Method)
javax.security.auth.Subject.doAsPrivileged(Subject.java:536)
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:306)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:166)
root cause
java.lang.NullPointerException
org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:311)
org.apache.pdfbox.pdmodel.PDPageContentStream.showText(PDPageContentStream.java:414)
hu.jacsomedia.tms.webapp.pdfbuilder.generators.PdfGenerator.addOrderDetailsPage(PdfGenerator.java:361)
hu.jacsomedia.tms.webapp.pdfbuilder.generators.PdfGenerator.generatePdf(PdfGenerator.java:68)
hu.jacsomedia.tms.webapp.pdfbuilder.generators.PdfGenerator.generatePdfToOMR(PdfGenerator.java:268)
hu.jacsomedia.tms.webapp.pdfbuilder.generators.PdfGenerator$$FastClassBySpringCGLIB$$fcaef06.invoke(<generated>)
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
hu.jacsomedia.tms.webapp.pdfbuilder.generators.PdfGenerator$$EnhancerBySpringCGLIB$$55740b22.generatePdfToOMR(<generated>)
hu.jacsomedia.tms.webapp.pdfbuilder.controller.PdfGeneratorController.generate(PdfGeneratorController.java:139)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:860)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:274)
org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:271)
java.security.AccessController.doPrivileged(Native Method)
javax.security.auth.Subject.doAsPrivileged(Subject.java:536)
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:306)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:166)
【问题讨论】:
-
PDFont.java:311 只有在“text”参数为空时才会抛出 NPE。这不能根据您发布的代码。所以要么我错了,要么你的代码不是被调用的那个,要么不是 2.0.3,或者你的类路径中有几个不同的版本。
-
尝试
COSName.WIN_ANSI_ENCODING而不是COSName.STANDARD_ENCODING。此外,在资源上使用getFile始终是一场赌博,因为资源可能位于存档中,因此不是直接的文件系统对象。