在Android Java中将Pdf页面转换为位图
我需要在Android中将PDFfile(PDF页面)转换为位图(或图像文件) 1.使用Apache的Pdfbox jar。但是它使用了一些android不支持的java类。 2.尝试将图像转换为pdf的Itext jar(我需要它的反向操作) 像那样,我试过很多罐子。但没有积极的结果在Android Java中将Pdf页面转换为位图,android,pdf,Android,Pdf,我需要在Android中将PDFfile(PDF页面)转换为位图(或图像文件) 1.使用Apache的Pdfbox jar。但是它使用了一些android不支持的java类。 2.尝试将图像转换为pdf的Itext jar(我需要它的反向操作) 像那样,我试过很多罐子。但没有积极的结果 byte[] bytes; try { File file = new File(this.getFilesDir().getAbsolutePath()+"/2010Q2_SDK_Ov
byte[] bytes;
try {
File file = new File(this.getFilesDir().getAbsolutePath()+"/2010Q2_SDK_Overview.pdf");
FileInputStream is = new FileInputStream(file);
// Get the size of the file
long length = file.length();
bytes = new byte[(int) length];
int offset = 0;
int numRead = 0;
while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}
ByteBuffer buffer = ByteBuffer.NEW(bytes);
String data = Base64.encodeToString(bytes, Base64.DEFAULT);
PDFFile pdf_file = new PDFFile(buffer);
PDFPage page = pdf_file.getPage(2);
RectF rect = new RectF(0, 0, (int) page.getBBox().width(),
(int) page.getBBox().height());
// Bitmap bufferedImage = Bitmap.createBitmap((int)rect.width(), (int)rect.height(),
// Bitmap.Config.ARGB_8888);
Bitmap image = page.getImage((int)rect.width(), (int)rect.height(), rect);
FileOutputStream os = new FileOutputStream(this.getFilesDir().getAbsolutePath()+"/pdf.jpg");
image.compress(Bitmap.CompressFormat.JPEG, 80, os);
// ((ImageView) findViewById(R.id.testView)).setImageBitmap(image);
byte[]字节;
试一试{
File File=新文件(this.getFilesDir().getAbsolutePath()+“/2010Q2_SDK_Overview.pdf”);
FileInputStream is=新的FileInputStream(文件);
//获取文件的大小
long length=file.length();
字节=新字节[(int)长度];
整数偏移=0;
int numRead=0;
而(偏移量=0){
偏移量+=numRead;
}
ByteBuffer缓冲区=ByteBuffer.NEW(字节);
字符串数据=Base64.encodeToString(字节,Base64.DEFAULT);
PDFFile pdf_file=新的PDFFile(缓冲区);
PDFPage page=pdf_file.getPage(2);
RectF rect=new RectF(0,0,(int)page.getBBox().width(),
(int)page.getBBox().height());
//Bitmap BuffereImage=Bitmap.createBitmap((int)rect.width(),(int)rect.height(),
//位图.Config.ARGB_8888);
位图图像=page.getImage((int)rect.width(),(int)rect.height(),rect);
FileOutputStream os=新的FileOutputStream(this.getFilesDir().getAbsolutePath()+“/pdf.jpg”);
image.compress(Bitmap.CompressFormat.JPEG,80,操作系统);
//((ImageView)findViewById(R.id.testView)).setImageBitmap(图像);
我正在获取图像文件,
而不是,
package com.test123;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入com.sun.pdfview.PDFFile;
导入com.sun.pdfview.PDFPage;
导入net.sf.andpdf.nio.ByteBuffer;
导入android.app.Activity;
导入android.graphics.Bitmap;
导入android.graphics.RectF;
导入android.os.Bundle;
导入android.util.Base64;
公共类Test123Activity扩展了活动{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
字节[]字节;
试一试{
File File=新文件(this.getFilesDir().getAbsolutePath()+“/2010Q2_SDK_Overview.pdf”);
FileInputStream is=新的FileInputStream(文件);
//获取文件的大小
long length=file.length();
字节=新字节[(int)长度];
整数偏移=0;
int numRead=0;
而(偏移量=0){
偏移量+=numRead;
}
ByteBuffer缓冲区=ByteBuffer.NEW(字节);
字符串数据=Base64.encodeToString(字节,Base64.DEFAULT);
PDFFile pdf_file=新的PDFFile(缓冲区);
PDFPage page=pdf_file.getPage(2);
RectF rect=new RectF(0,0,(int)page.getBBox().width(),
(int)page.getBBox().height());
//Bitmap BuffereImage=Bitmap.createBitmap((int)rect.width(),(int)rect.height(),
//位图.Config.ARGB_8888);
位图图像=page.getImage((int)rect.width(),(int)rect.height(),rect);
FileOutputStream os=新的FileOutputStream(this.getFilesDir().getAbsolutePath()+“/pdf.jpg”);
image.compress(Bitmap.CompressFormat.JPEG,80,操作系统);
//((ImageView)findViewById(R.id.testView)).setImageBitmap(图像);
}捕获(例外e){
e、 printStackTrace();
}
}
}
除此之外,是否还有其他方法可以使用应用程序内置的函数在android中显示pdf文件?我们可以使用Qoppa pdf工具包来实现 使用Qoppa PDF工具包的步骤 从下载 此文件包含四项:
//Converting PDF to Bitmap Image...
StandardFontTF.mAssetMgr = getAssets();
//Load document to get the first page
try {
PDFDocument pdf = new PDFDocument("/sdcard/PDFFilename.pdf", null);
PDFPage page = pdf.getPage(0);
//creating Bitmap and canvas to draw the page into
int width = (int)Math.ceil(page.getDisplayWidth());
int height = (int)Math.ceil(page.getDisplayHeight());
Bitmap bm = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas c = new Canvas(bm);
page.paintPage(c);
//Saving the Bitmap
OutputStream os = new FileOutputStream("/sdcard/GeneratedImageByQoppa.jpg");
bm.compress(CompressFormat.JPEG, 80, os);
os.close();
} catch (PDFException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
我解决了这个问题,简单到让设备有时间渲染每个页面 要解决这个问题,你所要做的就是改变
PDFPage page = pdf_file.getPage(2);
到
首先,要在Android中查看PDF,您必须将PDF转换为图像,然后将其显示给用户
所以要做到这一点,我们需要这个。这是我编辑的版本
将库导入项目后,需要创建活动
XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/webView1"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
java:
//Imports:
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver;
import android.webkit.WebView;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFImage;
import com.sun.pdfview.PDFPage;
import com.sun.pdfview.PDFPaint;
import net.sf.andpdf.nio.ByteBuffer;
import net.sf.andpdf.refs.HardReference;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
//Globals:
private WebView wv;
private int ViewSize = 0;
//OnCreate Method:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Settings
PDFImage.sShowImages = true; // show images
PDFPaint.s_doAntiAlias = true; // make text smooth
HardReference.sKeepCaches = true; // save images in cache
//Setup webview
wv = (WebView)findViewById(R.id.webView1);
wv.getSettings().setBuiltInZoomControls(true);//show zoom buttons
wv.getSettings().setSupportZoom(true);//allow zoom
//get the width of the webview
wv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
ViewSize = wv.getWidth();
wv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
try
{
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/randompdf.pdf");
RandomAccessFile f = new RandomAccessFile(file, "r");
byte[] data = new byte[(int)f.length()];
f.readFully(data);
pdfLoadImages(data);
}
catch(Exception ignored)
{
}
}
//Load Images:
private void pdfLoadImages(final byte[] data)
{
try
{
// run async
new AsyncTask<Void, Void, String>()
{
// create and show a progress dialog
ProgressDialog progressDialog = ProgressDialog.show(MainActivity.this, "", "Opening...");
@Override
protected void onPostExecute(String html)
{
//after async close progress dialog
progressDialog.dismiss();
//load the html in the webview
wv.loadDataWithBaseURL("", html, "text/html","UTF-8", "");
}
@Override
protected String doInBackground(Void... params)
{
try
{
//create pdf document object from bytes
ByteBuffer bb = ByteBuffer.NEW(data);
PDFFile pdf = new PDFFile(bb);
//Get the first page from the pdf doc
PDFPage PDFpage = pdf.getPage(1, true);
//create a scaling value according to the WebView Width
final float scale = ViewSize / PDFpage.getWidth() * 0.95f;
//convert the page into a bitmap with a scaling value
Bitmap page = PDFpage.getImage((int)(PDFpage.getWidth() * scale), (int)(PDFpage.getHeight() * scale), null, true, true);
//save the bitmap to a byte array
ByteArrayOutputStream stream = new ByteArrayOutputStream();
page.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
stream.reset();
//convert the byte array to a base64 string
String base64 = Base64.encodeToString(byteArray, Base64.NO_WRAP);
//create the html + add the first image to the html
String html = "<!DOCTYPE html><html><body bgcolor=\"#b4b4b4\"><img src=\"data:image/png;base64,"+base64+"\" hspace=10 vspace=10><br>";
//loop though the rest of the pages and repeat the above
for(int i = 2; i <= pdf.getNumPages(); i++)
{
PDFpage = pdf.getPage(i, true);
page = PDFpage.getImage((int)(PDFpage.getWidth() * scale), (int)(PDFpage.getHeight() * scale), null, true, true);
page.compress(Bitmap.CompressFormat.PNG, 100, stream);
byteArray = stream.toByteArray();
stream.reset();
base64 = Base64.encodeToString(byteArray, Base64.NO_WRAP);
html += "<img src=\"data:image/png;base64,"+base64+"\" hspace=10 vspace=10><br>";
}
stream.close();
html += "</body></html>";
return html;
}
catch (Exception e)
{
Log.d("error", e.toString());
}
return null;
}
}.execute();
System.gc();// run GC
}
catch (Exception e)
{
Log.d("error", e.toString());
}
}
//导入:
导入android.app.Activity;
导入android.app.ProgressDialog;
导入android.content.Intent;
导入android.graphics.Bitmap;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.os.Environment;
导入android.util.Base64;
导入android.util.Log;
导入android.view.view;
导入android.view.ViewTreeObserver;
导入android.webkit.WebView;
导入com.sun.pdfview.PDFFile;
导入com.sun.pdfview.PDFImage;
导入com.sun.pdfview.PDFPage;
导入com.sun.pdfview.PDFPaint;
导入net.sf.andpdf.nio.ByteBuffer;
导入net.sf.andpdf.refs.HardReference;
进口
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/webView1"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
//Imports:
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver;
import android.webkit.WebView;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFImage;
import com.sun.pdfview.PDFPage;
import com.sun.pdfview.PDFPaint;
import net.sf.andpdf.nio.ByteBuffer;
import net.sf.andpdf.refs.HardReference;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
//Globals:
private WebView wv;
private int ViewSize = 0;
//OnCreate Method:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Settings
PDFImage.sShowImages = true; // show images
PDFPaint.s_doAntiAlias = true; // make text smooth
HardReference.sKeepCaches = true; // save images in cache
//Setup webview
wv = (WebView)findViewById(R.id.webView1);
wv.getSettings().setBuiltInZoomControls(true);//show zoom buttons
wv.getSettings().setSupportZoom(true);//allow zoom
//get the width of the webview
wv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
ViewSize = wv.getWidth();
wv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
try
{
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/randompdf.pdf");
RandomAccessFile f = new RandomAccessFile(file, "r");
byte[] data = new byte[(int)f.length()];
f.readFully(data);
pdfLoadImages(data);
}
catch(Exception ignored)
{
}
}
//Load Images:
private void pdfLoadImages(final byte[] data)
{
try
{
// run async
new AsyncTask<Void, Void, String>()
{
// create and show a progress dialog
ProgressDialog progressDialog = ProgressDialog.show(MainActivity.this, "", "Opening...");
@Override
protected void onPostExecute(String html)
{
//after async close progress dialog
progressDialog.dismiss();
//load the html in the webview
wv.loadDataWithBaseURL("", html, "text/html","UTF-8", "");
}
@Override
protected String doInBackground(Void... params)
{
try
{
//create pdf document object from bytes
ByteBuffer bb = ByteBuffer.NEW(data);
PDFFile pdf = new PDFFile(bb);
//Get the first page from the pdf doc
PDFPage PDFpage = pdf.getPage(1, true);
//create a scaling value according to the WebView Width
final float scale = ViewSize / PDFpage.getWidth() * 0.95f;
//convert the page into a bitmap with a scaling value
Bitmap page = PDFpage.getImage((int)(PDFpage.getWidth() * scale), (int)(PDFpage.getHeight() * scale), null, true, true);
//save the bitmap to a byte array
ByteArrayOutputStream stream = new ByteArrayOutputStream();
page.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
stream.reset();
//convert the byte array to a base64 string
String base64 = Base64.encodeToString(byteArray, Base64.NO_WRAP);
//create the html + add the first image to the html
String html = "<!DOCTYPE html><html><body bgcolor=\"#b4b4b4\"><img src=\"data:image/png;base64,"+base64+"\" hspace=10 vspace=10><br>";
//loop though the rest of the pages and repeat the above
for(int i = 2; i <= pdf.getNumPages(); i++)
{
PDFpage = pdf.getPage(i, true);
page = PDFpage.getImage((int)(PDFpage.getWidth() * scale), (int)(PDFpage.getHeight() * scale), null, true, true);
page.compress(Bitmap.CompressFormat.PNG, 100, stream);
byteArray = stream.toByteArray();
stream.reset();
base64 = Base64.encodeToString(byteArray, Base64.NO_WRAP);
html += "<img src=\"data:image/png;base64,"+base64+"\" hspace=10 vspace=10><br>";
}
stream.close();
html += "</body></html>";
return html;
}
catch (Exception e)
{
Log.d("error", e.toString());
}
return null;
}
}.execute();
System.gc();// run GC
}
catch (Exception e)
{
Log.d("error", e.toString());
}
}
/**
* Use this to load a pdf file from your assets and render it to a Bitmap.
*
* @param context
* current context.
* @param filePath
* of the pdf file in the assets.
* @return a bitmap.
*/
@Nullable
public static Bitmap renderToBitmap(Context context, String filePath) {
Bitmap bi = null;
InputStream inStream = null;
try {
AssetManager assetManager = context.getAssets();
Log.d(TAG, "Attempting to copy this file: " + filePath);
inStream = assetManager.open(filePath);
bi = renderToBitmap(context, inStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
inStream.close();
} catch (IOException e) {
// do nothing because the stream has already been closed
}
}
return bi;
}
/**
* Use this to render a pdf file given as InputStream to a Bitmap.
*
* @param context
* current context.
* @param inStream
* the inputStream of the pdf file.
* @return a bitmap.
* @see https://github.com/jblough/Android-Pdf-Viewer-Library/
*/
@Nullable
public static Bitmap renderToBitmap(Context context, InputStream inStream) {
Bitmap bi = null;
try {
byte[] decode = IOUtils.toByteArray(inStream);
ByteBuffer buf = ByteBuffer.wrap(decode);
PDFPage mPdfPage = new PDFFile(buf).getPage(0);
float width = mPdfPage.getWidth();
float height = mPdfPage.getHeight();
RectF clip = null;
bi = mPdfPage.getImage((int) (width), (int) (height), clip, true,
true);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
inStream.close();
} catch (IOException e) {
// do nothing because the stream has already been closed
}
}
return bi;
}
try {
pdfViewer = (ImageView) findViewById(R.id.pdfViewer);
int x = pdfViewer.getWidth();
int y = pdfViewer.getHeight();
Bitmap bitmap = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_4444);
String StoragePath= Environment.getExternalStorageDirectory()+ "/sample.pdf";
File file = new File(StoragePath);
PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY));
if (currentPage < 0) {
currentPage = 0;
} else if (currentPage > renderer.getPageCount()) {
}
Matrix m = pdfViewer.getImageMatrix();
Rect r = new Rect(0, 0, x, y);
renderer.openPage(currentPage).render(bitmap, r, m, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
pdfViewer.setImageMatrix(m);
pdfViewer.setImageBitmap(bitmap);
pdfViewer.invalidate();
} catch (Exception ex) {
Log.v(TAG, ex.getMessage());
} finally {
}
private ArrayList<Bitmap> pdfToBitmap(File pdfFile) {
ArrayList<Bitmap> bitmaps = new ArrayList<>();
try {
PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY));
Bitmap bitmap;
final int pageCount = renderer.getPageCount();
for (int i = 0; i < pageCount; i++) {
PdfRenderer.Page page = renderer.openPage(i);
int width = getResources().getDisplayMetrics().densityDpi / 72 * page.getWidth();
int height = getResources().getDisplayMetrics().densityDpi / 72 * page.getHeight();
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
bitmaps.add(bitmap);
// close the page
page.close();
}
// close the renderer
renderer.close();
} catch (Exception ex) {
ex.printStackTrace();
}
return bitmaps;
}
dependencies {
implementation 'com.tom_roush:pdfbox-android:1.8.10.1'
}
PDDocument pd = PDDocument.load (new File (in));
PDFRenderer pr = new PDFRenderer (pd);
Bitmap bitmap = pr.renderImageWithDPI(0, 300);