我正在使用 itext 库来创建图像和文本的 pdf。以下代码在 4 台设备中的 3 台上运行良好,但在第 4 台设备上出现 OutOfMemoryException。该代码在 AsyncTask doinbackground 方法中运行,它使用 bimtmap 对象检查每个 jpg 文件(来自 sdcard 的文件目录)的旋转,测量宽度与高度,并在必要时将 itext Image 对象旋转 90 度。
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$Sync.innerSetException(FutureTask.java:273) 的 android.os.AsyncTask$3.done(AsyncTask.java:278) 处执行 doInBackground() 时发生错误java.util.concurrent.FutureTask.setException(FutureTask.java:124) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 在 java.util.concurrent.FutureTask.run(FutureTask.java: 137) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run( ThreadPoolExecutor.java:569) at java.lang.Thread.run(Thread.java:856) 原因:android.graphics.BitmapFactory.nativeDecodeStream(Native Method) at android.graphics.BitmapFactory 的 java.lang.OutOfMemoryError。decodeStream(BitmapFactory.java:493) at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:299) at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:324) at com.wake.snapshot.CreateDocumentActivity$CreateAndSendPdf.doInBackground (CreateDocumentActivity.java:315) at com.wake.up.your.wealth.snapshot.CreateDocumentActivity$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 个snapshot.CreateDocumentActivity$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 个snapshot.CreateDocumentActivity$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 个