在生成的PDF中XSL-FO图像宽度

3

我一直在努力理解和调整一些创建PDF的C#代码。我正在了解的实现方式采用一个XSL将近似HTML格式的文本转换为XSL-FO,然后再将其转换成PDF。

表格中有一张图像,宽度为175像素,我希望它左对齐放置在左上角,并且在100%缩放比例下(即原始大小),在桌面上查看PDF文件时恰好占据175个像素。

我已经获取了中间的XSL-FO,但不知道出了什么问题。

目前,以下XSL-FO生成的PDF中,图像(logo-175x45.jpg)左对齐显示得很好,但在屏幕上需要接近243个像素。

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
    <fo:simple-page-master master-name="A4" page-width="8.5in" page-height="11in" margin-top="0.60in" margin-bottom="0.50in" margin-left="1in" margin-right="1in">
        <fo:region-body margin="0in" />
    </fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A4">
    <fo:flow flow-name="xsl-region-body">
        <fo:block font-size=".75em">
            <fo:table table-layout="fixed">
                <fo:table-column column-width="238pt" />
                <fo:table-column column-width="180pt" />
                <fo:table-body>
                    <fo:table-row>
                        <fo:table-cell padding-start="1pt" padding-end="1pt" padding-before="1pt" padding-after="1pt">
                            <fo:block text-align="start">
                                <fo:block text-align="start">
                                    <fo:block space-after="12pt">
                                        <fo:external-graphic src="c:\logo-175x45.jpg" width="175px" />
                                    </fo:block>
                                </fo:block>
                            </fo:block>
                        </fo:table-cell>
                        <fo:table-cell padding-start="1pt" padding-end="1pt" padding-before="1pt" padding-after="1pt">
                            <fo:block text-align="start">
                                <fo:block font-family="Arial, Helvetica, sans-serif" font-size="2.5em" font-weight="bold" color="#d9d9d9" text-align="end">INVOICE</fo:block>
                            </fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                </fo:table-body>
            </fo:table>
        </fo:block>
    </fo:flow>
</fo:page-sequence>

此外,如果您能为我提供相关阅读资源,那将非常好。我对此并不了解,需要帮助。我是一名新手,刚开始学习网页编程。

1
你使用的是哪个 FO 引擎?你有尝试使用其他引擎来渲染 PDF 吗? - Mads Hansen
2
你语句中的错误是...,在桌面上以100%缩放查看PDF文件时,在屏幕上占用175个像素。是谁的屏幕?屏幕的分辨率是多少?“像素”是一种设备相关的测量单位,不能用于设置绝对大小(只能在解释器的确切解释时间使用)。如果你想要一个精确的大小,请使用精确的大小。 - Kevin Brown
2个回答

3
使用像素本质上是不准确的。 参见https://www.w3.org/TR/xsl11/#pixels XSL 1.1规范没有指定每英寸的像素数,因此不同的格式化程序可能具有不同的默认值。 一些程序可以让您指定每英寸的像素数(例如https://www.antennahouse.com/product/ahf63/ahf-optset.html#pxpi)。
一些图形文件格式在文件中以像素/英寸(或像素/厘米)编码其分辨率,并且格式化程序可能会尊重该分辨率而不是其内置分辨率。
最后,但对于您的175像素图像来说不太可能,格式化程序可以缩小高分辨率光栅图像以匹配其指定的输出分辨率,以便输出文件更小且更快地打印/查看(例如https://www.antennahouse.com/product/ahf63/ahf-optset.html#color-downsampling)。
然后,当您查看PDF时,您的计算机和/或PDF查看器可能会对每英寸的像素数有不同的想法。 例如,Acrobat Reader DC中的首选项设置允许您设置自定义分辨率。
因此,具有默认96像素/英寸px单位的XSL-FO格式化程序可能会将175像素/72 dpi图像呈现为2.43英寸宽,并且具有96像素/英寸分辨率的PDF查看器可以以100%缩放显示2.43英寸为233像素。 这些数字与您的数字不匹配,但它们说明了可能发生的事情。
底线是,当您打印它时,175像素图像看起来非常粗糙。 最好使用矢量图像或者如果不能使用矢量图像,则应使用与最高dpi预期输出设备的分辨率相匹配的光栅图像,并在FO文件中指定图像的格式化大小(以英寸或其他固定单位)。

1

content-width属性应用于您的fo:external-graphic

<fo:external-graphic src="c:\logo-175x45.jpg" content-width="175px" width="175px" />

谢谢。我尝试了那个,但它没有解决问题。输出的PDF文件看起来一样。 - mishal153
我认为您应该在所需分辨率下使用精确的尺寸。如果您正在处理在Web浏览器中查看PDF,则使用96px / inch并将内容宽度设置为1.822917in。 - Kevin Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接