2012-07-02 210 views
9

使用PDFBOX显示错误:如何将PDF转换为图像?

import java.awt 
import javax` 
基于以下代码

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

终于我找到解决方案..... 我们不能在Android上使用awt。 所以,最后去的PDF viewver LIB上 http://sourceforge.net/projects/andpdf/files/ 找出PDF图像的APK,也源.... thenx,对不起for my english .... – Amit

回答

6

最后我找到了解决方案。我们不能使用awt与Android,所以,最后去寻求PDF查看器库上http://sourceforge.net/projects/andpdf/files/

找出apk和图片的源代码图像。

这里是MyClass的将PDF转换为图像:

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



} 
+0

请在上面的链接中告诉我有关此软件正在使用的许可证。我正在寻找一些非GPL/LGPL ...感谢您的帮助 – Sriram

+0

你好,我已经有很多PDF解决方案,但没有得到任何正确的方法。我无法找到任何免费的图书馆(罐子)的PDF图像。以及如何在我的活动类上实现该jar ...?请指导我... –

+3

这不适用API 21以下。仍awt错误未解决。另外printDemo没有定义。 你可能会添加链接到你使用的库,而不是apk?谢谢 –

2

浪费几天寻找LGPL PDF库为Android。在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

任何API <21? – Jaydev

0

退房这个库https://github.com/barteksc/AndroidPdfViewer 几个星期的寻找之后,这是我发现的唯一库:

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