0%

导出Confluence空间为PDF

Confluence是一个专业的知识管理与协同软件,我用来记录、管理自己的笔记。同时Confluence还是一个非常复杂的系统,复杂就容易出问题。为了在极端情况下(例如数据库奔溃)还能打开自己的笔记,开发了一个脚本,定时导出Confluence空间为PDF文件。

资料查找

在开发之前,一定要找找是否有类似的工具,能达到相同的目的。

confluence

confluence自身提供了导出为PDF的功能,并且还提供了python api,可惜只能导出单个页面为PDF文件,不支持导出整个空间。

如果对空间有管理员权限,进入空间管理->内容工具->导出,可以选择导出为HTML、XML或PDF。这个满足需求,可惜没有提供API。在寻找资料时,有帖子说老版本提供了API,但是新版本不支持了。

Confluence Command Line Interface

寻找资料时发现了一个非常牛逼的工具,Confluence Command Line Interface,支持非常多的功能,当然也支持导出整个空间为PDF。但是需要配合插件使用,插件需要收费。由于没有找到**插件的方法,所以放弃。

方法1:导出所有页面然后合并

考虑到confluence提供了导出单个页面为PDF的API,所以导出所有的页面,然后合并为一个PDF文件,也不是什么难事。脚本的主要思路如下,源码请移步github

  1. get_all_spaces() 获取所有空间的key
  2. get_home_page_of_space() 获取指定空间的homepage id
  3. get_page_child_by_type() 获取指定页面的一级子页面
  4. 递归获取页面转化为BytesIO对象,追加到PdfFileMerger对象
  5. PdfFileMerger写入到文件,使用space name作为文件名。

需要安装atlassian apiPyPDF2

1
2
pip install atlassian-python-api
pip install PyPDF2

但是这种方法有以下两个缺点:

  1. PDF的大纲没有层次,父页面的大纲和子页面的大纲处于同一级。
  2. 在PDF点击目录宏的链接,会跳转到网页,而不是PDF对应的页面。

方法2:使用空间管理工具导出

Confluence的空间管理工具可以很好的导出PDF,但是没有API。但是可以利用无头浏览器,模拟人点击网页,达到导出整个空间为pdf的目的。源码请异步github

需要安装atlassian apiseleniumChrome webdriver

1
2
3
pip install atlassian-python-api
pip install selenium
apt-get install chromium-chromedriver

自定义PDF样式

confluence支持自定义PDF的样式,包含页眉、页脚、字体、字号等等内容。更加详细的内容可以参考官方文档

设置PDF字体大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.wiki-content h1
{ font-size: 26pt; }

.wiki-content h2
{ font-size: 22pt; }

.wiki-content h3
{ font-size: 16pt; }

.wiki-content h4
{ font-size: 14pt; }

.wiki-content h5
{ font-size: 14pt; }

.wiki-content h6
{ font-size: 14pt; }

body,p,li,td,table,tr,.bodytext,.stepfield
{ font-size: 12pt; }

参考