【问题标题】:Android pdf writer APW high resolution images cause out of memory expectionAndroid pdf writer APW高分辨率图像导致内存不足异常
【发布时间】:2013-09-09 15:51:37
【问题描述】:

我正在使用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本质上是把它转换成位图,也就是逐个像素地表示图片,然后把它变成字符串格式,意思是你使用哪种图片格式都没有关系,它可能是最好是位图。

【问题讨论】:

  • 这个问题已经一年了。你成功了吗?

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


【解决方案1】:

首先,您提到的分辨率非常高。我已经提到了与Android中图像相关的问题in this Answer

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

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

【讨论】:

  • 我认为您建议的所有解决方案都可以使用,问题是我对库的理解不够好,无法进行修改和实施。查看库,我可以看到 for 循环中使用的 stringbuilders 区域以生成要输出的最终字符串,但是 LruCacheing 字符串或部分返回它似乎还需要编辑其他源文件,我不这样做'不了解的工作原理。我不知道修改它们是否会影响 pdf 代码结构,可能会破坏它们,这是我的主要障碍,可以这么说。
  • 当您遇到异常时,您是否检查了监控应用程序使用了多少内存?
  • Logcat 在崩溃前给出了 40 - 60mb 范围内的堆大小。正常堆大小在 10-15mb 范围内。我可以在 ddms 上检查堆大小,但这是一样的吗?我将编辑我的问题以包含该信息。
猜你喜欢
  • 2012-05-08
  • 2010-12-04
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 2012-05-28
  • 2013-06-02
相关资源
最近更新 更多