广告
返回顶部
首页 > 资讯 > 后端开发 > Python >使用rst2pdf实现将sphinx生成PDF
  • 593
分享到

使用rst2pdf实现将sphinx生成PDF

rst2pdfsphinxPDF 2022-06-04 19:06:47 593人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

当初项目文档是用sphinx写的,一套rst下来make html得到一整个漂亮的在线文档。现在想要将文档导出为离线的handbook pdf,于是找到了rst2pdf这个项目,作为sphinx的拓展,然后

当初项目文档是用sphinx写的,一套rst下来make html得到一整个漂亮的在线文档。现在想要将文档导出为离线的handbook pdf,于是找到了rst2pdf这个项目,作为sphinx的拓展,然后加上少量配置即可输出中文PDF。

rst2pdf

简介

查看图片

rst2pdf是一个将 reStructuredText 转换为 PDF 的工具,具有下列特性:

自定义页面布局 支持层叠样式表 支持内嵌TTF和Type1字体 支持几乎所有语言的语法高亮 使用reStructuredText作为源文件 支持字间距调整

安装


easy_install rst2pdf

配置rst2pdf

注册到sphinx项目

需要告诉sphinx我们安装了rst2pdf,并且将其作为插件使用。只需在项目根目录下的conf.py中配置:


# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
  'sphinx.ext.autodoc',
  'rst2pdf.pdfbuilder'
]

即可。然后,在conf.py中拷入PDF相关的配置:


# -- Options for PDF output --------------------------------------------------
 
# Grouping the document tree into PDF files. List of tuples
# (source start file, target name, title, author, options).
#
# If there is more than one author, separate them with \.
# For example: r'Guido van Rossum\Fred L. Drake, Jr., editor'
#
# The options element is a dictionary that lets you override
# this config per-document.
# For example,
# ('index', u'MyProject', u'My Project', u'Author Name',
# dict(pdf_compressed = True))
# would mean that specific document would be compressed
# regardless of the global pdf_compressed setting.
 
pdf_documents = [
  ('index', u'HaNLP Handbook', u'HanLP Handbook', u'hankcs'),
]
 
# A comma-separated list of custom stylesheets. Example:
pdf_stylesheets = ['a3','zh_CN']
 
# Create a compressed PDF
# Use True/False or 1/0
# Example: compressed=True
#pdf_compressed = False
 
# A colon-separated list of folders to search for fonts. Example:
pdf_font_path = ['C:\windows\Fonts']
 
# Language to be used for hyphenation support
pdf_language = "zh_CN"
 
# Mode for literal blocks wider than the frame. Can be
# overflow, shrink or truncate
pdf_fit_mode = "shrink"
 
# Section level that forces a break page.
# For example: 1 means top-level sections start in a new page
# 0 means disabled
#pdf_break_level = 0
 
# When a section starts in a new page, force it to be 'even', 'odd',
# or just use 'any'
#pdf_breakside = 'any'
 
# Insert footnotes where they are defined instead of
# at the end.
#pdf_inline_footnotes = True
 
# verbosity level. 0 1 or 2
#pdf_verbosity = 0
 
# If false, no index is generated.
#pdf_use_index = True
 
# If false, no modindex is generated.
#pdf_use_modindex = True
 
# If false, no coverpage is generated.
#pdf_use_coverpage = True
 
# Documents to append as an appendix to all manuals.
#pdf_appendices = []
 
# Enable experimental feature to split table cells. Use it
# if you get "DelayedTable too big" errors
#pdf_splittables = False
 
# Set the default DPI for images
#pdf_default_dpi = 72
 
# Enable rst2pdf extension modules (default is only vectorpdf)
# you need vectorpdf if you want to use sphinx's graphviz support
#pdf_extensions = ['vectorpdf']
 
# Page template name for "regular" pages
#pdf_page_template = 'cutePage'
 
# Show Table Of Contents at the beginning?
# pdf_use_toc = False
 
# How many levels deep should the table of contents be?
pdf_toc_depth = 2
 
# Add section number to section references
pdf_use_numbered_links = False
 
# Background images fitting mode
pdf_fit_background_mode = 'scale'

具体配置项的值请自行调整,不需要严格按照我的来。

样式表

在项目根目录下创建一个zh_CN.JSON,写入:


{
 "embeddedFonts": [
  "simsun.ttc"
 ],
 "fontsAlias": {
  "stdFont": "simsun",
  "stdBold": "simsun",
  "stdItalic": "simsun",
  "stdBoldItalic": "simsun",
  "stdMono": "simsun",
  "stdMonoBold": "simsun",
  "stdMonoItalic": "simsun",
  "stdMonoBoldItalic": "simsun",
  "stdSans": "simsun",
  "stdSansBold": "simsun",
  "stdSansItalic": "simsun",
  "stdSansBoldItalic": "simsun"
 },
 "styles": [
  [
   "base",
   {
    "WordWrap": "CJK"
   }
  ],
  [
   "literal",
   {
    "wordWrap": "None"
   }
  ]
 ]
}

