【问题标题】:Which pdf elements could cause crashes?哪些 pdf 元素可能导致崩溃?
【发布时间】:2010-05-01 15:40:36
【问题描述】:

这是一个非常笼统的问题,但它基于特定问题。我为 iPad 创建了一个 pdf 阅读器应用程序,它工作正常,但某些 pdf 页面总是使应用程序崩溃。我们现在发现同样的页面也会导致 Safari 崩溃,所以我开始怀疑问题出在 Apple 的 pdf 渲染代码的某个地方。

据我所知,崩溃的页面会导致渲染库开始疯狂分配内存,直到应用程序被终止。我没有其他东西可以帮助我确定是什么触发了这个过程。

这不一定发生在最大的文档或形状最多的文档中。事实上,我们还没有找到任何参数可以帮助我们预测哪些页面会崩溃,哪些不会。

现在我们刚刚发现,通过允许您合并文档的消费者程序运行页面可以解决问题,但我无法检测到哪个属性或元素是关键。从长远来看,手动更改文档也不是我们的选择。我们需要在我们的服务器上运行一个自动化进程。

我希望对 pdf 文件格式有更深入了解的人能够为我指明一个合理的方向,以寻找可能导致这种行为的文档特征。到目前为止,我发现的只是 JBIG2 图像,我认为我们没有这些。

【问题讨论】:

    标签: iphone objective-c pdf ipad safari


    【解决方案1】:

    无法在 iPad 应用程序或 iPad 版 Safari 上呈现的两个“特殊”PDF 遇到了同样的问题。在我的例子中,问题被隔离在一些半透明的渐变阴影中。

    顺便说一句,将 PDF 转换为 postscript,然后再转换回 PDF,似乎删除了 PDFKit 不喜欢的内部元素。原始文档大小为 1.9 MB,包含许多矢量形状,经过转换过程后,文件大小减小到约 600 KB,并在 iPad 上完美呈现。

    【讨论】:

    • 感谢您提供此信息。您使用什么程序/库进行 PS/PDF 转换?我建议我的客户使用 Ghost Script 修改文件,但最后他们做了自己的解决方案。
    • 没有特殊的开源程序/库。我使用的是 Adob​​e Distiller 6.0,因为它在工作中可用。
    【解决方案2】:

    问题不在于 PDF 功能本身,而在于对它的支持。您需要将 PDF 拆开并查看其中包含的内容 - 您可以在 Acrobat 9.0 中执行此操作 - 在http://pdf.jpedal.org/java-pdf-blog/bid/10479/Viewing-PDF-objects

    上有一篇文章展示了如何使用它来查看 PDF 内部

    我们收到了一些 PDF,导致 OS X 上的 Mail 崩溃,问题原来是嵌入的子集字体。

    【讨论】:

    • 你的意思是说是解析和呈现文档崩溃的代码而不是文件本身?是的,我知道这一点。我们一直在文件中挖掘很多东西,试图禁用这个或那个元素。在我们的例子中,它似乎不是字体,但我会再研究一下。谢谢。
    【解决方案3】:

    我也一直在研究这样的问题。 我已将我的问题缩小到带有嵌入黑白图像的单页 PDF 文件。 在 adobe reader 中单独或在浏览器中打开 pdf 总是会产生 “图像数据不足”对话框以及元素后的损坏视图。

    在研究互联网以寻求某种补救措施来解决这种非常常见的情况时,发现了一个暗示作为根本原因 - 来自http://forums.adobe.com/message/2151474#2151474

    今天下午也遇到了同样的问题,经过大量实验后发现问题的根源是我通过 Adob​​e Acrobat 6 优化 PDF 文件,使用 JBIG2 压缩单色图像。我只删除了单色图像的压缩(彩色图像等仍然通过 JPEG 压缩),现在我的文件在阅读器 9.1、8 等中打开得很好。

    也许这就是你面临的问题?


    后续.... 我将“图像数据不足”错误的问题定位为使用 mac 将彩色图像转换为黑白的问题。 使用 itext 和 java,我想出了这个解决方案 - 检测有问题的图像色彩空间并重写它。它创造了奇迹。使用其他语言应该不难复制。

                   image = Image.getInstance( imageUrl );
                if( image.getColorspace() == 1 && image.isJpeg() ) {
                    baseLog.warn( "bad image detected at " + imageUrl );
                    BufferedImage bufImage = ImageIO.read(new URL( imageUrl ));
                    int imageType = bufImage.getType();
                    if ( imageType == 10 ) {
                               // convert the image to get rid of bad stuff inside
                        ColorSpace cs = ColorSpace.getInstance( ColorSpace.CS_GRAY );
                        ColorConvertOp op = new ColorConvertOp(cs, null );
                        image = Image.getInstance( op.filter(bufImage, null ), null );                      
                    }
                }
    

    【讨论】:

    • 我确实曾经研究过 JBIG2 的事情。我的印象是,大多数讨论该问题的线程都已经很老了。无论如何,有几个因素会导致麻烦。我在某一时刻看到了一些涉及“羽毛渐变”的东西。见此链接:forums.adobe.com/message/2011090
    • 编辑中的重要信息。本次讨论正在形成一个人们应该注意的问题列表,并且到目前为止,还有一些解决方案!
    【解决方案4】:

    我发现张量着色元素肯定会让你的应用崩溃。总是!它是绝对可重现的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2012-12-04
      • 1970-01-01
      相关资源
      最近更新 更多