带有坐标的 xsl-fo 外部图形中的区域属性
Area attribute in xsl-fo external-graphic with coordinates
我有一个要求,我需要使用 xsl-fo 描绘图像,并且用户应该能够在图像的文本/特定位置内单击。为了进一步解释,
- 我有一张图片
- 它包含文字
- 我有文本出现位置的坐标,需要为这些坐标提供 hyper-link。
因此,当我单击文本时,我应该能够遍历到 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-container
或 fo:block-container
中。热点然后可以 fo:block-container
相对于其包含 fo:inline-container
/fo:block-container
.
的参考区域定位
此示例将热点添加到内联图像。以下来自 Antenna House GUI 的屏幕截图具有可见的标尺,因此您可以看到热点具有正确的位置和大小。 (添加 border
和 background
属性只是为了使这一点显而易见,您不太可能需要这些属性。)
<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>
我有一个要求,我需要使用 xsl-fo 描绘图像,并且用户应该能够在图像的文本/特定位置内单击。为了进一步解释,
- 我有一张图片
- 它包含文字
- 我有文本出现位置的坐标,需要为这些坐标提供 hyper-link。
因此,当我单击文本时,我应该能够遍历到 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-container
或 fo:block-container
中。热点然后可以 fo:block-container
相对于其包含 fo:inline-container
/fo:block-container
.
此示例将热点添加到内联图像。以下来自 Antenna House GUI 的屏幕截图具有可见的标尺,因此您可以看到热点具有正确的位置和大小。 (添加 border
和 background
属性只是为了使这一点显而易见,您不太可能需要这些属性。)
<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>