Android pdf writer APW高分辨率图像导致outofmemory异常

时间:2013-09-05 17:40:15

标签: java android pdf pdf-generation out-of-memory

我正在使用android pdf writer  (apw)在我的应用程序中成功的大部分。但是,当我尝试在pdf文档中包含高分辨率时,我会遇到内存不足的异常。

在创建pdf文件之前,库必须将内容本身转换为字符串(表示原始pdf内容),然后将其转换为字节数组。字节数组在文件输出流中写入文件(参见网站示例)。

生成字符串时会发生内存不足,因为以字符串格式表示位图图像的所有像素都是内存密集型的。我可以使用android API对图像进行下采样,但是,必须将图像以高分辨率(~2000 x 1000)放入pdf中。

有许多扫描仪类型的应用程序似乎能够生成pdf高分辨率图像,因此必须有一种解决方法,当然。当然,他们可能正在使用其他图书馆,但肯定有人已经找到了解决这个库的方法,因为它是免费的,因此很受欢迎(?)

我给开发者发了电子邮件,但没有回复。

潜在的解决方案(我能想到)包括:

修改库以加载表示例如的字符串PDF的前10%,并按块写入文件块。 (编辑)

修改库以将字符串输出流或其他输出流输出到临时文件(或最终文件),因为实际的pdf内容正在pdfwriter对象中写入。

然而,作为一个相对的java noob(甚至更多的pdf规范noob),我无法很好地理解该库本身。

有没有人遇到这个问题并找到解决办法?任何人都愿意冒险提出建议,或者看看图书馆本身,看看是否有某种修复。

感谢您的帮助。 nme32

修改:

  1. Logcat表示崩溃前堆大小在40到60mb之间。我理解(如果不是,请纠正我)Android会根据正在运行的其他内容限制应用程序的可用内存,尽管它位于50mb球场,具体取决于设备。

  2. 加载图片时,我认为APW基本上将其转换为位图,即逐像素地表示图像然后将其放入字符串格式,这意味着您使用的图像格式无关紧要,它可能与好吧是位图。

1 个答案:

答案 0 :(得分:1)

首先,你提到的决议非常高。我已经提到了与Android in this Answer

中的图像相关的问题

其次,如果第一个解决方案对你不起作用,我建议使用基于磁盘的LruCache。并将块存储到基于磁盘的缓存中,然后检索并使用它。 Here is an Example of that

希望这会有所帮助。如果它没有评论这个答案,我会添加更多的解决方案。