在Java中为PDF创建缩略图
我正在寻找一个Java库,它可以从第一页获取PDF并创建缩略图(PNG) 我已经看过JPedal,但它疯狂的许可费是完全禁止的。目前我正在使用iText操作PDF文件,但我相信它不会生成缩略图。我可以在命令行上使用Ghostscript之类的东西,但如果可能的话,我希望我的项目都是Java。是一个LGPL许可的纯Java库,它使这一点非常简单(取自他们的示例页面):在Java中为PDF创建缩略图,java,pdf,thumbnails,image-generation,Java,Pdf,Thumbnails,Image Generation,我正在寻找一个Java库,它可以从第一页获取PDF并创建缩略图(PNG) 我已经看过JPedal,但它疯狂的许可费是完全禁止的。目前我正在使用iText操作PDF文件,但我相信它不会生成缩略图。我可以在命令行上使用Ghostscript之类的东西,但如果可能的话,我希望我的项目都是Java。是一个LGPL许可的纯Java库,它使这一点非常简单(取自他们的示例页面): 只要只使用PDF文件的子集,PDF渲染器就可以了。使用JPod和JPedal,您将为一个活动的、已开发的库而不是一个死项目付费。在
只要只使用PDF文件的子集,PDF渲染器就可以了。使用JPod和JPedal,您将为一个活动的、已开发的库而不是一个死项目付费。在适配器中创建多个PDF文件的缩略图,就像使用毕加索或Glide加载图像一样 你需要整合 之后 您需要创建PdfRequestHandler类:-
public class PdfRequestHandler extends RequestHandler{
public static String SCHEME_PDF="pdf";
@Override
public boolean canHandleRequest(Request data)
{
String scheme = data.uri.getScheme();
return (SCHEME_PDF.equals(scheme));
}
@Override
public Result load(Request data, int arg1) throws IOException
{
ParcelFileDescriptor fileDescriptor = ParcelFileDescriptor.open(new File(data.uri.getPath()), MODE_READ_ONLY);
PdfRenderer renderer = new PdfRenderer(fileDescriptor);
final int pageCount = renderer.getPageCount();
if(pageCount > 0){
PdfRenderer.Page page = renderer.openPage(0);
Bitmap bitmap = Bitmap.createBitmap(page.getWidth(), page.getHeight(),Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(bitmap, 0, 0, null);
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
page.close();
return new Result(bm,LoadedFrom.DISK);
}
return null;
}
}
然后在适配器中创建实例
Picasso picassoInstance;
在适配器的构造函数中初始化实例
picassoInstance = new Picasso.Builder(context.getApplicationContext())
.addRequestHandler(new PdfRequestHandler())
.build();
然后从适配器的bindViewHolder方法中的路径加载文件
picassoInstance.load(PdfRequestHandler.SCHEME_PDF+":"+filePath)
.fit()
.into(holder.pdfThumbnailImageView);
看看能不能做到,我打赌能做到。(不是答案,因为这只是一个建议。)现在看看jPod。我想,如果可能的话,我更喜欢一个免费的开源解决方案。如果我能避免的话,即使99欧元也太多了。也很难找到它的API。嗯,上次我下载jPod时它是免费的。我想我需要看看发生了什么…据我所知,jPod本身是在BSD许可下的(所以是免费的)。你可能会把它和他们的一些产品混为一谈,这些产品可能不是免费的。无论如何,这肯定不是一个现成的解决方案,我看到下面已经提出了一个解决方案,所以请抓起jPod来解决这个问题。如果jPod是在BSD许可下分发的,那么这听起来不错。问题是,jPod做了我需要的吗?哇,这看起来确实是我需要的。我将试一试并报告。如何将此图像对象保存到磁盘?
ImageIO.write(图像,“png”,文件)代码>不幸的是,我认为PDF渲染器无法完成这项工作。我想出了一个在命令行上使用Ghostscript的解决方案,但是+1是一个彻底的答案。太糟糕了。由于没有java.awt.rectangle,可能对android不起作用。我的解决方案需要处理任意PDF文件。您能否通过“仅子集[PDF Render]使用”来解释更多内容?Re:JPedal,由于其荒谬的成本,我已经放弃了它;re:JPod,我仍然不确定它是否能满足我上面的需求。PDF渲染器不支持压缩对象和当前大量PDF中的许多其他功能。“PDFRenderer只处理PDF规范的1.4版本。当前版本为1.6,在1.4和1.6之间有相当多的添加和更改,这似乎破坏了PDFRenderer。”(摘自编辑)(也抄送@ShaggyFrog)
picassoInstance.load(PdfRequestHandler.SCHEME_PDF+":"+filePath)
.fit()
.into(holder.pdfThumbnailImageView);