在 Android 中生成 Pdf 的缩略图
Posted
技术标签:
【中文标题】在 Android 中生成 Pdf 的缩略图【英文标题】:Generate Thumbnail of Pdf in Android 【发布时间】:2016-12-14 04:20:27 【问题描述】:我想从 pdf 文件生成图像(缩略图),就像 WhatsApp 所做的那样,如下所示
我试过了
-
PDFBox (https://github.com/TomRoush/PdfBox-android)
Tika(编译'org.apache.tika:tika-parsers:1.11')
AndroidPdfViewer (https://github.com/barteksc/AndroidPdfViewer)
仍然无法找到从 pdf 生成图像的方法。
PDFBox:
有一个 github issue 可以解决这个问题 (https://github.com/TomRoush/PdfBox-Android/issues/3),但这仍然没有解决。
注意:我可以使用 PDFBOX
成功地从 PDF 中提取图像AndroidPdfViewer:
Github 问题 (https://github.com/barteksc/AndroidPdfViewer/issues/49)
【问题讨论】:
Whatsapp 在服务器端进行。 你好@shanraisshan。我正在尝试实现类似的功能。您能否分享一些示例代码,您是如何实现的?或者一些可以指导我的链接。最好的问候 【参考方案1】:使用PdfiumAndroid 此处提到的barteksc。
2021 年仍在工作......
生成Pdf thumb
的示例代码//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。
【讨论】:
你真的应该添加一些解释为什么这个代码应该工作 - 你也可以在代码本身中添加 cmets - 在它的当前形式中,它没有提供任何可以帮助其余部分的解释社区了解您为解决/回答问题所做的工作。 如何从 Assets 中获取“ParcelFileDescriptor fd”? 嗨,我没有收到错误,但 png 没有创建到我的存储中。我认为代码ParcelFileDescriptor fd = getContentResolver().openFileDescriptor(pdfUri, "r");
不起作用
不工作,我应该保存位图,我不能只用生成的位图设置 imageview 吗?
不工作。当我将位图设置为 imageView 时,它不显示任何内容。【参考方案2】:
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()
【讨论】:
虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。以上是关于在 Android 中生成 Pdf 的缩略图的主要内容,如果未能解决你的问题,请参考以下文章