将CSS用于PDF发布
近年来,随着人们使用多种尺寸屏幕的设备(笔记本、平板、手机、智能手表等),将结构化文档发布成适应这些设备的电子格式需求旺盛。另一方面,PDF格式的文档具有可以保证内容和格式不被修改、方便保存和传递等特点。所以,发布成基于纸张输出的需求并没有消失。本文讨论发布基于纸张输出(PDF)的技术探索和进展。
XSL-FO和CSS都是W3C的标准。
最初,CSS被设计用于支持HTML的Web浏览;XSL-FO被用于支持基于纸张的发布(打印)。
近年来有一个新的趋势:使用CSS来支持基于纸张的发布。
一方面XSL-FO 1.1已经很成熟稳定,后续需求少,并未定义下一版本发布时间。另一方面,CSS除支持HTML的Web浏览外,2014年CSS3增加了基于页面媒体模块的工作草案,可用于支持基于纸张的发布。
那么是否我们应该放弃XSLT/XSL-FO,而使用CSS呢?本文探讨这个话题。
- 1 -
为什么考虑使用CSS来生成PDF
首先,XSLT/XSL-FO人才稀缺性。
一方面,掌握XSLT和XSL-FO技能的人少,市场上难以找到相关的人才。如果只掌握XSLT/XSL-FO,应用的领域就是数据处理和发布,职业发展路径狭窄,造成培养人才和保留人员困难。
另一方面,CSS技术在Web上使用广泛,掌握CSS的人相对较多,通过学习CSS中页面相关知识即可开发PDF样式。
其次,是降低复杂度的需求。
XSLT虽然是一门操控性很强的数据处理语言,但是对于大型发布系统它相对复杂、代码不容易维护。开发人员容易出现头痛医头、脚痛医脚的情况,造成每次发布都要根据数据来调整样式表的情况。
反观CSS,它更加直观、简单,更容易维护。
最后,是降低成本的需求。
1. 使用CSS,让共用PDF和Web浏览的样式成为可能,能够节约开发和维护成本;
2. 它避免技术人员为输出PDF和HTML而学习两种语言;
3. 缩短开发时间。
- 2 -
业界观点
调研了业界专家的思考,总结如下:
一、CSS还是XSL-FO?
作者:来自Antenna House的Michael Miller,2020年6月
https://www.antennahouse.com/news/css-or-xsl-fo-webinar-recording?hsLang=en
注:视频中,Michael并没有偏向CSS或者XSL-FO。Antenna House既支持XSL-FO也支持CSS,他希望大家使用XSL-FO或者CSS来做纸质出版。
PDF输出需求依然存在;
什么时候使用XSL-FO:飞机、潜艇、汽车的手册;
XSL-FO与CSS的比较。
XSL-FO
存在20多年;
可以实现复杂的文档排版需求;
业界已经在此技术上投入很大努力;
有更多的可用资源。
已经开发好的DITA、DockBook、S1000D样式;
可用的产品:开源的和商业的。
CSS
已存在13年;
可以实现几乎同级别的复杂排版需求;
容易使用也容易学习 = 容易维护并更经济;
CSS的简单也意味着限制(并没有提到具体的限制)。
问答环节
CSS能实现XSL-FO能实现功能的90-95%,Antenna House网站有CSS和XSL-FO详细功能对比;
有人从XSL-FO转到CSS,说减少1/3的开发时间。
二、为什么使用CSS而不是XSL-FO?
来自:Oxygen Chemistry帮助文档
https://www.oxygenxml.com/doc/versions/24.1/ug-chemistry/topics/ch_getting_started.html
没有一个简单的答案。这实际上取决于所需的输出,但这两种方法都可以生成PDF文档,没有任何问题。那么为什么要使用CSS呢?
CSS比XSLT更容易学习和掌握。
更多的人知道CSS而不是XSLT(而且可用的CSS教程比XSLT教程更多)。
CSS调试可以直接从任何浏览器或者Oxygen Author完成。
在大多数情况下,CSS定制将覆盖用户的所有需求。
CSS定制可以在任何HTML输出中重用。
级联优先级方案使CSS更易于扩展(无需知道以前的规则即可创建新规则)。
PDF处理器通常支持这两种解决方案(Oxygen Chemistry, Antenna House, Prince XML)。
三、XSL-FO已没落,CSS页面媒体是主要嫌疑人。
作者:来自RockWeb的Mike Kelly,2019年4月
https://readwritecode.net/ebooks/2019/04/27/xsl-fo-is-dead-css-paged-media-is-prime-suspect.html
1)XSL-FO优势:
有开源实现FOP;
有稳定的商业实现:RenderX,Antenna House,他们都提供了对XSL-FO标准的支持;
XSLT一般和XSL-FO一起使用,XSLT是一个处理XML数据的语言,对数据有很强的控制能力。
W3C XML活动负责人Liam R. E. Quin 2013年11月说:
我们关闭了工作组,因为没有足够的人参加。
不在新项目中使用XSL-FO的一个理由是,负责规范的W3C工作组不再活跃,也不再维护。从另一方面说,这也表示它现在已经足够好了,不需要进一步的修订或扩展。
2)CSS是未来吗?
是的,我相信在未来几年内,CSS将取代XSL-FO在世界出版社的地位,就像在O’Reilly公司已经发生的那样。
但根据Mozilla的说法,到目前为止,浏览器中还不能使用CSS页面媒体,目前只有基本支持。
因此,您需要使用PDF处理器将XHTML和CSS转换为PDF。
3)供应商锁定?
支持CSS用于PDF发布的处理器并不便宜,而且有很多特定于供应商的扩展属性,我会对代码的可移植性和供应商的锁定有一些担心。
4)结论
XSL-FO还没有死,现在仍然能够胜任作为基于XML的发布系统基础的任务。如果您只对印刷媒体感兴趣,并且没有支持ePub的计划,我建议您毫无保留地使用XSL-FO。
然而,如果您还需要支持ePub,CSS应该出现在您的计划中。它的发展很快,页面媒体规范现在是一个工作草案,这意味着浏览器供应商开始实施它。
总而言之,这是一个有趣的时间来参与打印开发。
四、大龙的备注
使用Oxygen Chemistry做了初步的测试,用CSS做PDF输出容易上手。
对一些典型的PDF格式用户手册进行了分析,挑出来可能有实现难度的样式。实验表明对于很多常见的输出要求,厂家的发布引擎已经有解决方案。 如果需要代码具备可移植性,目前还有挑战,使用时要关注。
CSS具有很好的群众基础,并且发展速度比XSL-FO快,是一个值得投资的技术方向。
- 3 -
现有引擎
1)Antenna House
https://www.antennahouse.com/
网站有丰富的CSS相关资源和很详细的对CSS支持的信息。
2)Oxygen Chemistry
https://www.oxygenxml.com/doc/versions/24.1/ug-chemistry/
Oxygen Chemistry底层使用了FOP(对,就是Apache那个XSL-FO开源引擎)。需要对输出的PDF,尤其是包括中文的PDF进行验证。
3)Prince XML
https://www.princexml.com/download/
4)PDFreactor
https://www.pdfreactor.com/
5)XHTML2PDF
https://xhtml2pdf.readthedocs.io/en/latest/#
更多结构化内容和工具,请见:www.manualsware.com
将CSS用于PDF发布相关推荐
- 使用PHP将HTML + CSS转换为PDF? [关闭]
关闭. 这个问题是题外话 . 它当前不接受答案. 想改善这个问题吗? 更新问题 ,使其成为Stack Overflow 的主题 . 3年前关闭. 我有一个HTML(不是XHTML)文档,可以在Fire ...
- html pdf支持css%写法吗,flying-saucer-pdf终于完美解决了(中文问题,换行问题,分页,页眉页脚,水印),html+css控制pdf样式...
集成freemarker+flying-saucer-pdf+itext,通过html模板生成PDF 折腾了很久,flying-saucer-pdf终于完美解决了(中文问题,换行问题,页眉页脚,水印) ...
- [css] 你知道CSS的标准发布流程吗?
[css] 你知道CSS的标准发布流程吗? 随着 CSS 3 的广泛应用,很多新的 CSS 属性层出不穷,有很多陌生的 CSS 属性出现,所以经常需要去学习新的 CSS 属性.新的属性往往介绍文章不多 ...
- linux下怎么将html换成pdf,如何在Linux上使用PHP将HTML/CSS转换为PDF
我一直试图将html页面转换为PDF,但没有任何运气,我尝试使用wkhtmltopdf(http://code.google.com/p/) wkhtmltopdf /)和虽然下面的命令在终端正确执行 ...
- 发布 'xx' 的并发快照不可用,因为该快照尚未完全生成,或者日志读取器代理未运行,无法激活它。如果并发快照的生成过程中断,则必须重新启动用于该发布的快照代理,直到生成完整的快照。
发布 'xx' 的并发快照不可用,因为该快照尚未完全生成,或者日志读取器代理未运行,无法激活它.如果并发快照的生成过程中断,则必须重新启动用于该发布的快照代理,直到生成完整的快照. 这些步骤是在分发服 ...
- 发布一个MsBuild任务组件-可用于同时发布多个网站
组件项目: /Files/jillzhang/Publishers.rar 演示项目: /Files/jillzhang/PubliserSample.rar 在Vs 2005 没有打Sp1的时候,可 ...
- pypdf2 存储pdf_PyPDF2:用于PDF文件操作的Python库
pypdf2 存储pdf PyPDF2 is a pure-python library to work with PDF files. We can use the PyPDF2 module to ...
- TCP/IP协议精华指南pdf发布
hi ,大家好,应小伙伴们的要求,昨天分享了个人的一些学习经验: 个人学习方法分享 这些经验是我自己多年不断总结得出的,希望可以给大家一点参考借鉴,但路还是需要自己走,大家还是要自己多总结,后面也可以 ...
- python读取pdf文件 pdfplumber_Python pdfprumber用于PDF表提取,pythonpdfplumber,表格
import pdfplumber import pandas as pd import xlwt def toEcel(): workbook = xlwt.Workbook() # 定义workb ...
最新文章
- 吴恩达新书《Machine Learning Yearning》中7个实用建议(附论文)
- 安装SeleniumPhantomJS
- 关于RNA-seq数据集的小结
- Linux中写入ISO镜像
- Spring JPA
- mutable和volatile关键字
- 普通队列(数组实现)
- 【Hadoop学习】Super用户以其他用户的名义执行操作
- cpu vtx测试软件,推荐几个好用的检测电脑CPU是否支持(Virtualization Technology)虚拟化技术的工具-推荐实用小软件
-亦是美网络...
- 攻击日志分析 中职网络安全
- 第三方支付之支付宝支付
- NERO刻录ISO镜像图解教程
- 关于本人树莓派捣鼓过程中的一些记录
- 基于自适应反向学习的黏菌算法
- 原始混合合成器:Arturia Analog Lab for Mac
- 物联网智能硬件与嵌入式系统
- 每日自动签到签退的程序
- “路漫漫其修远兮,吾将上下而求索”,方向、方向、方向在哪里?
- 提高bp神经网络预测精度,bp神经网络数据预处理
- Vegas13安装教程图文附下载地址