DITA-OT 4.0新特性 - PDF themes,定制PDF样式的新方法
随着DITA-OT 4.0的发布,它提供了一种新的定制PDF样式方法,这种方法就是PDF theme。这篇文章来聊一聊这种定制PDF输出的新方法和实验结果。
在进入PDF theme细节之前,为各位读者梳理一下DITA-OT将DITA和Markdown发布成PDF的几种方法。
- 1 -
DITA-OT发布PDF的几种方法
DITA-OT是优秀的结构化内容发布工具,是开源产品并得到广泛应用。很多公司将DITA-OT集成到自家的产品中,还有公司在DITA-OT的基础上做了扩展。
现在,在DITA-OT的基础上,出现了多种发布PDF文档的方法。下边是其中两种,请点开图看细节。

1. 使用PDF2插件
开源版DITA-OT将DITA和Markdown发布成PDF时,使用的是上图中”1. 使用PDF2插件“的方法,它使用的是XSLT/XSL-FO技术。
XSL-FO技术是DITA-OT用来发布PDF的技术,目前也还有广泛的应用。当我们运行以下命令,它使用的就是这种方法:
dita -i book.ditamap -f pdf -o out/pdf
此命令调用DITA-OT的PDF2插件,将DITA内容转换成PDF。
在Oxygen XML Editor中选择”DITA Map PDF - based on XSL-FO"发布文档时,调用的也是这个插件:

2. 使用pdf-css-html5
在2018年W3C发布了“CSS页面媒体模块级别3”标准,用于支持使用CSS来将HTML页面发布成基于纸面的输出,如:PDF。这种方法得到了几个主流发布引擎厂商的支持,比如:Antenna House,PrinceXML和SyncRO Soft (也就是生产Oxygen XML Editor那家公司)。
pdf-css-html5是SyncRO Soft基于DITA-OT开发的插件,用于使用CSS技术来将DITA发布成PDF。这个插件只存在Oxygen XML Editor和Oxygen Publish Engine中,是商用软件。
在Oxygen XML Editor中选择”DITA Map PDF - based on HTML & CSS"发布文档时,调用的则是这个插件:

如果使用开源版DITA-OT(不包含商业插件),在DITA-OT 4.0之前定制PDF样式需要使用XSLT/XSL-FO语言,这对于TW来说有挑战。

“我是写文档的,XSLT/XSL-FO?什么鬼?不想了解”
就算对于专业做样式定制的,使用XSL-FO开发和维护成本总体较高。原因请见我之前文章的分析:将CSS用于PDF发布
为了降低XSLT/XSL-FO定制PDF输出样式的难度和成本,DITA-OT 4.0提供DITA theme来尝试降低定制PDF的难度和成本。
DITA-OT 4.0包括com.elovirta.pdf插件,它通过提供theme参数扩展了默认的PDF2插件功能,在不需要更改XSLT样式表的情况下更改PDF输出的样式。
- 2 -
DITA Theme概要
DITA theme可用于调整PDF输出的基本设置,如:封面图片、页面大小、编号、字体属性、背景色和边框、间距以及页眉和页脚等动态内容。
要使用自定义theme生成PDF输出,dita调用命令如下:
dita -i book.ditamap -f pdf -o out/pdf --theme=path/to/custom-theme-file.yaml
theme文件可以用YAML或JSON格式编写,DITA-OT安装目录中的docsrc/samples/themes文件夹提供了几个示例。
通过theme文件可以定制以下PDF选项:
-
页面设置
-
页眉和页脚
-
内容元素的样式
1. 页面设置示例
page:size: A4orientation: portraittop: 20mmoutside: 20mmbottom: 20mminside: 30mmmirror-margins: true
2. 页眉和页脚示例:
header:border-after: solid 1pt blackodd:content: '{title}'text-align: endeven:content: '{chapter}'text-align: start
3. 内容元素的样式示例:
style:body:font-family: seriffont-size: 12ptspace-after: 6ptspace-before: 6ptstart-indent: 25pttopic:font-family: sans-seriffont-size: 26ptlink:color: bluetext-decoration: underline
DITA-OT的PDF theme文档在这里:
https://www.dita-ot.org/dev/topics/pdf-themes
- 3 -
实验
在DITA-OT提供的示例theme基础上做以下调整:
1)整体和首页
- 设置中文字体
- 加logo并居中

