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本质上是把它转换为位图,即逐像素表示图像然后将其转换为字符串格式,这意味着您使用哪种图像格式并不重要,它也可能是位图。

4

1 回答 1

1

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

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

希望这会有所帮助。如果它没有对此答案发表评论,我将添加更多解决方案。

于 2013-09-06T20:10:06.080 回答