2014-06-21 3 views
0

IText를 사용하여 읽으려는 ~ 5MB 파일이 있습니다. 제 목표는이 PDF의 많은 페이지를 다른 PDF에 겹쳐서 만드는 것입니다.PDF를 읽을 때 IText OutOfMemoryError (Android)

이 내 코드입니다 :

try {    
    AssetManager assetManager = getActivity().getAssets(); 
    InputStream istr = null; 
    PdfReader reader = null; 
    istr =(InputStream) assetManager.open("chem.pdf"); 
    reader=new PdfReader(istr); 
    Document document = new Document(); 
    PdfWriter writer= PdfWriter.getInstance(document, new FileOutputStream(Environment.getExternalStorageDirectory()+ "/pdfpdfpdfpdfpdf.pdf")); 
    document.open(); 
    document.add(new Paragraph("               Generated By Harshvardhan Gupta")); 
    document.newPage(); 
    PdfContentByte canvas = writer.getDirectContent(); 
    PdfImportedPage page; 
    //Rectangle r=document.getPageSize(); 
    float pos=720; 
    float CurPsize=0; 
    float counter=0; 
    float oldc=0; 
    //r.getBottom(); 
    for(int m=1;m<35;m++,counter++) { 
     page = writer.getImportedPage(reader, m); 
     Rectangle r=reader.getPageSize(m); 
     CurPsize= (r.getTop()-r.getBottom()); 
     pos=pos-CurPsize; 
     Rectangle q=reader.getPageSize(m+1); 
     int mq=(int) (q.getTop()-q.getBottom()); 
     if(pos<mq+counter*25+50){ 
      document.newPage(); 
      pos=720; 
      counter=0; 
     } 
     canvas.setTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_FILL); 
     canvas.addTemplate(page, 1f, 0, 0, 1,100,pos-70-counter*25); 
     BaseFont bf= BaseFont.createFont(); 
     canvas.setTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE); 
     canvas.beginText(); 
     canvas.setFontAndSize(bf,14); 
     canvas.setTextMatrix(75, (float) ((float) (pos-70-counter*25)-10+CurPsize)); 
     canvas.setLineWidth(0.5f); 
     canvas.showText(m+"."+" "); 
     canvas.endText(); 
    } 
    document.close(); 
    writer.freeReader(reader); 
    writer.close(); 
    reader.close(); 
    //spinner.setVisibility(View.INVISIBLE); 
    Log.d("OK", "done"); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (DocumentException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
//spinner.setVisibility(View.INVISIBLE); 

진행 물건의 공정한 금액이 있습니다,하지만 난 PDF가 자산에서 읽어도 전에 OutOfMemoryError를 슬로우 생각합니다.

이 전체 오류 로그입니다 :

06-21 19:39:12.090: E/AndroidRuntime(6844): FATAL EXCEPTION: main 
06-21 19:39:12.090: E/AndroidRuntime(6844): java.lang.OutOfMemoryError 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.itextpdf.text.pdf.PdfReader.FlateDecode(PdfReader.java:2004) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.itextpdf.text.pdf.PdfReader.FlateDecode(PdfReader.java:1859) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.itextpdf.text.pdf.FilterHandlers$Filter_FLATEDECODE.decode(FilterHandlers.java:107) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.itextpdf.text.pdf.PdfReader.decodeBytes(PdfReader.java:2409) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.itextpdf.text.pdf.PdfReader.decodeBytes(PdfReader.java:2357) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.itextpdf.text.pdf.PdfReader.getStreamBytes(PdfReader.java:2422) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.itextpdf.text.pdf.PdfReader.readObjStm(PdfReader.java:1363) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.itextpdf.text.pdf.PdfReader.readDocObj(PdfReader.java:1305) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.itextpdf.text.pdf.PdfReader.readPdf(PdfReader.java:649) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:187) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:328) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:349) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.mainpackage.FragmentOne$1.onClick(FragmentOne.java:88) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at android.view.View.performClick(View.java:3511) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at android.view.View$PerformClick.run(View.java:14105) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at android.os.Handler.handleCallback(Handler.java:605) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at android.os.Handler.dispatchMessage(Handler.java:92) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at android.os.Looper.loop(Looper.java:137) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:592) 
06-21 19:39:12.090: E/AndroidRuntime(6844):  at dalvik.system.NativeStart.main(Native Method) 

주 내가 작은 파일 (200킬로바이트)를 사용하여 시도하고 작동합니다. 이것은 iText를 사용하여 Android에서 큰 파일을 읽을 수 없다는 뜻입니까?

+0

어떤 버전을 사용하고 있습니까? PDF를 공유 할 수 있습니까? –

답변

1

필자의 PDF에는 펜 도구를 사용하는 많은 주석이있다. 그것이 문제의 원인이었습니다. 펜 마크를 제거했는데 pdf가 잘로드됩니다.

+0

따라서 본질적으로 파일의 (완전히 확장 된) 내용이 너무 큽니다. PDF를 줄일 수없는 경우 부분로드가 대안 일 수 있습니다. – mkl

+0

오? 부분적으로로드하는 방법을 알려주시겠습니까? 로드하려는 경우 x, y, z 페이지를 말하고 어떻게해야합니까? –

+1

* 부분적으로로드하는 방법 *'RandomAccessFileOrArray'를 받아들이는'PdfReader' 생성자는 부분 모드에서 작동하는 것입니다, cf. 그것의 JavaDoc 주석. – mkl