2013-02-12 59 views
2

我想从PDF的第一页创建图像。我在java中使用iText。你能建议我怎么做才能提取PDF的第一页作为图像?如何在iText中从pdf的第一页创建图像

Document document = new Document();    
PdfWriter writer = PdfWriter.getInstance( 
    document, new FileOutputStream(RESULT));  
document.open();     

File extStore = Environment.getExternalStorageDirectory(); 
String path=extStore.getPath()+"/FirstPdf.pdf"; 

PdfReader reader = new PdfReader(path); 
int n = reader.getNumberOfPages(); 
PdfImportedPage page; 
for (int i = 1; i <= n; i++) { 
    page = writer.getImportedPage(reader, i); 
// Image.getInstance(page) ; 
} 

document.close(); 

我写了上面的代码。如何将pdf的第一页作为图像提取并保存在SDCARD中?

+0

iText的不是这是正确的工具,因为它不是PDF渲染器。 – 2013-02-12 12:15:20

+0

你能告诉我应该遵循什么程序来完成我的目标? – 2013-02-12 13:21:41

+0

寻找在android上工作的pdf渲染器,并允许您导出缩略图。 – 2013-02-12 14:21:33

回答

5

iText不适用于此目的。

http://www.java2s.com/Open-Source/Android_Free_Code/Pdf/Download_Free_code_Android_Pdf_Viewer_Library.htm

的jar文件在压缩。

下载该库PdfViewer.jar和试试这个代码:

byte[] bytes; 
     try { 

      File file = new File("/storage/extSdCard/Test.pdf"); 
      FileInputStream is = new FileInputStream(file); 

      // Get the size of the file 
      long length = file.length(); 
      bytes = new byte[(int) length]; 
      int offset = 0; 
      int numRead = 0; 
      while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) { 
       offset += numRead; 
      } 
      ByteBuffer buffer = ByteBuffer.NEW(bytes); 
      String data = Base64.encodeToString(bytes, Base64.DEFAULT); 
      PDFFile pdf_file = new PDFFile(buffer); 
      PDFPage page = pdf_file.getPage(2, true); 

      RectF rect = new RectF(0, 0, (int) page.getBBox().width(), 
      (int) page.getBBox().height()); 

      Bitmap image = page.getImage((int)rect.width(), (int)rect.height(), rect); 
      FileOutputStream os = new FileOutputStream("/storage/extSdCard/pdf.jpg"); 
      image.compress(Bitmap.CompressFormat.JPEG, 80, os); 
      //((ImageView) findViewById(R.id.testView)).setImageBitmap(image); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

你可以改变周围的矩形,使其提取你想等也相当不错的PDF格式的任何部分。在找到解决方案之前,花了大约16个小时将我的头靠在墙上。不确定是否有可能没有swing awt库。对不起,存储是硬编码的,但这是我当时最担心的问题。

4

我最终发现如何去做最初提出的问题!

你需要iTextG库(itextg-5.5.3.jar),scpkix-jdk15on.1.47.0.1.jar & scprov-jdk15on-1.47.0.2.jar

内,其中希望从调用它:

public static final String RESULT = "/storage/sdcard0/dirAtExtStorage/Img%s.%s"; 

public void extractImages(String filename) 
    throws IOException, DocumentException { 

    PdfReader reader = new PdfReader(filename); 
    PdfReaderContentParser parser = new PdfReaderContentParser(reader); 
    MyImageRenderListener listener = new MyImageRenderListener(RESULT); 
    for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
     parser.processContent(i, listener); 
    } 
} 

内MyImageRendererListener.java:

public class MyImageRenderListener implements RenderListener{ 

private String path; 

public MyImageRenderListener(String path) { 
    this.path = path; 

    } 



@Override 
public void beginTextBlock() { 
    // TODO Auto-generated method stub 

} 

@Override 
public void endTextBlock() { 
    // TODO Auto-generated method stub 

} 

public void renderImage(ImageRenderInfo renderInfo) { 
    try { 
     System.out.print("renderImage"); 
     String filename; 
     FileOutputStream os; 
     PdfImageObject image = renderInfo.getImage(); 
     if (image == null) return; 
     filename = String.format(path, renderInfo.getRef().getNumber(), image.getFileType()); 
     os = new FileOutputStream(filename); 
     os.write(image.getImageAsBytes()); 
     os.flush(); 
     os.close(); 
    } catch (IOException e) { 
     System.out.println(e.getMessage()); 
    } 
} 

@Override 
public void renderText(TextRenderInfo arg0) { 
    // TODO Auto-generated method stub 
    } 
    } 

享受家伙

相关问题