apache fop的文档预处理器。
pypfop的Python项目详细描述
Apache FOP的文档预处理器。
它是如何工作的?
它按照大标题的意思,预处理一个higher级别的模板 动态生成一个特定的XSL-FO文档,然后获取 馈送到Apache FOP并生成预期输出。所以这意味着 这个包需要java>_<',但不要担心!,几乎是透明的 到python应用程序。
一般来说,内部工作流程是:
template -> mako -> apply css -> xsl-fo -> fop -> *Document*
安装
安装pypfop:
pip install pypfop
安装Apache FOP:
用法
加价
用于生成文档的标记几乎与xsl fo相同,只有 不同的是,不需要将xml名称空间设置为所有元素, 例如:
<fo:table> <fo:table-header> <fo:table-row> <fo:table-cell> <fo:block>Project</fo:block> </fo:table-cell> </fo:table-row> </fo:table-header> <fo:table-body> <fo:table-row> <fo:table-cell> <fo:block>pypfop</fo:block> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table>
可以这样写:
<table> <table-header> <table-row> <table-cell> <block>Project</block> </table-cell> </table-row> </table-header> <table-body> <table-row> <table-cell> <block>pypfopp</block> </table-cell> </table-row> </table-body> </table>
高级模板语言
当时唯一支持的模板语言是mako,它不应该是 很难扩展到您最喜欢的基于实现的模板语言 希望能为项目做出贡献。
例如,可以使用这个mako模板生成上一个表,假设 头和行变量被传递到文档。generate方法:
<table> <table-header> <table-row> % for name in header: <table-cell> <block>${name}</block> </table-cell> % endfor </table-row> </table-header> <table-body> % for row in rows: <table-row> % for cell in row: <table-cell> <block>${cell}</block> </table-cell> % endfor </table-row> % endfor </table-body> </table>
骨骼
前面的示例实际上只是一个文档片段,可以生成 包含元数据、纸张大小、页边距等的完整文档,以避免重复 编写这种基本文档的工作pypfop附带了skeletons文档 目的如果要在每个模板上继承此文档,则在 唯一实现的骨架位于pypfop/skeletons/mako/simple letter base.fo.mako, 其中包括文档元数据的占位符和两个区域,body 和页脚,有一些默认值,当然可以用 适当的参数。
要想成为pypfop的全功能模板,前一个表必须是这样的。
simple-table.fo.mako:
<%inherit file="simple-letter-base.fo.mako" /> <table id="main-table"> <table-header> <table-row> % for name in header: <table-cell> <block>${name}</block> </table-cell> % endfor </table-row> </table-header> <table-body> % for row in rows: <table-row> % for cell in row: <table-cell> <block>${cell}</block> </table-cell> % endfor </table-row> % endfor </table-body> </table>
默认情况下,skeletons目录设置在模板目录路径中。
使用css设置格式和样式
除了定义文档内容和布局的高级语言之外, 样式和格式使用css,更具体地说,它可以解析 cssutils支持,这是css2和css3的一个很好的子集,例如它支持 比如:nth-child(X)和@import url(XX)。
可以设置的属性与xsl-fo规范中的属性相同, 查看About XSL-FO syntax的部分,唯一的例外是 使用类作为选择器,xsl fo不支持class属性, pypfop解析器将查找class属性,然后用 指定样式,然后删除class属性。
例如,我可以在三个文件中定义上一个表的样式。
simple_table.css:
@import url("general.css"); @import url("colors.css"); #main-table > table-header > table-row{ text-align: center; font-weight: bold; } #main-table > table-header table-cell{ padding: 2mm 0 0mm; }
general.css:
flow[flow-name="xsl-region-body"] { font-size: 10pt; font-family: Helvetica; }
colors.css:
#main-table> table-body > table-row > table-cell:first-child{ color: red; } #main-table> table-body > table-row > table-cell:nth-child(2){ color: blue; } #main-table> table-body > table-row > table-cell:nth-child(3){ color: cyan; } #main-table> table-body > table-row > table-cell:last-child{ color: green; }
生成文档
有几种不同的方法可以实现Document类, 但为了简单起见,这是一种生成文档的方法:
from pypfop import Document from pypfop.makotemplates import TemplateFactory tfactory = TemplateFactory() params = {'header': ['Project', 'Website', 'Language', 'Notes'], 'rows': [('pypfop', 'https://bitbucket.org/cyraxjoe/pypfop', 'Python', 'Abstraction on top of Apache FOP'), ('Apache FOP', 'https://xmlgraphics.apache.org/fop/', 'Java', '')] } doc = Document(tfactory('simple-table.fo.mako'), 'simple_table.css') print(doc.generate(params)) # returns the path of the generated file.
支持的文档格式
在前面的例子中,我们没有定义文档的输出 使用pdf的默认输出,但支持的输出是E与 在Apache FOP output formats中。
来自pypfop.__init__:
VALID_OFORMATS = frozenset(('awt', 'pdf', 'mif', 'rtf', 'tiff', 'png', 'pcl', 'ps', 'txt'))
输出格式可以在Document.__init__或Document.generate
doc = Document(tfactory('simple-table.fo.mako'), 'simple_table.css', oformat='rtf')
或
doc.generate(params, oformat='rtf')
关于xsl-fo语法
您应该已经注意到,需要知道如何格式化xsl-fo文档。 在大多数情况下,它们与html的对应项非常相似(除了 在block标签中,我在网上能找到的最好的参考是XML Bible。
为什么!
这个项目是我的一个客户的大项目的一部分, 我很早就决定只使用python 3,这是个糟糕的决定 如果您想轻松地生成pdf文件,或者至少现在。 我正在寻找一种template到 普通的发票和账单,所以Pypfop来减轻痛苦。
[1] | Actually you can set the command at another level, check the ^{tt9}$ class. |