使用 pdfbox 的 PDDocument.load()方法的话会把整个 pdf 都加载到内存里去,但是我并不想那么做,比方说我想只加载 5 页,然后看完后再加载 5 页这种方式。
就像 comic screen 一样,打开 smb 里的大一点 pdf 文件都可以秒开,而其他 pdf 阅读器都要先把整个 pdf 下载完才能打开,它是如何实现的?
可以使用 pdfbox 的 PDFParser 和 COSDocument 来实现懒加载。具体步骤如下:
-
创建 PDFParser 对象,用于解析 pdf 文件
-
调用 PDFParser 的 parse() 方法,获取 COSDocument 对象
-
创建 PDDocument 对象,将 COSDocument 对象传入
-
获取 PDDocument 的总页数,根据需要逐页加载
-
调用 PDDocument 的 getDocumentCatalog() 方法获取文档目录,然后调用 getPages方法获取所有页面
-
调用 PDPageTree 的 getPage() 方法获取指定页的 PDPage 对象
-
调用 PDPage 的 convertToImage() 方法获取 PDF 页面的图像,然后用图像来代替 PDF 页面的显示
-
重复步骤 6 和 7 直到所有需要显示的页面都加载完毕。
这样就可以实现懒加载 pdf 文件的功能了。