使用 pdfbox 显示错误:
import java.awt
import javax`
基于以下代码:
imageType = BufferedImage.TYPE_INT_ARGB; //need to specifies java.awt
String[] formats = ImageIO.getReaderFormatNames(); //need to specifies javax
使用 pdfbox 显示错误:
import java.awt
import javax`
基于以下代码:
imageType = BufferedImage.TYPE_INT_ARGB; //need to specifies java.awt
String[] formats = ImageIO.getReaderFormatNames(); //need to specifies javax
最后我找到了解决方案。我们不能在 Android 上使用 awt,所以,最后去http://sourceforge.net/projects/andpdf/files/上的 pdf 查看器库
找出apk以及pdf到图像的来源。
这是将pdf转换为图像的myclass:
package com.print;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import net.sf.andpdf.nio.ByteBuffer;
import net.sf.andpdf.refs.HardReference;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.RectF;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFImage;
import com.sun.pdfview.PDFPage;
import com.sun.pdfview.PDFPaint;
import com.sun.pdfview.decrypt.PDFAuthenticationFailureException;
import com.sun.pdfview.font.PDFFont;
public class Transformer extends Activity{
/////////////////////////////////////////////
private static final int STARTPAGE = 1;
private static final float STARTZOOM = 1.0f;
private static final String TAG = "PDFVIEWER";
Bitmap _bitmap=null;
// private GraphView mGraphView;
private String pdffilename;
private PDFFile mPdfFile;
private int mPage;
private float mZoom;
private File mTmpFile;
private PDFPage mPdfPage;
private Thread backgroundThread;
private Handler uiHandler;
ImageView myimg;
TextView command;
Context context;
ProgressDialog _p=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.trans);
context=Transformer.this;
uiHandler = new Handler();
initContrils();
}
private void initContrils() {
// TODO Auto-generated method stub
boolean showImages = getIntent().getBooleanExtra(printDemo.EXTRA_SHOWIMAGES, true);
PDFImage.sShowImages = showImages;
boolean antiAlias = getIntent().getBooleanExtra(printDemo.EXTRA_ANTIALIAS, true);
PDFPaint.s_doAntiAlias = antiAlias;
boolean useFontSubstitution = getIntent().getBooleanExtra(printDemo.EXTRA_USEFONTSUBSTITUTION, false);
PDFFont.sUseFontSubstitution= useFontSubstitution;
boolean keepCaches = getIntent().getBooleanExtra(printDemo.EXTRA_KEEPCACHES, false);
HardReference.sKeepCaches= keepCaches;
if (this.getIntent() != null) {
pdffilename = getIntent().getStringExtra(printDemo.EXTRA_PDFFILENAME);
}
mPage = STARTPAGE;
mZoom = STARTZOOM;
myimg=(ImageView)findViewById(R.id.imageView1);
command=(TextView)findViewById(R.id.textView1);
_p=new ProgressDialog(context);
_p.setMessage("Converting........");
_p.setCancelable(false);
_p.show();
setContent();
}
private void setContent() {
try {
parsePDF(pdffilename);
startRenderThread(mPage, mZoom);
}
catch (PDFAuthenticationFailureException e) {
Log.e("Amit...","Error....");
}
}
private synchronized void startRenderThread(final int page, final float zoom) {
Log.e("Amit","renderrar");
if (backgroundThread != null)
return;
backgroundThread = new Thread(new Runnable() {
@Override
public void run() {
try {
if (mPdfFile != null) {
showPage(page, zoom);
}
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
}
backgroundThread = null;
}
});
updateImageStatus();
backgroundThread.start();
}
private void updateImageStatus() {
if (backgroundThread == null) {
updateTexts();
return;
}
uiHandler.postDelayed(new Runnable() {
@Override public void run() {
updateImageStatus();
}
}, 1000);
}
/*
private void setPageBitmap(Bitmap bi) {
if (bi != null)
_bitmap = bi;
else {
_bitmap = Bitmap.createBitmap(100, 100, Config.RGB_565);
Canvas can = new Canvas(_bitmap);
can.drawColor(Color.RED);
Paint paint = new Paint();
paint.setColor(Color.BLUE);
can.drawCircle(50, 50, 50, paint);
paint.setStrokeWidth(0);
paint.setColor(Color.BLACK);
can.drawText("Bitmap", 10, 50, paint);
}
}*/
protected void updateTexts() {
int maxCmds = PDFPage.getParsedCommands();
int curCmd = PDFPage.getLastRenderedCommand()+1;
if(maxCmds==curCmd){
_p.dismiss();
finish();
Log.e("Amit","check update_finish()");
}else {
setContent();
Log.e("Amit","check update_again");
}
}
private Bitmap showPage(int page, float zoom) throws Exception {
Bitmap b=null;
try {
Log.e("amit","Go to page bitmap");
mPdfPage = mPdfFile.getPage(page, true);
float wi = mPdfPage.getWidth();
float hei = mPdfPage.getHeight();
RectF clip = null;
Bitmap bi = mPdfPage.getImage((int)(wi*zoom), (int)(hei*zoom), clip, true, true);
b=bi;
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
File f = new File(Environment.getExternalStorageDirectory()+ File.separator + "Firstpdf.jpg");
f.createNewFile();
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
Log.e("amit","Go to page bitmap______SAVE");
} catch (Throwable e) {
Log.e(TAG, e.getMessage(), e);
}
return b;
}
private void parsePDF(String filename) throws PDFAuthenticationFailureException {
try {
File f = new File(filename);
long len = f.length();
if (len == 0) {
Log.e("amit","No file found");
}
else {
Log.e("amit","file '" + filename + "' has " + len + " bytes");
openFile(f);
}
}
catch (PDFAuthenticationFailureException e) {
throw e;
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* <p>Open a specific pdf file. Creates a DocumentInfo from the file,
* and opens that.</p>
*
* <p><b>Note:</b> Mapping the file locks the file until the PDFFile
* is closed.</p>
*
* @param file the file to open
* @throws IOException
*/
public void openFile(File file) throws IOException {
// first open the file for random access
RandomAccessFile raf = new RandomAccessFile(file, "r");
// extract a file channel
FileChannel channel = raf.getChannel();
// now memory-map a byte-buffer
ByteBuffer bb =
ByteBuffer.NEW(channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()));
// create a PDFFile from the data
mPdfFile = new PDFFile(bb);
Log.e("Amit","Pages-----"+mPdfFile.getNumPages());
}
}
浪费了几天时间搜索适用于 Android 的 LGPL PDF 库。API 级别 21 中引入的PdfRenderer是 PDF 转图像的最佳解决方案。
示例代码:
// create a new renderer
PdfRenderer renderer = new PdfRenderer(getSeekableFileDescriptor());
// let us just render all pages
final int pageCount = renderer.getPageCount();
for (int i = 0; i < pageCount; i++) {
Page page = renderer.openPage(i);
// say we render for showing on the screen
page.render(mBitmap, null, null, Page.RENDER_MODE_FOR_DISPLAY);
// do stuff with the bitmap
// close the page
page.close();
}
// close the renderer
renderer.close();
private ParcelFileDescriptor getSeekableFileDescriptor()
{
ParcelFileDescriptor fd = null;
try
{
fd = ParcelFileDescriptor.open(new File("PATH TO YOUR PDF"),
ParcelFileDescriptor.MODE_READ_ONLY);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
return fd;
}
希望这可以帮助某人。
查看这个库https://github.com/barteksc/AndroidPdfViewer 经过几周的搜索,这是我发现的唯一一个库: