2011-04-06 41 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时间(我在注释中标记了它们)。