记一次pdf转换图片异常,卡顿在renderer.renderImageWithDPI(0, dpi);或日志Could not initialize class sun.awt.X11GraphicsEnvironmen
最近做项目有个pdf转图片jpeg,项目使用tomcat部署再linux环境,pdf转图片代码如下
public static String pdfToImageBase64(String urlStr)throws IOException { logger.error("pdfToImageBase64--图片url:" + urlStr + " download start"); URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置超时间为3秒 conn.setConnectTimeout(60 * 1000); // 防止屏蔽程序抓取而返回403错误 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); // 得到输入流 InputStream inputStream = conn.getInputStream(); String res = pdf2Image(inputStream, 300); logger.error("pdfToImageBase64--图片url:" + url + " download success"); if (inputStream != null) { inputStream.close(); } if (conn != null) { try { conn.disconnect();//释放链接 } catch (Exception e) { e.printStackTrace(); } } return res; } /*** * PDF文件转PNG图片,全部页数 * * @param PdfFilePath pdf完整路径 * @param dpi dpi越大转换后越清晰,相对转换速度越慢 * @return */ public static String pdf2Image(InputStream inputStream, int dpi) { PDDocument pdDocument; try { pdDocument = PDDocument.load(inputStream); PDFRenderer renderer = new PDFRenderer(pdDocument); /* dpi越大转换后越清晰,相对转换速度越慢 */ logger.error("=====11111======"); BufferedImage image = renderer.renderImageWithDPI(0, dpi);
logger.error("=====2222222====="); ByteArrayOutputStream bos = new ByteArrayOutputStream(); //File file =new File("C:/soft/123.jpg"); ImageIO.write(image, "jpeg", bos); byte[] getData = bos.toByteArray(); String res=Base64.encode(getData); logger.error("PDF文档转jpeg图片成功!succeess"); return res; } catch (IOException e) { e.printStackTrace(); logger.error("PDF文档转jpeg图片失败faile: "+e.getMessage()); return null; } }
在测试环境中正常,图片可以正常显示,但是正式环境中,图片一直无法显示,日志查看,代码一直卡在了下面一行
renderer.renderImageWithDPI(0, dpi);
前期,重启过tomcat,也修改过tomcat的参数都没有生效,后来修改了tomcat的日志级别为debug,最终通过日志发现报错了,错误提示如下
Caused by: java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironmen:
网上搜索了一下,在catalina.sh里加上“-Djava.awt.headless=true \”,问题解决(一共添加了8处,Tomcat版本7.0.39)。参照如下修改
Tomcat解决办法:
exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-sourcepath "$CATALINA_HOME"/../../java \
-Djava.security.manager \
-Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
-Djava.awt.headless=true \
org.apache.catalina.startup.Bootstrap "$@" start
补充说明:
通常B/S型Web应用运行于无显示设备、驱动的服务器端环境中,但是有使用AWT绘图接口的可能(例如:用Images、Fonts接口生成图片验证码);所以给Tomcat、Weblogic附加参数-Djava.awt.headless=true,强制使用Headless版本的AWT实现类,就能避免图形环境缺失所导致的程序出错;