带有坐标的 xsl-fo 外部图形中的区域属性

Area attribute in xsl-fo external-graphic with coordinates

我有一个要求,我需要使用 xsl-fo 描绘图像,并且用户应该能够在图像的文本/特定位置内单击。为了进一步解释,

因此,当我单击文本时,我应该能够遍历到 PDF 文档中的另一个位置。

我曾尝试使用 <area> 标签提及 <fo:block> 中的坐标,但它不起作用。 我的Fo结构如下:

<fo:block> <fo:external-graphic content-width="scale-to-fit" content-height="100%" width="100%" src="figures/test.png"/><area shape="rect" coords="148,147,195,162" <fo:basic-link>xyz</fo:basic-link></area>
</fo:block>

如果有人尝试过这样的事情并帮助我,你能告诉我吗?

虽然 XSL-FO 没有 图像映射(类似于 HTML 中的 MAP 元素),但可以使用 嵌入SVG文档达到同样的效果。

看看这个例子:

<fo:block>
    <fo:instream-foreign-object>
        <svg width="5cm" height="3cm" viewBox="0 0 5 3" version="1.1"
             xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
            <image x="0" y="0" width="5" height="3" xlink:href="image.png"/>
            <a xlink:href="http://www.w3.org">
                <rect x="1" y="2" width="3" height="1" 
                      fill="#AAFFFF" stroke="none" opacity="0"/>
            </a>
        </svg>
    </fo:instream-foreign-object>
</fo:block>

svg 文件内:

  • 一个 image 元素放置位图图像,具有与文档 viewBox 相同的大小
  • 一个a元素定义了link目的地
  • a 中的 rect 元素定义了可点击区域

我用 FOP 2.1 测试了这个例子并且它有效,有几个 警告:

  • 为了使可点击的矩形完全透明,我使用了opacity="0";我尝试使用 fill="none" stroke="none" 但这不起作用,可能是因为矩形被完全丢弃/忽略没有任何可见标记
  • PDF 中的可点击区域是矩形,即使在 SVG 中使用 ellipse 元素也是如此

all-XSL-FO 方法是将 fo:external-graphic 放在具有指定宽度和高度的 fo:inline-containerfo:block-container 中。热点然后可以 fo:block-container 相对于其包含 fo:inline-container/fo:block-container.

的参考区域定位

此示例将热点添加到内联图像。以下来自 Antenna House GUI 的屏幕截图具有可见的标尺,因此您可以看到热点具有正确的位置和大小。 (添加 borderbackground 属性只是为了使这一点显而易见,您不太可能需要这些属性。)

<fo:block text-align="center">
  <fo:inline-container width="200px" height="200px"
                       border="thin solid silver">
  <fo:block text-depth="0" line-height="0" font-size="0">
    <fo:external-graphic
        content-width="scale-to-fit"
        content-height="100%" width="100%"
        src="logo-antenna-200x200.png" />
  </fo:block>
  <fo:block-container
      position="absolute"
      left="148px"
      top="147px"
      width="47px"
      height="15px">
    <fo:block>
      <fo:basic-link internal-destination="xyz">
        <fo:block-container height="100%" width="100%"
                            background-color="magenta" />
      </fo:basic-link>
    </fo:block>
  </fo:block-container>
  </fo:inline-container>
</fo:block>