我正在使用itext库来创建图像和文本的pdf。以下代码适用于4个设备中的3个,但在第4个设备上,我得到了OutOfMemoryException。代码在AsyncTask doinbackground方法中运行,它使用bimtmap对象检查每个jpg文件(来自sdcard的文件目录)的旋转,根据高度测量宽度,并在必要时旋转itext Image对象90degrees。 / p>
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:执行时发生错误 doInBackground()在android.os.AsyncTask $ 3.done(AsyncTask.java:278)at at java.util.concurrent.FutureTask中$ Sync.innerSetException(FutureTask.java:273) at java.util.concurrent.FutureTask.setException(FutureTask.java:124) at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:307) 在java.util.concurrent.FutureTask.run(FutureTask.java:137)at android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:208)at at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 在 java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:569) 在java.lang.Thread.run(Thread.java:856)引起: java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493)at at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:299)at at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:324)at com.wake.snapshot.CreateDocumentActivity $ CreateAndSendPdf.doInBackground(CreateDocumentActivity.java:315) 在 com.wake.up.your.wealth.snapshot.CreateDocumentActivity $ CreateAndSendPdf.doInBackground(CreateDocumentActivity.java:1) 在android.os.AsyncTask $ 2.call(AsyncTask.java:264)at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:305)... 另外5个
答案 0 :(得分:1)
由于你只需要一个大小的位图使用BitmapFactory和inJustDecodeBounds选项http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inJustDecodeBounds ...它将返回null Bitmap,但你的大小将在outHeight和outWidth中