2011-04-06 86 views
0

是否有任何兼容的android庫將PDF頁面轉換爲圖像?我發現了幾個適合我需求的java庫(pdfbox,jpod,jpedal,icepdf),但他們給我編譯錯誤(基於awT或swt)。我目前正在android上製作pdf查看器,如果我不必從頭開始編寫pdf解碼,我會很棒。用於從pdf文件創建圖像的Android兼容庫?

+0

嘗試此:http://stackoverflow.com/a/16294833/2027232 – 2013-04-30 07:58:36

回答

4

最好的辦法是這個庫:http://code.google.com/p/apv/

這是一個C項目,所以你需要使用JNI調用。

+0

這是基於MuPDF這是AGPL許可證,並不完全兼容商業軟件。只是FYI ... – startoftext 2014-12-12 21:04:00

1

感謝您的幫助。我檢查了項目並使用了MuPDF庫(APV項目基於此庫)。它工作正常!非常感謝上帝保佑。

0

使用itextpdf5.3.1.jar

下面是從PDF提取圖像的代碼:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);`enter code here` 
    PdfReader reader; 

    File file = new File("/sdcard/vineeth/anni.prc"); 
    try{ 
     reader = new PdfReader(file.getAbsolutePath()); 

     for (int i = 0; i < reader.getXrefSize(); i++) { 
      PdfObject pdfobj= reader.getPdfObject(i); 
      if (pdfobj == null || !pdfobj.isStream()) { 
       continue; 
      } 

      PdfStream stream = (PdfStream) pdfobj; 
      PdfObject pdfsubtype = stream.get(PdfName.SUBTYPE); 

      if (pdfsubtype != null && pdfsubtype.toString().equals(PdfName.IMAGE.toString())) { 
       byte[] img = PdfReader.getStreamBytesRaw((PRStream) stream); 
       FileOutputStream out = new FileOutputStream(new 
       File(file.getParentFile(),String.format("%1$05d", i) + ".jpg")); 
       out.write(img); out.flush(); out.close(); 
      } 
     } 
    } catch (Exception e) { } 
} 
+1

你應該提供一些解釋和代碼。 – 2012-10-01 18:04:53

+0

上面的代碼僅包含pdf中的_extracts_圖像,它不會生成PDF文件的圖像。 – Minsky 2014-08-07 08:16:34

1

以上答案都不幫我,所以我寫我的解決方案。

使用這個庫:android-pdfview和下面的代碼,就可以可靠地轉換的PDF頁面轉換成圖片(JPG,PNG):

DecodeServiceBase decodeService = new DecodeServiceBase(new PdfContext()); 
decodeService.setContentResolver(mContext.getContentResolver()); 

// a bit long running 
decodeService.open(Uri.fromFile(pdf)); 

int pageCount = decodeService.getPageCount(); 
for (int i = 0; i < pageCount; i++) { 
    PdfPage page = decodeService.getPage(i); 
    RectF rectF = new RectF(0, 0, 1, 1); 

    // do a fit center to 1920x1080 
    double scaleBy = Math.min(AndroidUtils.PHOTO_WIDTH_PIXELS/(double) page.getWidth(), // 
      AndroidUtils.PHOTO_HEIGHT_PIXELS/(double) page.getHeight()); 
    int with = (int) (page.getWidth() * scaleBy); 
    int height = (int) (page.getHeight() * scaleBy); 

    // you can change these values as you to zoom in/out 
    // and even distort (scale without maintaining the aspect ratio) 
    // the resulting images 

    // Long running 
    Bitmap bitmap = page.renderBitmap(with, height, rectF); 

    try { 
     File outputFile = new File(mOutputDir, System.currentTimeMillis() + FileUtils.DOT_JPEG); 
     FileOutputStream outputStream = new FileOutputStream(outputFile); 

     // a bit long running 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); 

     outputStream.close(); 
    } catch (IOException e) { 
     LogWrapper.fatalError(e); 
    } 
} 

你應該通過使用AsyncTask或IE在後臺做這個工作類似於相當多的方法需要計算或IO時間(我在註釋中標記了它們)。