在Java中为PDF创建缩略图图像

时间:2010-05-16 18:35:11

标签: java pdf thumbnails image-generation

我正在寻找一个可以从第一页获取PDF并创建缩略图(PNG)的Java库。

我已经看过JPedal,但其疯狂的许可费完全令人望而却步。我目前正在使用iText来处理PDF文件,但我相信它不会生成缩略图。我可以在命令行上使用类似Ghostscript的东西,但我希望尽可能保持我的项目全Java。

3 个答案:

答案 0 :(得分:22)

PDF Renderer是一个LGPL许可的纯java库,使其简单(取自他们的示例页面):

File file = new File("test.pdf");
RandomAccessFile raf = new RandomAccessFile(file, "r");
FileChannel channel = raf.getChannel();
ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
PDFFile pdffile = new PDFFile(buf);

// draw the first page to an image
PDFPage page = pdffile.getPage(0);

//get the width and height for the doc at the default zoom 
Rectangle rect = new Rectangle(0,0,
                (int)page.getBBox().getWidth(),
                (int)page.getBBox().getHeight());

//generate the image
Image img = page.getImage(
                rect.width, rect.height, //width & height
                rect, // clip rect
                null, // null for the ImageObserver
                true, // fill background with white
                true  // block until drawing is done
                );

答案 1 :(得分:5)

只要您使用他们使用的PDF文件子集,PDF渲染器就可以了。使用JPod和JPedal,您需要支付一个活跃的开发库而不是一个死项目。

答案 2 :(得分:0)

在适配器中创建多个PDF文件的缩略图,就像使用Picasso或Glide加载图像一样 您需要集成picasso library

之后

您需要创建 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);