Text2Store
下载

博客

如何打印整段 iMessage 对话(即使有 84,000 条信息)

信息一旦超过几千条,“打印整段对话”就不再是功能清单上的一个勾选项,而是一个工程问题。很多人吃了苦头才发现这一点:论坛里到处是永远卡住的导出、第 500 页之后全是空白页的导出,或者干脆崩溃的导出。我们也是吃了苦头才发现的,所以下面说说内部实际发生了什么,以及让一段 84,000 条信息的对话能够打印出来需要做些什么。

为什么长对话会让导出工具出问题

几乎每一个生成漂亮记录的工具,包括我们自己的,最终都要让浏览器引擎来排版对话并分页。浏览器打印引擎是为网页设计的,而不是为一份包含多年信息和数千张照片的单一文档设计的。让它一次性完成分页,就会依次出现三个越来越严重的问题:耗时极长;内存吃紧时悄悄输出空白页;最后渲染进程内存耗尽而崩溃。一份影响了我们工作的实际报告:一次 8,400 条信息的导出生成了 811 页的 PDF,从第 583 页起全是空白。引擎没有报错,只是停止了绘制。

行之有效的做法:分块、校验、合并

  • 分块。记录每次最多渲染 1,500 条信息,每次都打印到单独的分段文件中。任何一次都不会大到触及极限。
  • 空白页检查。每个分段写出后都会检查:如果引擎什么也没绘制,就丢弃该分段并重试;仍然无法绘制的分段会一分为二再试。空白输出不可能进入最终文档。
  • 加固的合并。各分段被拼接成一个 PDF,合并后的文件在写出时会针对真实 PDF 阅读器在意的各种故障进行校验。校验中的每一条规则,都来自一次真实的损坏导出给我们的教训;像 Acrobat 这样严格的阅读器,会拒绝宽松阅读器照样能打开的文件。
  • 如实标注,而不是装作完整。多段导出会在页眉中写明“第 3 部分,共 9 部分,第 12,001 至 13,500 条信息,共 84,000 条”。如果有任何内容被省略,文档会写明。

数据

这一切的压力测试,是一位真实用户的 84,000 条信息对话,多年的短信,到处都是照片。它能导出为一份完整、易读的 PDF。说说规模:同一段对话在早期版本中导出为 1.05 GB;现在的引擎生成的文件只有 164 MB,而一段照片很多的 2,500 条信息对话,在一台普通台式机上大约 17 秒就能导出。

真正打印出来

如实说明一点:打印对话框本身也有和任何浏览器引擎一样的一次性处理限制,所以对于非常长的对话,Text2Store 会引导您使用导出 > PDF…,而不是让对话框失败,然后您从 PDF 打印全部或只打印需要的页面。分步说明见把 iPhone 短信导出为 PDF,整篇内容的简短版本见打印 iPhone 短信。

有问题吗?

发邮件到 hello@text2store.com。如果您有一段怀疑太大的对话,我们真心很想听听。