我创建了一个XSL-FO模板,它打印了几个包含动态变化的文本的块.有时块被分割为两页,因为页面上没有足够的空间.有没有办法将块放在下一页上,而不是在不适合的情况下在页面上拆分它?我试着将它放在一个表中,保持在一起="总是"但是然后每个文本都在单行(没有换行)并溢出右页边距消失.先感谢您!
<fo:table table-layout="fixed" width="100%">
<fo:table-column column-width="proportional-column-width(1)"/>
<fo:table-body>
<fo:table-row keep-together="always">
<fo:table-cell
border-width="1px"
border-color="black"
border-style="solid"
background-color="#ffffff"
text-align="left">
<fo:block>
Text 1
</fo:block>
<fo:block>
Text 2
</fo:block>
<fo:block>
Text 3
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
Run Code Online (Sandbox Code Playgroud) 我正在使用XSL转换将XML转换为PDF.不幸的是,它没有保留XML中的空格.例如:
我想转换这个:
Test Line Data : 0xAA
Run Code Online (Sandbox Code Playgroud)
从XML到PDF.它在XML中看起来很好,它在Data和:)之间有9个空格,但在它显示的PDF中
Test Line Data : 0xAA
Run Code Online (Sandbox Code Playgroud)
这是我目前正在做的事情.在将数据写入XML之后,我将执行以下操作:
XPathDocument xPathDocDiag = new XPathDocument(this.FileNameDiagXml);
XslCompiledTransform xslTransDiag = new XslCompiledTransform();
XmlTextWriter xmlWriterDiag = new XmlTextWriter(outputFO, System.Text.Encoding.UTF8);
xslTransDiag.Transform(xPathDocDiag, null, xmlWriterDiag);
xmlWriterDiag.Flush();
xmlWriterDiag.Close();
Run Code Online (Sandbox Code Playgroud)
然后启动Apache FOP将FO转换为PDF.就像我说的那样,不幸的是,当我需要它时,白色空间不会被保留.我已经尝试手动添加XML(查找和替换)中的空格,它在转换后起作用,但是众所周知,文字&不能是XML,因此选项不在.我尝试过使用XmlReader,然后使用
<xsl:preserve-space elements="*"/>
Run Code Online (Sandbox Code Playgroud)
但同样,这也不起作用(没有错误或任何东西,只是不起作用).
XSL的部分看起来像这样:
<xsl:when test="Data != ''">
<fo:table-cell text-align="left">
<fo:block />
</fo:table-cell>
<fo:table-cell text-align="left" number-columns-spanned="7">
<fo:block font-family="Courier New, Courier, monospace" font-size="9pt"><xsl:value-of select="Data" /></fo:block>
</fo:table-cell>
</xsl:when>
Run Code Online (Sandbox Code Playgroud)
我尝试了各种属性修改无济于事.我错过了一些明显的东西吗?
在我工作过的公司,我和我的同事们,在XSL-FO之上实施了一个量身定制的文档分发系统.
我的任务是让脚本提供文档并配置CUPS打印服务器和传真服务器,所以我没有时间在XSL-FO上弄脏手.
我正在考虑在那里制作一些区域,但我需要一些模板来测试.
我在哪里可以找到关于XSL-FO的一些好的教程,因为我已经掌握了fop过程?
任何人都可以建议我一个长话(如序列号)包裹的方法吗?我试过一些商业软件,没有这样的问题.它是一个fop bug还是可能有解决方案?
我不能在文档中每个单词的每个字符后插入零长度空格.这个解决方案听起来很疯狂.
尝试使用XMLSpy创建基于XML和文件的PDF文件.
我正在尝试根据字段内容将字段拆分为两行.
例如,如果我的varialbe ="John Doe AKA Johnny D",我想这样看:
约翰·多伊
约翰尼D.
我的问题是,即使网上的所有样本,我都无法使其工作.
这是我的代码:
<xsl:value-of disable-output-escaping="yes" select="concat(substring-before(//MyField,'AKA'),$newline,substring-after(//MyField,'AKA'))" />
</xsl:when>
Run Code Online (Sandbox Code Playgroud)
所以基本上,eveytime我找到了"AKA"字符串,我想把这个字段分成两行.所以我的代码,找到字符串,创建新变量,但仍然显示在一行.我尝试使用各种技术创建一个带空行的变量,但仍然显示在一行中.
有什么想法吗 ?
我正在使用Apache FOP和XSL-FO样式表生成PDF.在PDF中,我输出属于表的标题(html equiv h1),因此应始终保持在一起.但是,我的表格也可能包含很多数据,因此它们不一定适合一页.
所需的结果是一个规则集,允许标题与表保持一致,如果可能的话,在一个页面上都适合,但如果表数据太长而不适合一页,则会插入分页符表格同时仍将标题元素保留在与表格开头相同的页面上.
我现在的解决方案确实将标题和表保持在一起,但如果所有内容都不适合一个页面,我会得到表数据的内容溢出错误.我希望页面中断内部:避免设置在表元素上会对此有所帮助,但显然不是......建议?
示例xsl(为了便于阅读而缩短):
<!-- add test table with header that should stay on same page -->
<fo:block font-size="20pt" font-weight="bold">Table header</fo:block>
<fo:table keep-with-previous.within-page="always"
page-break-inside="avoid"
table-layout="fixed" border-width="1mm" border-style="solid">
<fo:table-column column-width="auto" />
<fo:table-column column-width="30mm" />
<fo:table-header text-align="center" background-color="silver">
<fo:table-row>
<fo:table-cell padding="1mm" border-width="1mm" border-style="solid">
<fo:block>First name</fo:block>
</fo:table-cell>
<fo:table-cell padding="1mm" border-width="1mm" border-style="solid">
<fo:block>Last name</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<!-- the table-rows can be repeated N times, spanning several pages -->
<fo:table-row >
<fo:table-cell padding="1mm" border-width="1mm" border-style="solid">
<fo:block>ab</fo:block>
</fo:table-cell>
<fo:table-cell padding="1mm" border-width="1mm" …Run Code Online (Sandbox Code Playgroud) 就目前而言,我有大约12列,所有列都是完全相同的宽度.问题是某些列不需要太多空间.如何让列符合其内容?列需要是动态宽度.
我试过了
<fo:table table-layout="auto">
Run Code Online (Sandbox Code Playgroud)
和
<fo:table-column column-width="proportional-column-width(1)" column-number="1"/>
<fo:table-column column-width="proportional-column-width(1)" column-number="2"/>
<fo:table-column column-width="proportional-column-width(1)" column-number="3"/>
Run Code Online (Sandbox Code Playgroud)
似乎没有什么可以做到的.
上下文
我正在创建一个XSL-FO文档,将我的XML文本转换为PDF.
在XSL-FO中,我有两个连续的内联元素,我想在它们之间有一个空格:
<fo:block>
<xsl:number/> <xsl:value-of select="@title"/>
</fo:block>
Run Code Online (Sandbox Code Playgroud)
预期结果将是:
1简介
相反,我得到了
1简介
似乎XML不考虑这个空白区域.
尝试
我尝试了几种可能的解决方案,没有成功:
<fo:block>
<xsl:number/><fo:inline white-space="pre"> </fo:inline><xsl:value-of select="@title"/>
</fo:block>
Run Code Online (Sandbox Code Playgroud)
要么
<fo:block>
<xsl:number/><fo:inline margin-left="0.5cm"><xsl:value-of select="@title"/></fo:inline>
</fo:block>
Run Code Online (Sandbox Code Playgroud)
这些想法都没有产生可接受的结果.
问题:
如何在两个(内联)元素之间包含空格?
我知道XSLT本身有属性集,但这迫使我使用
<xsl:element name="fo:something">
Run Code Online (Sandbox Code Playgroud)
每次我想输出一个
<fo:something>
Run Code Online (Sandbox Code Playgroud)
标签.XSL-FO规范中是否有任何内容允许我为FO输出中的所有表指定(假设)一组默认属性(边距,填充等)?
基本上我正在寻找CSS的功能,但对于FO输出而不是HTML.
我有以下模板来生成一个定义的表:
<xsl:template name="CreateTable">
<fo:block>
<fo:table border-style="solid" table-layout="fixed">
<fo:table-body>
<fo:table-row>
<xsl:for-each select="Table/Head/Cell">
<fo:table-cell border-style="solid">
<fo:block><xsl:value-of select="." /></fo:block>
</fo:table-cell>
</xsl:for-each>
</fo:table-row>
<xsl:for-each select="Table/Row">
<fo:table-row>
<xsl:for-each select="Cell">
<fo:table-cell border-style="solid">
<fo:block><xsl:value-of select="."/></fo:block>
</fo:table-cell>
</xsl:for-each>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
</fo:block>
<fo:block margin-top="10pt"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
现在我想将第一行中的文本旋转90度,以便从下往上阅读.
我想出的最佳解决方案是:
设置reference-orientation="0"上<fo:table>:
<fo:table border-style="solid" table-layout="fixed" reference-orientation="0">
Run Code Online (Sandbox Code Playgroud)包围<fo:block>...</fo:block>内<fo:table-cell>具有<fo:block-container>被旋转90度:
<fo:table-cell border-style="solid">
<fo:block-container reference-orientation="90">
<fo:block><xsl:value-of select="." /></fo:block>
</fo:block-container>
</fo:table-cell>
Run Code Online (Sandbox Code Playgroud)文本是旋转的,但第一行的高度实际为0,文本显示在表格上方,覆盖了前一个文本:
为第一行的单元格定义特定高度时,文本仍在表格之前,而不在第一行内:
如何在第一行的单元格中定位文本,并根据行中最长的文本自动计算行的高度?