作者: Jim Wang 公众号: 巴博萨船长
摘要:该项目使用的ReportLab模块使用RML模版文件生产PDF文件,RML标记语言使用规范文件DTD来定义字段。本文介绍了RML模版的DTD文件定义和使用方式。
Abstract: The project uses the ReportLab module to produce PDF documents using RML template files and the RML markup language to define the fields using the specification file DTD. This article describes how the DTD file for the RML template is defined and used.
作者: Jim Wang 公众号: 巴博萨船长
ReportLab 模版RML文件的规范文件DTD 关于RML RML2PDF 是该工具包的核心组件:将高级XML标记文件RML转换为PDF文档。报告标记语言RML描述打印文档的精确布局,RML2PDF 一步将其转换为完成的文档。在专用报告应用程序中,我们工具包的其他组件处理数据采集和准备标记文件RML。
RML 是 Report Markup Language - XML 语言家族的一员,也是 rml2pdf 用来生成 Adobe 可移植文档格式 (PDF) 文档的 XML 方言。
RML 文档可以由程序自动编写,也可以使用任何可以输出文本文件的文字处理器手动编写(例如,使用保存菜单中的“另存为文本”选项)。由于 RML 文档是基本的文本文件,它们可以通过 Python、Perl 或几乎任何其他语言的脚本即时创建。
RML 使在 PDF 中创建文档就像创建基本网页一样简单 - RML 与 HTML 一样容易编写,并且像 HTML 一样使用“标签”。这比尝试以编程方式编写 PDF 容易得多。
创建DTD文件可以规范RML文件的,合理完善的DTD文件,可以在IDE的协助下,用于检查语法和自动完成代码。
关于DTD 本项目中我们使用rml.dtd文件规范RML文件。文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:”to、from、heading,、body”
!ELEMENT to (第四行)定义 to 元素为 “#PCDATA” 类型
!ELEMENT from (第五行)定义 from 元素为 “#PCDATA” 类型
!ELEMENT heading (第六行)定义 heading 元素为 “#PCDATA” 类型
!ELEMENT body (第七行)定义 body 元素为 “#PCDATA” 类型
根据Report的官方文档中,对于各个字段的定义,可以完善总结出一个如下的DTD文件内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 <!ELEMENT document (#PCDATA | docinit | stylesheet | template | story | pageInfo | pageDrawing)*> <!ATTLIST document filename CDATA #REQUIRED> <!ATTLIST document title CDATA #IMPLIED> <!ATTLIST document subject CDATA #IMPLIED> <!ATTLIST document author CDATA #IMPLIED> <!ATTLIST document creator CDATA #IMPLIED> <!ATTLIST document debug CDATA #IMPLIED> <!ATTLIST document compression CDATA #IMPLIED> <!ATTLIST document invariant CDATA #IMPLIED> <!ELEMENT docinit (color* | name* | registerType1Face* | registerFont* | registerCidFont* | registerTTFont* | registerFontFamily* | addMapping* | logConfig* | cropMarks* | startIndex*)> <!ATTLIST docinit pageMode (usenone | useoutlines | usethumbs | fullscreen) #IMPLIED> <!ATTLIST docinit pageLayout (singlepage | onecolumn | twocolumnleft | twocolumnright) #IMPLIED> <!ATTLIST docinit useCropMarks CDATA #IMPLIED> <!ATTLIST docinit hideToolbar CDATA #IMPLIED> <!ATTLIST docinit hideMenubar CDATA #IMPLIED> <!ATTLIST docinit hideWindowUI CDATA #IMPLIED> <!ATTLIST docinit fitWindow CDATA #IMPLIED> <!ATTLIST docinit centerWindow CDATA #IMPLIED> <!ATTLIST docinit displayDocTitle CDATA #IMPLIED> <!ATTLIST docinit nonFullScreenPageMode (usenone | useoutlines | usethumbs | useoc) #IMPLIED> <!ATTLIST docinit direction (l2r | r2l) #IMPLIED> <!ATTLIST docinit viewArea (mediabox | cropbox | bleedbox | trimbox | artbox) #IMPLIED> <!ATTLIST docinit viewClip (mediabox | cropbox | bleedbox | trimbox | artbox) #IMPLIED> <!ATTLIST docinit printArea (mediabox | cropbox | bleedbox | trimbox | artbox) #IMPLIED> <!ATTLIST docinit printClip (mediabox | cropbox | bleedbox | trimbox | artbox) #IMPLIED> <!ATTLIST docinit printScaling (none | appdefault) #IMPLIED> <!ELEMENT color EMPTY> <!ATTLIST color id CDATA #REQUIRED> <!ATTLIST color RGB CDATA #IMPLIED> <!ATTLIST color CMYK CDATA #IMPLIED> <!ATTLIST color value CDATA #IMPLIED> <!ATTLIST color spotName CDATA #IMPLIED> <!ATTLIST color density CDATA #IMPLIED> <!ATTLIST color knockout CDATA #IMPLIED> <!ATTLIST color alpha CDATA #IMPLIED> <!ELEMENT name EMPTY> <!ATTLIST name id CDATA #REQUIRED> <!ATTLIST name value CDATA #REQUIRED> ...
将开文件命名为rml.dtd,并保存在RML的同级目录中,在RML文件中第一行可以如下书写完成DTD文件的引用。
1 <!DOCTYPE document SYSTEM "rml.dtd" >
本文小结 这些背景知识是自己在完成任务的一开始具有的疑问,进而中查阅资料再收集整理成文的,这利于自己,也方便你我。如果你有问题或者不同的见解,欢迎关注我的微信公众号,然后留言讨论。