关于以上样式的说明:

embeddedFonts用于嵌入字体,经试验,必须包含至少四个值才不会报错。不过这四个字体值可以是重复的。

fontsAlias用来指定各类字形用什么字体。如stdFont指正文字体,stdBold指粗体,stdItalic指斜体。其他的还有stdBoldItalic粗斜体,stdMono等宽体,等等。确保所用字体已经安装在你的操作系统上,且字体必须是TTF类型的(Windows环境下限制比较多~)。

wordWrap用于指定换行规则,CJK就是适用于中日韩文字的规则。这是从网上的模板抄来的,但经我的测试发现,如果用CJK规则的话,中英混排的文档里面英文部分就没法正常断行,这真是个遗憾。实际上,fontsAlias的分类很多都只对英文字体有意义,如严格来讲中文是没有所谓斜体的(不过因为Word的普及,经常看到中文被设置为斜体的情形)。如果是纯中文文档,当然随便用哪些中文字体都行,如宋体。现实中,经常会有中英文混排的情形,所以如果全用中文字体的话,英文部分就没法显示斜体等字形了。

关于pdf_stylesheets的说明:这个参数中默认使用的某些样式包含了一些字体,而这些字体并非在所有操作系统上都找得到。'sphinx'和'kerning'都是默认提供的样式,要么不用它们,要么直接修改其包含的字体。'a4'指设置输出的PDF为A4纸大小。默认的样式文件可以在rst2pdf的安装路径下找到。

然后配置编译脚本

Windows用户,在make.bat中加入:


if "%1" == "pdf" (
  %SPHINXBUILD% -b pdf %ALLSPHINXOPTS% %BUILDDIR%/pdf
  if errorlevel 1 exit /b 1
  echo.
  echo.Build finished. The pdf files are in %BUILDDIR%/pdf.
  Goto end
)

类Unix用户修改Makefile:


pdf:
  $(SPHINXBUILD) -b pdf $(ALLSPHINXOPTS) $(BUILDDIR)/pdf
  @echo
  @echo "Build finished. The PDF files are in _build/pdf."

输出PDF

然后一句:


make pdf

就能输出PDF了。

解决findfonts.py:249 Unknown font:

这应该是由于pdf_font_path配置有误造成的,事实上,我确定配置无误rst2pdf还是找不到字体文件,于是我修改了X:Program Files (x86)python27Libsite-packagesrst2pdffindfonts.py第236行,在

fontfile = get_nt_fname(fname)

后面加了一句:

fontfile = 'C:\Windows\Fonts\simsun.ttc'

强行解决问题。

解决rst2pdf输出PDF为空白文档

事实上,在字体正常的情况下,我发现输出的PDF依然是空白的:

查看图片

在使用二分法排除rst文件中的问题后,我发现这是由于PDF开头的目录造成的。当目录超出一页时就会发生这种情况,我倾向于认为这是rst2pdf的一个bug。

解决方法是将pdf_toc_depth调小一点,或者干脆不生成目录,pdf_use_toc = False。

PDF效果

于是再次重试,可以生成漂亮的PDF了:

查看图片

相关链接:

Http://sphinx-users.jp/cookbook/pdf/rst2pdf.html

http://ralsina.me/static/manual.pdf

http://www.typemylife.com/sphinx-restructuredtext-pdf-generation-with-rst2pdf/

--结束END--

本文标题: 使用rst2pdf实现将sphinx生成PDF