2)页眉页脚
- 加分割线
- 内容设置为:文档标题 + 章节标题
- 页脚中的页码居中显示
- 加公司logo

3)表格
- 表格标题居中显示
- 表格序号自动生成
- 标题行自动粗体并使用灰色背景

4)图形
- 图形标题居中显示
- 图形序号自动生成

5)代码块和注
- 灰色背景
- 适合代码的字体

- 4 -
总结
说一说使用DITA theme来定制PDF的感受:
-
语法简单,类似于CSS,容易掌握
-
能够做一些简单的定制,目前无法做到对输出的完全控制,可以预测后续版本会有更多的增强
-
此方法是通过配置文件来控制XSL-FO的生成,要理解配置的参数意义需要了解XSL-FO
点这里查看代码和生成的PDF文件。
相关文章:
DITA-OT 4.0新特性 - PDF themes,定制PDF样式的新方法
随着DITA-OT 4.0的发布,它提供了一种新的定制PDF样式方法,这种方法就是PDF theme。这篇文章来聊一聊这种定制PDF输出的新方法和实验结果。 在进入PDF theme细节之前,为各位读者梳理一下DITA-OT将DITA和Markdown发布成PDF的几种方法。 - 1 …...
MySQL 8.0 OCP认证精讲视频、环境和题库之四 多实例启动 缓存、事务、脏读
一、配置第一个mysqld服务 1、编辑选项文件,指定以下选项: [mysqld] basedir/mysql80 datadir/mysql80/data1 socket/mysql80/data1/mysqld.sock pid-file/mysql80/data1/mysqld.pid log-error/mysql80/dat…...
对代码感兴趣 但不擅长数学怎么办——《机器学习图解》来救你
目前,该领域中将理论与实践相结合、通俗易懂的著作较少。机器学习是人工智能的一部分,很多初学者往往把机器学习和深度学习作为人工智能入门的突破口,非科班出身的人士更是如此。当前,国内纵向复合型人才和横向复合型人才奇缺;具有…...
【EI会议征稿】第三届大数据、信息与计算机网络国际学术会议(BDICN 2024)
第三届大数据、信息与计算机网络国际学术会议(BDICN 2024) 2024 3rd International Conference on Big Data, Information and Computer Network 第三届大数据、信息与计算机网络国际学术会议(BDICN 2024)定于2024年1月12-14日在…...
【Arduino+ESP32+腾讯云+sg90】强制门户+腾讯云控制开关灯
作者有话说 博主对于Arduino开发并没有基础,但是为了实现更加方便的配网,这几天一直在尝试用ESP32-12F(因为手头刚好有一个,其他的也可以)来做远程开关灯!不知道大家是否注意到,上一篇利用STM32…...
windows中elasticsearch7中添加用户名密码验证
1.找到elsatic的bin目录输入cmd 2.生成ca证书 输入 elasticsearch-certutil ca 在es7根目录生成ca证书,输入密码时直接回车即可,否则后面会报错 Please enter the desired output file [elastic-stack-ca.p12]: #这里直接回车即可 Enter password for…...
linux安装达梦数据库(命令行安装)
安装达梦数据库 创建安装用户 1,创建安装用户组dinstall [rootdmDMServer1 ~]# groupadd -g 12345 dinstallgroupadd : 创建组 -g : 指定组id(GID) 12345: 指定的组名称 dinstall : 组名 2,创建安装用户dmdba [rootdmDMSe…...
Flutter——最详细(CustomScrollView)使用教程
CustomScrollView简介 创建一个 [ScrollView],该视图使用薄片创建自定义滚动效果。 [SliverList],这是一个显示线性子项列表的银子列表。 [SliverFixedExtentList],这是一种更高效的薄片,它显示沿滚动轴具有相同范围的子级的线性列…...
解决容器内deepspeed微调大模型报错
解决容器内deepspeed微调大模型报错:[launch.py:315:sigkill_handler] Killing subprocess 问题描述:解决办法 问题描述: 在容器中用deepspeed微调百川大模型2时,出现上述错误,错误是由于生成容器时,共享内…...
UE 插件模块引用
如Plugons中的模块A想要引用模块B: 1、模块A中的.uplugin文件加入↓ 2、模块A中的.Build.cs文件加入↓ 3、在模块A需要用到模块B的地方直接include 4、重新generate Project 5、重新编译 注意两个模块之间不能循环引用...
python元组、拆包和装包
注意 元组不能修改元素 元组:如果元素为字符串且元素为1个,必须加一个, ********* t1 (aa,) 下标和切片 in not in for ... in ... 元组转为列表 拆包、装包...
1-Docker安装MySQL8.0
1 背景知识记录 1.1 MySQL 的基本配置记录 MySQL的配置文件目录(/etc/mysql): root2dd6033b5c17:/etc/mysql# pwd /etc/mysql root2dd6033b5c17:/etc/mysql# ls conf.d my.cnf my.cnf.fallback MySQL的data文件目录(/var/lib/my…...
配电房智能化改造在加油站等的应用
随着科技的发展和智能化趋势的推进,对加油站配电房进行智能化改造成为了一个必然的选择。智能化改造不仅可以提高加油站的工作效率,减少事故发生率,还可以实现能源的合理利用,提高经济效益。 力安科技加油站智能化改造升级是一种高…...
集准测试-架构真题(五十六)
如果数据库单标即可实现业务功能,采用()方式进行数据交换与处理较为合适。如果通过数据库不同表的连接操作获取数据才能实现业务功能,这时候采用()方式进行数据交换与处理合适。 主动记录数据网关包装器数…...
木与空间的舞蹈:奥地利住宅的独特设计
国外著名设计师,为一位业主设计了一座住宅,附带有附属建筑和有盖的入口,形成了像庭院一样的建筑群。 这座住宅采用了当地的传统建筑风格,有长方形的平面和陡峭的顶棚,与周围的房屋相符。然而,内部设计别具一…...
性能优化-卡顿优化-tarce抓取及分析
性能优化(卡顿分析) 文章目录 一、抓取trace的方法1.使用systrace抓取trace2.使用atrace抓取3.使用Perfetto抓取trace 二、trace文件的分析1.快捷操作1.1 导航操作1.2 快捷操作 2.chrome trace工具分析trace文件3.Prefetto分析trace文件 一、抓取trace的…...
P5740 【深基7.例9】最厉害的学生
题目描述 现有 N N N 名同学参加了期末考试,并且获得了每名同学的信息:姓名(不超过 8 8 8 个字符的仅有英文小写字母的字符串)、语文、数学、英语成绩(均为不超过 150 150 150 的自然数)。总分最高的学…...
Hive引擎MR、Tez、Spark
Hive引擎包括:默认MR、Tez、Spark 不更换引擎hive默认的就是MR。 MapReduce:是一种编程模型,用于大规模数据集(大于1TB)的并行运算。 Hive on Spark:Hive既作为存储元数据又负责SQL的解析优化࿰…...
不写前端代码,curl直接调试sse
不写前端代码,curl直接开两个终端调试sse 过程: 客户端向服务端发送建立连接请求; 服务端向客户端推送内容; 服务端向客户端发送结束信号并结束 注意事项: 只有连接时要求content-type是xxx 其他问题: …...
百分点科技受邀参加“一带一路”国际合作高峰论坛
10月17-18日,第三届“一带一路”国际合作高峰论坛在北京成功举行。作为新一代信息技术出海企业代表,百分点科技董事长兼CEO苏萌受邀出席高峰论坛开场活动——“一带一路”企业家大会,与来自82个国家和地区的企业或机构、有关国际组织、经济机…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
