Создание миниатюры для PDF в Java
Я ищу библиотеку Java, которая может взять PDF файл и создать миниатюрное изображение (PNG) с первой страницы.
Я уже посмотрел на JPedal, но его безумная лицензионная плата абсолютно запретительна. Я использую iText для манипулирования файлами PDF на данный момент, но я считаю, что он не создает генерации миниатюр. Я могу использовать что-то вроде Ghostscript в командной строке, но я надеюсь, что, если это возможно, будет поддерживать проект Java.
Ответы
Ответ 1
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
);
Ответ 2
PDF Renderer прекрасен, пока вы используете только подмножество файлов PDF, которые они используют. С JPod и JPedal вы платите за активную и развитую библиотеку, а не за мертвый проект.
Ответ 3
создавать несколько миниатюр PDF файлов в адаптере, как при загрузке изображений с помощью Picasso или 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);