本文链接: https://www.lsjlt.com/news/14809.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用rst2pdf实现将sphinx生成PDF
    当初项目文档是用sphinx写的,一套rst下来make html得到一整个漂亮的在线文档。现在想要将文档导出为离线的handbook pdf,于是找到了rst2pdf这个项目,作为sphinx的拓展,然后...
    99+
    2022-06-04
    rst2pdf sphinx PDF
  • python使用reportlab生成pdf实例
    目录Intro功能点预览完整代码使用场景1:生成文件使用场景2:web(flask)总结Intro 项目中遇到需要 导出统计报表 等业务时,通常需要 pdf 格式。python 中比...
    99+
    2022-11-13
  • 如何利用java实现生成PDF文件
    目录1.PDF文件简介2.生成PDF2.1 基于freemarker框架实现HTML转PDF2.1.1 引入jar包依赖:2.1.2 创建html模板test_template:2....
    99+
    2022-11-13
    java生成pdf文档 java生成pdf文件表格 java生成pdf
  • 使用PHP进行PDF生成的最佳实践
    PDF已成为一种受欢迎的文件格式,广泛用于各种场景,包括电子书、报表和证明文件。在PHP中,可以使用多种库和工具来生成PDF文档,但是如何选择最佳实践?以下是使用PHP进行PDF生成的最佳实践:1.选择适当的库PHP中有多个PDF库可供选择...
    99+
    2023-05-23
    实践 PHP PDF
  • 手把手教你使用Java实现在线生成pdf文档
    目录一、介绍二、案例实现2.1添加 iText 依赖包2.2简单实现2.3复杂实现2.4变量替换方式三、总结一、介绍 在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需...
    99+
    2022-11-13
  • 如何使用C#/VB.NET实现将PDF转为Word
    本篇内容介绍了“如何使用C#/VB.NET实现将PDF转为Word”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!固定布局模式转换速度快,有利...
    99+
    2023-07-04
  • 二维码生成器:在Linux上使用Java实现实时生成。
    随着智能手机和移动设备的普及,二维码已经成为了一个非常流行的工具。无论是在商业领域还是个人使用中,二维码都可以帮助我们更加便捷地分享信息。在本文中,我们将介绍如何在Linux上使用Java实现一个实时生成二维码的工具。 在开始之前,需要先...
    99+
    2023-07-29
    linux 实时 二维码
  • 使用python实现生成用户信息
    今天练习的时候要展示一个从用户信息列表,就想把他做成信息和修改在一起的一个网页,方便用户修改内容 考虑到要把信息和值分开放,那么肯定是字典了,因为需要保证位置不变,使用有序字典 考虑到需要解析方便和好看点,...
    99+
    2022-06-04
    用户信息 python
  • C#使用GDI+实现生成验证码
    一、概述 一般处理程序 ashx :它没有服务器控件,用response输出什么就是什么。 生成验证码原理:产生随机字符,并将字符生成为图片,同时储存到Session里去,然后验证用...
    99+
    2022-11-13
  • 使用eclipse 实现将springboot项目打成jar包
    前言: 对于经验老道的人员可以路过,但是对于经验比较少的开发者来说,不得不是一篇好的博文,可以让大家少走一些弯路和无用的思考。 下面进入正题!!! 一、首先修改eclipse运行环境...
    99+
    2022-11-12
  • 使用JavaScript实现随机颜色生成器
    目录项目基本结构1.颜色生成器的基本结构2.使用 HTML 添加标题3.创建用于颜色查看的显示器4.创建一个框以查看颜色代码5.创建生成器和复制按钮6.使用 JavaScript 激...
    99+
    2022-11-13
    JavaScript随机颜色生成器 JavaScript随机颜色生成 JavaScript 颜色生成
  • vue前端实现将页面显示内容生成pdf文件的几种方法,html2canvas、dom-to-image、jspdf(带分页)基本使用以及介绍
    实际开发需求:vue项目中,根据数据结构生成echarts图表组件,生成带有样式的图表以后,点击下载按钮,把图表以pdf格式的文件下载到本地 实现思路:将vue界面的echarts组件生成图片,然...
    99+
    2023-09-23
    前端 vue.js pdf
  • JAVA中使用openoffice将Excel转PDF再转图片功能的实现代码
    需求 公司一个小项目要结尾了, 有非常多的表格, 而且非常复杂, 例如 例如:(这表格, 有想死的心…) 看到这样的表格,第一反应是n脸懵逼,这得做到啥时候啊,最后想到用一个方法...
    99+
    2022-11-12
  • python 使用turtle实现实时钟表并生成exe
    源代码 python引入两个内置库turtle和datetime即可制作一个实时钟表,代码如下: # 用turtle画时钟 # 以自定义shape的方式实现 import turt...
    99+
    2022-11-13
  • 使用php 实现生成Excel文件并导出
    在现在的项目里,不管是电商项目还是别的项目,在管理端都会有导出的功能,比方说订单表导出,用户表导出,业绩表导出。这些都需要提前生成excel表,然后在导出,实际上是在代码里生成一张excel表,然后通...
    99+
    2023-09-02
    excel php 开发语言
  • 如何使用eclipse实现将springboot项目打成jar包
    这篇文章主要为大家展示了“如何使用eclipse实现将springboot项目打成jar包”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用eclipse实现将springboot项目打成j...
    99+
    2023-06-20
  • 如何使用Python实现举牌小人生成器
    小编给大家分享一下如何使用Python实现举牌小人生成器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Selenium库的安装与简单使用 1. 安装se...
    99+
    2023-06-15
  • Java使用Freemarker页面静态化生成的实现
    目录前言:1、 Freemarker介绍2、创建模板文件3、生成文件4、 Freemarker指令4.1、assign指令4.2、include指令4.3、if指令4.4、list指...
    99+
    2022-11-13
  • java使用CXF生成客户端实现调用webService接口
    一、使用wsimport生成webService客户端 wsimport是JDK自带的解析wsdl文件生成本地客户端代码的工具。 生成本地客户端代码首先需要有一个wsdl结尾的访问地址或wsdl文件,...
    99+
    2023-09-29
    java 开发语言
  • python3使用迭代生成器实现减少内存占用
    技术背景 在python编码中for循环处理任务时,会将所有的待遍历参量加载到内存中。其实这本没有必要,因为这些参量很有可能是一次性使用的,甚至很多场景下这些参量是不需要同时存储在内...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作