Apache FOP - 可以在 PDF 中滚动吗?

Apache FOP - Scrolling in PDF possible?

我正在使用 Apache FOP 通过 XML 和 XSL-FO 生成 PDF。我生成的 PDF 中有一个单元格,如果内容溢出,我需要能够滚动它。 XSL-FO 具有 overflow="scroll" 功能,但根据我对该主题的研究,Apache FOP 似乎不支持此选项。

例如,这是我需要复制的大型 CAD 公司使用的 PDF 中的一个可滚动区域:

有什么方法可以在 Apache FOP 中启用此功能?是否可以在源代码中启用它(我还没有找到这样做的方法)?还有其他方法可以解决这个问题吗?

不,这不可能。

从 FO 的角度:

XSL-FO Recommendation 中,属性 overflowscroll 值来自 来自相应的 CSS2 定义,其中包括以下说明:

When this value is specified and the target medium is "print", overflowing content should be printed.

由于 PDF 输出是面向打印的介质,我将此视为 FOP 在打印溢出内容时正确的确认。

从PDF角度看:

PDF Reference 6th edition 中搜索词 "scroll" returns 结果指的是 用户界面 中的滚动条或交互式表单(文本字段、列表框、组合框)。

没有,或者至少我找不到 "static text object, but with scrolling bars" 功能(这对于面向打印的格式可能是明智的),因此 FOP 无法在 PDF 输出文件中创建它,甚至没有修改源代码

再次查看您的评论和您提供的屏幕截图让我认为这可能是 PDF 格式的 3D Artwork 功能的一个示例,这是我以前不知道的功能(我仍然除了它的名字之外一无所知)。根据参考:

Specific views of 3D artwork can be specified, including a default view that is displayed initially and other views that can be selected. Views can have names that can be presented in a user interface.

所以,我认为您的屏幕截图显示了与 3D 对象关联的不同视图;它不是可用于提供可滚动文本的通用功能。

嗯,有可能...

这是可能的,但据我所知不能使用 Apache FOP。在没有看到有问题的 PDF 和从屏幕截图中猜测的情况下,它看起来像是一个插入到 PDF 中的 Flash 小部件。这在 PDF 术语中是一个 RichMedia 注释(需要带有扩展的 PDF 1.7 版),您可以在其中插入 Flash 小部件以及其他控制文件(如 XML、要显示的其他图像等)并将它们关联在一起.

AFAIK,只有 RenderX XEP(我为之工作)支持通过 XSL FO 通过此处记录的 rx:rich-media-object 扩展插入 PDF 的 RichMedia 注释:http://www.renderx.com/reference.html#Rich Media

我相信,唯一支持带有 RichMedia 注释的 PDF 的查看器是 Adob​​e Reader,因此需要查看此类文件。这是一个示例,其中包含一些交互式 Flash 小部件,一些交互式图表都在很久以前生成的几页 PDF 中。注意:我确信文档中的某些链接不会指向任何地方,它是多年前的一个贸易展。 请记住,您需要下载此文件并在 Adob​​e Reader 中查看并安装 Flash 播放器才能看到它的功能。

http://www.cloudformatter.com/Resources/Samples/RichMedia.pdf

您不能使用常见的基于 PDF 浏览器的查看器,例如 Chrome 或 Firefox,因为它们不支持此类注释。

此处第一页的屏幕截图显示了一个交互式滚动小部件。第 4 页包含一个类似于您在示例中显示的小部件。

第 4 页滚动小部件与您的要求非常相似:

最后一页上的小部件是使用滚动条 SWF 创建的,它采用图像参数和 setup/configuration 文件 XML。 RenderX 扩展对象将这些作为参数并将它们全部嵌入到交互式 Flash 小部件的文档中,以便它在 PDF 中完全独立。执行此操作的 XSL FO 是:

    <rx:rich-media-object name="Sample HTML Widget" scaling="non-uniform" width="611.92pt"
        height="74.99pt" content-width="scale-to-fit" src="url('rx-scroller\dockmenu.swf')"
        transparency="true" activate-condition="page_visible">
        <rx:flash-var name="setupXML" value="rx-dock-settings.xml"/>
        <rx:flash-var name="contentXML" value="rx-dock-contents.xml"/>
        <rx:rich-media-resource name="rx-dock-settings.xml"
            src="url('rx-scroller\rx-dock-settings.xml')"/>
        <rx:rich-media-resource name="rx-dock-contents.xml"
            src="url('rx-scroller\rx-dock-contents.xml')"/>
        <rx:rich-media-resource name="style.css" src="url('rx-scroller\css\style.css')"/>
        <rx:rich-media-resource name="customer1.png" src="url('rx-scroller\images\customer1.png')"/>
        <rx:rich-media-resource name="customer2.png" src="url('rx-scroller\images\customer2.png')"/>
        <rx:rich-media-resource name="customer3.png" src="url('rx-scroller\images\customer3.png')"/>
        <rx:rich-media-resource name="customer4.png" src="url('rx-scroller\images\customer4.png')"/>
        <rx:rich-media-resource name="customer5.png" src="url('rx-scroller\images\customer5.png')"/>
        <rx:rich-media-resource name="customer6.png" src="url('rx-scroller\images\customer6.png')"/>
    </rx:rich-media-object>

请注意,Flash 中的许多内容都可以使用,例如链接等。它只是作为容器插入到 PDF 中的纯交互式 flash。

确实,这似乎无法通过 FOP 实现。

然而,继续挖掘了几天,我确实找到了一个聪明的 post-processing alternative,它也是免费的,本质上是使用 LaTeX animate 包将一个 PDF 嵌入到另一个 PDF 中。

此方法的缺点是无法在可滚动区域内嵌入链接,这对我来说是个大问题。但是该方法确实能够在现有 PDF 中插入一个可滚动区域,并且让我非常接近我想要实现的目标。