问题是这样的,前端有个预览pdf的功能,如果后台直接返回文件流,遇到大一点的pdf需要loading半天,所以我打算参考前端懒加载图片的方式,将pdf进行拆分,每一页生成一个pdf,前端根据当前视口位置加装后台对应的子pdf文件
然而现实很残酷,一个pdf 原大小1.4mb 拆成30个子pdf,每个子文件大小800kb左右,有没有办法将子pdf的大小压缩下,让前端预览pdf的时候感知不到加载延迟
关于在线预览pdf我已经有了最佳的解决方案,首先,将用户上传的pdf转成图片进行存储,前端懒加载图片即可,经过验证,一页pdf对应的图片不超过200k,对于需要复制的情况下,则通过pdfbox拆解当前页的pdf,前端通过pdfjs 渲染图层内容覆盖上去
前端部署一般使用的nginx来搭建,
那么,nginx gzip设置下或许可以帮你解决这个问题。
参考链接:
另外,有没有想过用其他方式来访问pdf?
比如nginx或者其他应用搭建个文件服务器,
这样点击文件的url就可以直接网页预览,而且只有静态文件,也方便做优化,速度也很快。
后端接口的文件存储就存储在这个文件服务器的目录下,
数据库保存一个url路径
在前端的话,直接调用url路径就可以预览pdf,
可以使用web365组件,
也可以自己做缓存设计,预览后的内容缓存起来,下次就不需要重新读取PDF文件。
要压缩PDF文件大小,可以用spire.pdf.jar包压缩看效果如何,可以选择压缩整个文档内容或者进压缩文档中的大图片(如何文档里面包含很多图片且图片很大的话),下面是两种压缩方法:
import com.spire.pdf.*;
public class CompressPDF {
public static void main(String[] args) {
String inputFile = "Sample.pdf";
String outputFile = "output/CompressPDFcontent.pdf";
PdfDocument document = new PdfDocument();
document.loadFromFile(inputFile);
document.getFileInfo().setIncrementalUpdate(false);
document.setCompressionLevel(PdfCompressionLevel.Best);
document.saveToFile(outputFile, FileFormat.PDF);
document.close();
}
}
import com.spire.pdf.*;
import com.spire.pdf.exporting.PdfImageInfo;
import com.spire.pdf.graphics.PdfBitmap;
public class CompressPDF {
public static void main(String[] args) {
String inputFile = "Sample.pdf";
String outputFile = "output/CompressPDFImage.pdf";
PdfDocument document = new PdfDocument();
document.loadFromFile(inputFile);
document.getFileInfo().setIncrementalUpdate(false);
for (int i = 0; i < document.getPages().getCount(); i++) {
PdfPageBase page = document.getPages().get(i);
PdfImageInfo[] images = page.getImagesInfo();
if (images != null && images.length > 0)
for (int j = 0; j < images.length; j++) {
PdfImageInfo image = images[j];
PdfBitmap bp = new PdfBitmap(image.getImage());
bp.setQuality(20);
page.replaceImage(j, bp);
}
}
document.saveToFile(outputFile, FileFormat.PDF);
document.close();
}
}
代码内容参考自原文出处。
自定义压缩和解压缩