记一次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实现类,就能避免图形环境缺失所导致的程序出错;

posted @ 2023-03-03 16:10  凉了记忆  阅读(1195)  评论(0编辑  收藏  举报