如何将PDF格式转换为图像?

时间:2012-07-02 11:06:51

标签: android pdf image-conversion

使用pdfbox会显示错误:

import java.awt
import javax`

基于以下代码:

imageType = BufferedImage.TYPE_INT_ARGB; //need to specifies java.awt
String[] formats = ImageIO.getReaderFormatNames(); //need to specifies javax

3 个答案:

答案 0 :(得分:7)

最后我找到了解决方案。我们不能在Android上使用awt,所以,最后转到http://sourceforge.net/projects/andpdf/files/上的pdf viewver lib

找出apk以及pdf to image的来源。

这是将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());
        }



}

答案 1 :(得分:2)

为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;
    }

希望这有助于某人。

答案 2 :(得分:0)

查看此库https://github.com/barteksc/AndroidPdfViewer 经过几周的搜索,这是我发现的唯一一个库:

  • 支持Android API 14(可能更低,但我还没有测试过它)。
  • 使用符合我需求的许可证(Apache License 2.0)。
  • 实际上加载PDF而不会抛出错误。