FOP 2.1 是否支持 ViewerPreferences?

Does FOP 2.1 support ViewerPreferences?

我正在使用 FOP 2.1 并尝试设置 ViewerPreferences,例如DisplayDocTitle -> 真。

我正在尝试(来自

<fo:declarations>
    <pdf:dictionary type="Catalog" xmlns:pdf="http://xmlgraphics.apache/org/fop/extensions/pdf">
        <pdf:dictionary type="normal" key="ViewerPreferences">
            <pdf:entry key="DisplayDocTitle" type="boolean">true</pdf:entry>
        </pdf:dictionary>
    </pdf:dictionary>
    <x:xmpmeta xmlns:x="adobe:ns:meta/">
    ...

但得到

Jul 13, 2016 11:18:31 AM org.apache.fop.events.LoggingEventListener processEvent
WARNING: Unknown formatting object "{http://xmlgraphics.apache/org/fop/extensions/pdf}dictionary" encountered (a child of fo:declarations}. (See position 242:105)
Jul 13, 2016 11:18:31 AM org.apache.fop.events.LoggingEventListener processEvent
WARNING: Unknown formatting object "{http://xmlgraphics.apache/org/fop/extensions/pdf}dictionary" encountered (a child of dictionary}. (See position 243:69)

pdf 中没有 ViewerPreferences。

当我将字典放在 <x:xmpmeta xmlns:x="adobe:ns:meta/"> 下面时,我也没有 ViewerPreferences,只有 pdfbox 预检会抱怨

The file test.pdf is not valid, error(s) :
7.3 : Error on MetaData, Cannot find a definition for the namespace http://xmlgraphics.apache/org/fop/extensions/pdf

我做错了什么,我是不是太早尝试了?我必须在哪里修补 fop?

根据 release notes FOP 2.0 介绍,除其他外,

  • Low level mechanism to augment PDF /Catalog and /Page dictionaries

但是网站上的使用例子并不多

查看源代码分发中包含的 testcases,特别是名为 pdf-dictionary-extension_*.xml 的那些,我能够将与您的代码类似的东西放在一起,但不会生成 运行 - 时间例外;诚然,我对这个 PDF 功能还不够熟悉,无法说明输出是否真正实现了您想要做的事情:

<fo:declarations>
  <pdf:catalog xmlns:pdf="http://xmlgraphics.apache.org/fop/extensions/pdf">
    <pdf:dictionary type="normal" key="ViewerPreferences">
      <pdf:boolean key="DisplayDocTitle">true</pdf:boolean>
    </pdf:dictionary>
  </pdf:catalog>
</fo:declarations>
  • 没有<pdf:dictionary type="Catalog">,有pdf:catalog代替
  • 没有单个 <pdf:entry key="..." type="..."> 元素,但每个可能的条目类型都有一个特定元素:pdf:arraypdf:booleanpdf:namepdf:number, pdf:string, ...

(披露:我是一名 FOP 开发人员,虽然现在不是很活跃)

作为对@lfurini 出色发现的补充,这里还有一些可以轻松完成的事情,使用 fop 2.1 进行了测试,但也可以从 2.0: 开始,删除相关部分的评论以尝试:

<fo:declarations>
  <pdf:catalog xmlns:pdf="http://xmlgraphics.apache.org/fop/extensions/pdf">
    <!-- this opens in full-screen mode, e.g. as presentation -->
    <!-- pdf:name key="PageMode">FullScreen</pdf:name -->

    <!-- this opens then second page so it is fully visible -->
    <!-- (count seems to start at 0) -->
    <!-- pdf:array key="OpenAction">
      <pdf:number>1</pdf:number>
      <pdf:name>Fit</pdf:name>
    </pdf:array -->

    <!-- this will replace the window title from filename to below dc:title -->
    <pdf:dictionary type="normal" key="ViewerPreferences">
      <pdf:boolean key="DisplayDocTitle">true</pdf:boolean>
    </pdf:dictionary>
  </pdf:catalog>
  <x:xmpmeta xmlns:x="adobe:ns:meta/">
    <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
        <!-- Dublin Core properties go here -->
        <dc:title>Sample Document title</dc:title>
      </rdf:Description>
    </rdf:RDF>
  </x:xmpmeta>
</fo:declarations>

可能取值的详细信息可以在pdf specification中查找(从v1.7版本的第139页开始,TABLE目录字典中的3.25条目),注意不要使用值无论如何通常都会由 fop 设置,限制自己使用 viewer/reader 相关内容。