我想获取所有图像格式的PDF页面,可以使用
PdfRenderer
,但我无法用它输入PDF密码。
我可以从 PDFReader 获取 PDF 页面的图像吗?
这是我的代码
private void pdfToImage(Uri pdfFilePath, String password) { //password is input,which is given by user
try {
// Reading pdf in READ Only mode.
// ParcelFileDescriptor fileDescriptor = ParcelFileDescriptor.open(new File(pdfFilePath.getPath()), ParcelFileDescriptor.MODE_READ_ONLY);
ParcelFileDescriptor fileDescriptor = getContentResolver().openFileDescriptor(pdfFilePath, "r");
// Initializing PDFRenderer object.
PdfRenderer renderer = new PdfRenderer(fileDescriptor);
// Getting total pages count.
final int pageCount = renderer.getPageCount();
// Iterating pages
for (int i = 0; i < pageCount; i++) {
// Getting Page object by opening page.
PdfRenderer.Page page = renderer.openPage(i);
// Creating empty bitmap. Bitmap.Config can be changed.
Bitmap bitmap = Bitmap.createBitmap(page.getWidth(), page.getHeight(), Bitmap.Config.ARGB_8888);
// Creating Canvas from bitmap.
Canvas canvas = new Canvas(bitmap);
// Set White background color.
canvas.drawColor(Color.WHITE);
// Draw bitmap.
canvas.drawBitmap(bitmap, 0, 0, null);
// Rednder bitmap and can change mode too.
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
// closing page
page.close();
// saving image into sdcard.
File file = getImageFile();
// Saving image in PNG format with 100% quality.
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
Log.v("Saved Image - ", file.getAbsolutePath());
out.flush();
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
花了两天时间终于找到了一个将pdf页面转换为位图的解决方案,我知道为时已晚,但它可以帮助别人,在这里我分享一些代码
通过使用这个库
首先在build.gradle中添加以下gradle依赖
实现“com.github.barteksc:android-pdf-viewer:2.8.2”
然后你可以使用以下函数,它将返回位图列表
fun mGetBitmapFromPasswordProtected(file: Uri?,password : String): ArrayList<Bitmap>? {
val bitmaps = ArrayList<Bitmap>()
var pageNum=0
val pdfiumCore = PdfiumCore(this@PDFToImages)
try {
val pdfDocument = pdfiumCore.newDocument(
contentResolver.openFileDescriptor(
file!!, "r"
), password
)
do {
pdfiumCore.openPage(pdfDocument, pageNum)
val width = pdfiumCore.getPageWidthPoint(pdfDocument, pageNum)
val height = pdfiumCore.getPageHeightPoint(pdfDocument, pageNum)
val bitmap = Bitmap.createBitmap(
width, height,
Bitmap.Config.RGB_565
)
pdfiumCore.renderPageBitmap(
pdfDocument, bitmap, pageNum, 0, 0,
width, height
)
bitmaps.add(bitmap)
pageNum++
}
while (pdfDocument.hasPage(pageNum))
pdfiumCore.closeDocument(pdfDocument)
return bitmaps
}
catch (ex: Exception) {
ex.printStackTrace()
}
return null
}