安卓PDF写作器APW:高分辨率图片导致内存溢出异常

3
我在我的应用程序中成功地使用android pdf writer(apw)。然而,当我尝试在pdf文档中包含高分辨率时,会出现内存不足异常。
在创建pdf文件之前,库必须将内容本身转换为字符串(表示原始pdf内容),然后将其转换为字节数组。字节数组写入文件输出流中(通过网站示例查看)。
当生成字符串时会出现内存不足异常,因为用字符串格式表示位图图像的所有像素非常占用内存。我可以使用Android API降低图像的采样率,但是必须以高分辨率(~2000 x 1000)将图像放入PDF中。
有许多扫描仪类型的应用程序似乎能够生成pdf高分辨率图像,所以肯定有一种方法可以解决这个问题。虽然它们可能使用其他库,但是鉴于该库是免费的且因此很受欢迎(?), 肯定有人已经找到了绕过此问题的方法。
我给开发者发送了电子邮件,但没有回复。
潜在的解决方案(我能想到的)包括:

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

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

然而,作为相对的Java新手(甚至更不懂PDF规范),我无法充分理解库以自行完成此操作。

有人遇到过这个问题并找到了解决方法吗? 任何人都愿意冒险提出建议,或者甚至查看库本身是否有某种修复方法。

感谢您的帮助。 nme32

编辑:

  1. 在崩溃之前,Logcat显示堆大小在40到60mb的范围内。我理解(如果不正确请纠正)Android根据其他正在运行的应用程序限制可用内存,但大约在50mb左右,具体取决于设备。

  2. 加载图像时,我认为APW基本上将其转换为位图,即以逐像素方式表示图像,然后将其放入字符串格式中,这意味着使用哪种图像格式并不重要,它可以是位图。


自从提出这个问题已经过去一年了,你是否成功让它工作了? - Jaroslav
1个回答

0

首先,您提到的分辨率非常高。我已经在Android中提到了与图像相关的问题在此答案中

其次,如果第一个解决方案对您不起作用,我建议使用基于磁盘的LruCache。将块存储到该基于磁盘的缓存中,然后检索并使用它。这是一个示例

希望这可以帮助您。如果没有,请在此答案中发表评论,我将添加更多解决方案。


你提出的所有解决方案我认为都可以,问题是我不太了解这个库,无法进行修改和实现。看着这个库,我可以看到在for循环中使用了stringbuilders区域来生成最终要输出的字符串,但是LruCacheing字符串或部分返回似乎需要编辑其他源文件,而我不理解它们的工作原理。我不知道修改它们是否会影响pdf代码结构,可能会损坏它们,这对我来说是一个主要障碍,可以这么说。 - nme32
你有在监视器上检查过应用程序在出现异常时使用的总内存量吗? - Quamber Ali
Logcat在崩溃之前的堆大小范围为40-60mb。正常堆大小在10-15mb的范围内。我可以在ddms上检查堆大小,但这是同一件事吗?我将编辑我的问题以包含该信息。 - nme32

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接