将 scaled-down 背景图像放置在 body 区域的底部

Position a scaled-down background image at the bottom of the body region

我需要在封面上显示大背景图片。该图像需要:

  1. 要缩小到 region-body 的宽度。
  2. 正好位于 region-body 的底部。

使用 background-image 不是一个选项,因为图像需要缩放。因此,我将图像打印在延伸到 region-body 以下的长 region-before 中。有效。

然后我尝试使用 absolute-position="absolute"bottom="0cm" 将图像定位在 region-before 的底部。不幸的是,bottom 没有按我预期的方式工作。 (图片保持在顶部。)

<?xml version="1.0" encoding="UTF-8"?> 
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master master-name="section1-cover" page-height="11in" page-width="8.5in"
            margin-top="1cm" margin-bottom="0">
            <fo:region-before region-name="xsl-region-before" extent="11in - 1cm  - .75in"
                background-color="beige"/>
            <fo:region-body margin-top="1cm" margin-bottom=".75in" margin-right=".395in"
                margin-left=".395in"/>
            <fo:region-after region-name="xsl-region-after" extent=".75in" background-color="orange"/>
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence master-reference="section1-cover">
        <fo:static-content flow-name="xsl-region-before">
            <fo:block-container margin-right=".395in" margin-left=".395in"
                absolute-position="absolute" bottom="0cm">
            <!-- I expected that block-container to go down to the bottom -->
                <fo:block line-height=".5">
                <!-- line-height="1" seems more logical but yields unwanted extra space -->
                    <fo:external-graphic src="url('cover-background.jpg')" width="100%"
                        content-width="scale-down-to-fit"/></fo:block>
            </fo:block-container>
        </fo:static-content>
        <fo:flow flow-name="xsl-region-body">
            <fo:block font-size="28pt">Title</fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>

有人有解决办法吗?

注意:我不想从顶部定位该图像,因为我无法可靠地计算缩放后的图像高度。

注意: 它必须在 FOP 中工作。

使用<fo:region-before display-align="after" />(并省略fo:block-container)。参见 https://www.w3.org/TR/xsl11/#display-align

FOP 一致性页面 (https://xmlgraphics.apache.org/fop/compliance.html) 声明 FOP 具有部分一致性,因此 YMMV。


用 Larry Wall 的话来说,方法不止一种:

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master
        master-name="section1-cover"
        page-height="11in" page-width="8.5in">
      <fo:region-body
          margin-top="1cm"
          margin-bottom="0.75in"
          background-color="beige" />
      <fo:region-after
          region-name="xsl-region-after"
          extent=".75in"
          background-color="orange" />
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="section1-cover">
    <fo:flow flow-name="xsl-region-body">
      <fo:block-container
          absolute-position="absolute"
          bottom="0in"
          left="0.395in"
          right="0.395in"
          display-align="after">
        <fo:block line-height="0">
          <fo:external-graphic
              src="url('cover-background.jpg')"
              width="100%"
              content-width="scale-down-to-fit"/>
        </fo:block>
      </fo:block-container>
      <fo:block
          margin-left="0.375in"
          margin-right="0.375in"
          font-size="28pt">Title</fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

已使用 AH Formatter V6.5 和 FOP 进行测试。

稍微修改一下图片就可以使用background-image。例如,您可以创建一个与您的页面大小相同的空白背景图像,并将您的图像放置在该空白背景中的正确位置。

并找到缩放后的图像高度:

  1. 在任何支持 real-world 尺寸 (mm/in) 的图像编辑器中打开图像。 Illustrator,例如 Inkscape。
  2. 将图像缩放到您想要的宽度。
  3. 测量高度(在 Inkscape 中:通过在图像上画一条垂直线)。

或者计算它: 您知道希望图像具有的宽度 (x) 以及图像的原始大小(高度 h 和宽度 w)。你想要的高度(y)是(x/w)*h。