我想从 pdf 文件生成图像(缩略图),就像 WhatsApp 所做的那样,如下所示
我已经尝试过了
并且仍然无法找到从 pdf 生成图像的方法。
PDFBox:
有一个 github 问题可以解决这个问题(https://github.com/TomRoush/PdfBox-Android/issues/3),但这仍然没有解决。
注意:我成功地使用PDFBOX
从PDF中提取图像AndroidPdfViewer:
Github 问题 (https://github.com/barteksc/AndroidPdfViewer/issues/49)
使用 PdfiumAndroid,如 barteksc 此处所述。
2021年还在工作...
生成 Pdf 缩略图的示例代码
//PdfiumAndroid (https://github.com/barteksc/PdfiumAndroid)
//https://github.com/barteksc/AndroidPdfViewer/issues/49
void generateImageFromPdf(Uri pdfUri) {
int pageNumber = 0;
PdfiumCore pdfiumCore = new PdfiumCore(this);
try {
//http://www.programcreek.com/java-api-examples/index.php?api=android.os.ParcelFileDescriptor
ParcelFileDescriptor fd = getContentResolver().openFileDescriptor(pdfUri, "r");
PdfDocument pdfDocument = pdfiumCore.newDocument(fd);
pdfiumCore.openPage(pdfDocument, pageNumber);
int width = pdfiumCore.getPageWidthPoint(pdfDocument, pageNumber);
int height = pdfiumCore.getPageHeightPoint(pdfDocument, pageNumber);
Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
pdfiumCore.renderPageBitmap(pdfDocument, bmp, pageNumber, 0, 0, width, height);
saveImage(bmp);
pdfiumCore.closeDocument(pdfDocument); // important!
} catch(Exception e) {
//todo with exception
}
}
public final static String FOLDER = Environment.getExternalStorageDirectory() + "/PDF";
private void saveImage(Bitmap bmp) {
FileOutputStream out = null;
try {
File folder = new File(FOLDER);
if(!folder.exists())
folder.mkdirs();
File file = new File(folder, "PDF.png");
out = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
} catch (Exception e) {
//todo with exception
} finally {
try {
if (out != null)
out.close();
} catch (Exception e) {
//todo with exception
}
}
}
更新:
将库包含在 build.gradle 中
implementation 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'
用于生成任何 PDF 页面的图像:
通过传递存储在存储中的任何 PDF uri 来调用方法 generateImageFromPdf(uri)。
该方法将在您存储的 PDF 文件夹中生成 PDF.png。
使用Android PDFRenderer组件
with(context) {
contentResolver.openFileDescriptor(uri, "r")?.use { parcelFileDescriptor ->
val pdfRenderer = PdfRenderer(parcelFileDescriptor).openPage(0)
val bitmap = Bitmap.createBitmap(pdfRenderer.width, pdfRenderer.height, Bitmap.Config.ARGB_8888)
pdfRenderer.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)
pdfRenderer.close()
}
}
val file = Constant.allMediaList[position]
val filename = Environment.getExternalStoragePublicDirectory(file)
if (file != null) {
if (file.endsWith(".pdf")){
val fd :ParcelFileDescriptor= ParcelFileDescriptor.open(filename,ParcelFileDescriptor.MODE_READ_WRITE)
val pageNum: Int = 0;
val pdfiumCore: PdfiumCore = PdfiumCore(mContext);
try {
val pdfDocument: PdfDocument = pdfiumCore.newDocument(fd);
pdfiumCore.openPage(pdfDocument, pageNum);
val width: Int = pdfiumCore.getPageWidthPoint(pdfDocument, pageNum);
val height: Int = pdfiumCore.getPageHeightPoint(pdfDocument, pageNum);
// ARGB_8888 - best quality, high memory usage, higher possibility of OutOfMemoryError
// RGB_565 - little worse quality, twice less memory usage
val bitmap: Bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.RGB_565);
pdfiumCore.renderPageBitmap(pdfDocument, bitmap, pageNum, 0, 0,width, height);
//if you need to render annotations and form fields, you can use
//the same method above adding 'true' as last param
Glide.with(mContext)
.load(bitmap).into(holder.thumbnail)
pdfiumCore.closeDocument(pdfDocument); // important!
} catch(ex: IOException) {
ex.printStackTrace();
Toast.makeText(mContext,"failed",Toast.LENGTH_LONG).show()
}
}
Bitmap myBitmap = generateImageFromPdf(FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", Pdf_File.get(position).getAbsoluteFile()));
holder.iv_icon.setImageBitmap(myBitmap);
}
Bitmap generateImageFromPdf(Uri pdfUri) {
int pageNumber = 0;
PdfiumCore pdfiumCore = new PdfiumCore(context);
Bitmap bmp = null;
try {
//http://www.programcreek.com/java-api-examples/index.php?api=android.os.ParcelFileDescriptor
ParcelFileDescriptor fd = context.getContentResolver().openFileDescriptor(pdfUri, "r");
PdfDocument pdfDocument = pdfiumCore.newDocument(fd);
pdfiumCore.openPage(pdfDocument, pageNumber);
int width = pdfiumCore.getPageWidthPoint(pdfDocument, pageNumber);
int height = pdfiumCore.getPageHeightPoint(pdfDocument, pageNumber);
Log.e("Width_height", "" + width + " " + height);
bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
pdfiumCore.renderPageBitmap(pdfDocument, bmp, pageNumber, 0, 0, width, height);
pdfiumCore.closeDocument(pdfDocument);
} catch (Exception e) {
//todo with exception
}
return bmp;
}
这对我有用。在爪哇。
ParcelFileDescriptor parcelFileDescriptor = contentResolver.openFileDescriptor(uriFile, "r");
try (PdfRenderer pdfRenderer = new PdfRenderer(parcelFileDescriptor);
PdfRenderer.Page page = pdfRenderer.openPage(0)) {
Bitmap bitmap = Bitmap.createBitmap(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, Bitmap.Config.ARGB_8888);
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
try (FileOutputStream fos = new FileOutputStream(thumbnailPath.toFile())) {
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
}
} catch (Exception e) {
Log.e(TAG, "Error creating thumbnail", e);
}