apache fop的文档预处理器。

pypfop的Python项目详细描述


Apache FOP的文档预处理器。

它是如何工作的?

它按照大标题的意思,预处理一个higher级别的模板 动态生成一个特定的XSL-FO文档,然后获取 馈送到Apache FOP并生成预期输出。所以这意味着 这个包需要java>_<',但不要担心!,几乎是透明的 到python应用程序。

一般来说,内部工作流程是:

template ->  mako -> apply css ->  xsl-fo ->  fop -> *Document*

安装

  1. 安装pypfop:

    pip install pypfop
    
  2. 安装Apache FOP

    1. 下载fop1.1的二进制包ziptar包。
    2. 在您喜欢的任何地方解压缩并设置环境变量FOP_CMD 到解压缩文件夹的bin/fop[1]

用法

加价

用于生成文档的标记几乎与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.

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
显示图像的RGB编号的java   java JavaFX画布2D游戏:背景变换vs.绘画   在到达maxElementsInMemory之前创建的java DiskMarker   a4j:ajax可用事件的java详尽列表?   java从批处理文件运行jar文件,如果出现错误,则显示meessage   音频Java在背景音乐之上播放声音   用于在FTP中上载文件的java更改目录   尽管设置了必要的属性,java列表项仍不会保持选中状态   java Stanford Core NLP解析与CSV   java使用缓冲区合并热态和冷态   java无法初始化类javax。加密。JCE安全   对这个Java循环如此困惑的输入   java Spring RabbitMQ SimpleRabbitListenerContainerFactory用法   java如何使用jGrowl创建JSF消息   安装jRebel插件后,Netbeans项目中的java源文件夹不可见?   如何在Java中解析复杂的json字符串   java Spark KafkaUtils CreateRDD在键上应用过滤器   try块中的java代码被忽略,为什么?