Apache FOP,将图像缩小到精确的大小,以毫米为单位

时间:2015-10-01 15:29:36

标签: java image apache-fop

我正在尝试将图片缩小到精确的规格87mm x 10mm,但我没有将其缩小到合适的尺寸。

我正在使用Apache FOP 2.0,这是我的fop.xconf:

<fop version="1.0">

<strict-configuration>true</strict-configuration>
<strict-validation>true</strict-validation>
<base>./</base>
<font-base>./</font-base>

<source-resolution>72</source-resolution>
<target-resolution>72</target-resolution>

<default-page-settings height="11in" width="8.26in"/>

</fop>

这是应该显示图像的片段,它显示图像,但永远不会达到我指定的大小。

 <fo:flow flow-name="xsl-region-body">
    <fo:block font-size="3pt" text-align="center" font-weight="bold">
        <fo:external-graphic src="data:image/png;base64, {{barcodeimage}}" content-width="87mm" width="100%" content-height="10mm" scaling="non-uniform"/>
    </fo:block>
    <fo:block font-size="8pt" text-align="center" font-weight="bold">
        {{barcodetext}}
    </fo:block>
</fo:flow>

切换到高度和宽度,图像根本不会调整大小:

<fo:external-graphic src="data:image/png;base64, {{barcodeimage}}" width="87mm" height="10mm" scaling="non-uniform"/>

我尝试使用pt代替mm而没有成功,尝试使用此公式px切换到px = mm * dpi / 25.4但仍然没有运气。

使用em代替mmcontent-width代替width,图片会缩小,但我不知道如何从mm转换为em单位。

我需要的是将大图像缩小到87mm宽度和10mm高度,这样做的正确方法是什么?

更新:图片似乎显示正确,页面大小不正确,这是在Okular PDF Viewer中截取的截图:

screenshot

这是我的完整页面XML:

<?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="simple" page-height="29.7cm" page-width="21cm" margin="1cm">
            <fo:region-body margin-top="18mm"/>
            <fo:region-before extent="0"/>
            <fo:region-after extent="0"/>
        </fo:simple-page-master>
    </fo:layout-master-set>

    <fo:page-sequence master-reference="simple">

        <!-- Page Header Goes Here -->
        <fo:static-content flow-name="xsl-region-before">
            <fo:block font-size="8pt" text-align="center" font-weight="normal">
                Test BarCode
            </fo:block>
        </fo:static-content>

        <!-- Page Footer Goes Here -->
        <fo:static-content flow-name="xsl-region-after">
            <fo:block font-size="8pt" text-align="center">
                Page
                <fo:page-number/>
            </fo:block>
        </fo:static-content>

        <!-- Page Body Goes Here -->
        <fo:flow flow-name="xsl-region-body">

             <fo:block text-align="center">
                <fo:external-graphic src="data:image/png;base64, barcodeimage" content-width="87mm" content-height="10mm" scaling="non-uniform"/>
             </fo:block>
             <fo:block font-size="5pt" text-align="center" font-weight="normal">
                barcodetext
             </fo:block>
        </fo:flow>

    </fo:page-sequence>
</fo:root>

1 个答案:

答案 0 :(得分:3)

您应该能够使用content-widthcontent-heightscaling来实现您的目标:

<fo:external-graphic src="data:image/png;base64, {{barcodeimage}}" 
    content-width="87mm" content-height="10mm" 
    scaling="non-uniform"/>

总结不同属性的作用:

  • content-widthcontent-height控制图片尺寸
  • scaling控制图像宽高比(保留或修改以适合所需的图像尺寸)
  • widthheight控制通过其查看图片的视口大小;它可能比图像大小更大,因此留下一些空白,或小于图像大小
  • overflow说明如果视口大小小于图像大小
  • ,该怎么办

(披露:我是FOP开发人员,但最近不是很活跃)