前言

pdfbox会文件小非常耗内存, 容易内存溢出 Caused by: java.lang.OutOfMemoryError: Java
heap space

一、优化方案

1.使用此代码加载文件来使用临时文件

PDDocument document = PDDocument.load(file.getInputStream(), MemoryUsageSetting.setupTempFileOnly()

Api

public static PDDocument load(InputStream input) throws IOException {
    return load((InputStream)input, "", (InputStream)null, (String)null, MemoryUsageSetting.setupMainMemoryOnly());
}

public static PDDocument load(InputStream input, MemoryUsageSetting memUsageSetting) throws IOException {
    return load((InputStream)input, "", (InputStream)null, (String)null, memUsageSetting);
}

2.及时关闭使用try-resouces关闭不用的流

try (PDDocument document = PDDocument.load(file.getInputStream(), MemoryUsageSetting.setupTempFileOnly()
))

3.设置下采样

PDFRenderer pdfRenderer = new PDFRenderer(document);
//允许下采样

pdfRenderer.setSubsamplingAllowed(true);

4.renderImageWithDPI 的dpi分辨率设置小一点最好不要超过300dpi,耗时量大容易崩溃

BufferedImage bim = pdfRenderer.renderImageWithDPI(page, dpi, ImageType.RGB);

5.设置xmx(设置jvm内存)

原配置

 nohup java -jar -Xms128m  -Xmx512m 

改为

 nohup java -jar -Xms1g  -Xmx2g

6.DefaultResourceCache.java里的put方法用了SoftReference:无法回收

解决方案重写继承 DefaultResourceCache类的put方法不做任何处理

@Override
public void put(COSObject indirect, PDXObject xobject) throws IOException {
        xobjects.put(indirect, new SoftReference<PDXObject>(xobject));
}

7.分页处理及时释放不用的流

// 释放资源

   bim.flush();
    // 关闭PDF文档
   document.close();

pdf转图片上传oss预览

pdf转图片上传oss预览

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