2013-07-24 66 views
0

我正在使用itext库来创建图像和文本的pdf。以下代码在4个设备中的3个设备上正常工作,但在第4个设备上,我得到OutOfMemoryException。代码在AsyncTask doinbackground方法中运行,它使用bimtmap对象检查每个jpg文件的旋转(sdcard中的文件的目录),根据高度测量宽度,并在必要时旋转itext Image对象90度。Android itext pdf库OutOfMemoryError

 try { 

      Document document = new Document(); 
      PdfWriter.getInstance(document, new FileOutputStream(
        Environment.getExternalStorageDirectory() 
          + "/doc" + documentID + ".pdf")); 
      document.open(); 
      document.setMargins(0f, 0f, 0f, 0f); 
      document.add(new Paragraph(documentNameEt.getText().toString())); 
      document.add(new Paragraph(makeUserDeets())); 
      Bitmap b = null; 
      Image image = null; 
      Rectangle r = document.getPageSize(); 
      for (String d : paths[0]) { 
       Log.d("senddataobj", d); 
       image = Image.getInstance(d); 
       b = BitmapFactory.decodeFile(d); 
       if (b.getWidth() > b.getHeight()) { 
        image.setRotationDegrees(90); 
        Log.d(d, "rotating"); 
       } 
       b.recycle(); 
       image.scaleToFit(r.getWidth(), r.getHeight()); 
       document.add(image);     
      } 

      document.close(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

了java.lang.RuntimeException:而在 java.util.concurrent.FutureTask中$在android.os.AsyncTask $ 3.done(AsyncTask.java:278)执行 doInBackground()时出错Sync.innerSetException(FutureTask.java:273) at java.util.concurrent.FutureTask.setException(FutureTask.java:124) at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:307) at java.util.concurrent.FutureTask.run(FutureTask.java:137)at android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:208)at java.util.concurrent.ThreadP oolExecutor.runWorker(ThreadPoolExecutor.java:1076) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:569) at java.lang.Thread.run(Thread.java:856)引起: java.lang.OutOfMemoryError在处 android.graphics.BitmapFactory.decodeFile android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493) android.graphics.BitmapFactory.nativeDecodeStream(母语方法)(BitmapFactory.java:299 )在 android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:324)在 com.wake.snapshot.CreateDocumentActivity $ CreateAndSendPdf.doInBackground(CreateDocumentActivity.java:315) 在 com.wake.up.your.wealth。 snapshot.CreateDocume ntActivity $ CreateAndSendPdf.doInBackground(CreateDocumentActivity.java:1) at android.os.AsyncTask $ 2.call(AsyncTask.java:264)at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:305)。 .. 5个

+0

有规模有多大的图像(尺寸)?你可能真的内存不足。你是否考虑过按照图像组装文档图像,而不是将它们全部放在内存中? – dmon

+0

谢谢,我使用选项类来获取具有维度的空位图对象,然后在选项对象中使用了调光。 – brux

回答

1

当你只需要一个尺寸的位图使用BitmapFactory与inJustDecodeBounds选项http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inJustDecodeBounds的...这将返回null位图,但你会在outHeight和outWidth

+0

好的我已经添加了这段代码,我是否也回收了位图对象? – brux

+0

没有...位图将为null,您将从options.outxxxx字段获取大小...使用'em而不是b.getxxxx() – Selvin

+0

好的,非常感谢我使用此方法测试此刻 – brux