本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

读取 PDF 时出现 IText OutOfMemoryError (Android)

发布于2023-09-25 20:19     阅读(365)     评论(0)     点赞(1)     收藏(2)


我有一个大约 5 MB 的文件,我想使用 IText 读取该文件。我的目标是将这个 PDF 中的许多页面叠加到另一个 PDF 上。

这是我的代码:

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)

请注意,我尝试使用较小的文件(200kb)并且它有效。这是否意味着我无法使用 iText 在 Android 上读取这么大的文件?


解决方案


我的 pdf 有很多使用钢笔工具的注释。这就是造成问题的原因。我去掉了笔迹,pdf 加载得很好。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/677406/8eee9343d7ad67c086fc/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

1 0
收藏该文
已收藏

评论内容:(最多支持255个字符)