整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

使用Python将HTML转成PDF

要使用的是wkhtmltopdf的Python封装——pdfkit

安装

1. Install python-pdfkit:

$ pip install pdfkit

2. Install wkhtmltopdf:

  • Debian/Ubuntu:

$ sudo apt-get install wkhtmltopdf

  • Redhat/CentOS

sudo yum intsall wkhtmltopdf

  • MacOS

brew install Caskroom/cask/wkhtmltopdf

使用

一个简单的例子:

import pdfkit

pdfkit.from_url('http://google.com', 'out.pdf')

pdfkit.from_file('test.html', 'out.pdf')

pdfkit.from_string('Hello!', 'out.pdf')

你也可以传递一个url或者文件名列表:

pdfkit.from_url(['google.com', 'yandex.ru', 'engadget.com'], 'out.pdf')

pdfkit.from_file(['file1.html', 'file2.html'], 'out.pdf')

也可以传递一个打开的文件:

with open('file.html') as f:

pdfkit.from_file(f, 'out.pdf')

如果你想对生成的PDF作进一步处理, 你可以将其读取到一个变量中:

# 设置输出文件为False,将结果赋给一个变量

pdf = pdfkit.from_url('http://google.com', False)

你可以制定所有的 wkhtmltopdf 选项 http://wkhtmltopdf.org/usage/wkhtmltopdf.txt. 你可以移除选项名字前面的 '--' .如果选项没有值, 使用None, False or * 作为字典值:

options = {

'page-size': 'Letter',

'margin-top': '0.75in',

'margin-right': '0.75in',

'margin-bottom': '0.75in',

'margin-left': '0.75in',

'encoding': "UTF-8",

'no-outline': None

}

pdfkit.from_url('http://google.com', 'out.pdf', options=options)

默认情况下, PDFKit 将会显示所有的 wkhtmltopdf 输出. 如果你不想看到这些信息,你需要传递一个 quiet 选项:

options = {

'quiet': ''

}

pdfkit.from_url('google.com', 'out.pdf', options=options)

由于wkhtmltopdf的命令语法 , TOC 和 Cover 选项必须分开指定:

toc = {

'xsl-style-sheet': 'toc.xsl'

}

cover = 'cover.html'

pdfkit.from_file('file.html', options=options, toc=toc, cover=cover)

当你转换文件、或字符串的时候,你可以通过css选项指定扩展的 CSS 文件。

# 单个 CSS 文件

css = 'example.css'

pdfkit.from_file('file.html', options=options, css=css)

# Multiple CSS files

css = ['example.css', 'example2.css']

pdfkit.from_file('file.html', options=options, css=css)

你也可以通过你的HTML中的meta tags传递任意选项:

body = """

<html>

<head>

<meta name="pdfkit-page-size" content="Legal"/>

<meta name="pdfkit-orientation" content="Landscape"/>

</head>

Hello World!

</html>

"""

pdfkit.from_string(body, 'out.pdf') #with --page-size=Legal and --orientation=Landscape

配置

每个API调用都有一个可选的参数。这应该是pdfkit.configuration()API 调用的一个实例. 采用configuration 选项作为初始化参数。可用的选项有:

  • wkhtmltopdf ——wkhtmltopdf二进制文件所在的位置。默认情况下pdfkit 会尝试使用which (在类UNIX系统中) 或 where (在Windows系统中)来判断
  • meta_tag_prefix -- pdfkit的前缀指定 meta tags(元标签) - 默认情况是pdfkit-

示例 :针对wkhtmltopdf不在系统路径中(不在$PATH里面)

PATH里面):

config = pdfkit.configuration(wkhtmltopdf='/opt/bin/wkhtmltopdf'))

pdfkit.from_string(html_string, output_file, configuration=config)

问题

IOError:'No wkhtmltopdf executable found':

确保 wkhtmltopdf 在你的系统路径中(PATH), 会通过 configuration进行了配置 (详情看上文描述)。 在Windows系统中使用where wkhtmltopdf命令 或 在 linux系统中使用 which wkhtmltopdf 会返回 wkhtmltopdf二进制可执行文件所在的确切位置.

  • IOError: 'Command Failed'

如果出现这个错误意味着 PDFKit不能处理一个输入。你可以尝试直接在错误信息后面直接运行一个命令来查看是什么导致了这个错误 (某些版本的 wkhtmltopdf会因为段错误导致处理失败)

  • 正常生成,但是出现中文乱码

确保两项:

1)、你的系统中有中文字体

2)、在html中加入

下面是我随便写的一个HTML表格:

<html>

<head><meta charset="UTF-8"></head>

<body>

<table width="400" border="1">

<tr>

<th align="left">Item....</th>

<th align="right">1</th>

</tr>

<tr>

<td align="left">衣服</td>

<td align="right">1.10</td>

</tr>

<tr>

<td align="left">化妆品</td>

<td align="right">.00</td>

</tr>

<tr>

<td align="left">食物</td>

<td align="right">0.40</td>

</tr>

<tr>

<th align="left">tOTAL</th>

<th align="right">01.50</th>

</tr>

</table>

</body>

</html>

下面是生成的PDF截图

习目标

将指定的纯文本文档转换为HTML文件。

实现目标

在浏览器中打开最终生成的HMTL文件,呈现下图的样式。

关键内容

python数据挖掘,python爬虫

练习这个项目,最好具备一些HTML基础。

如果没有接触过,这里我做一下简单的介绍。

HTML文件是我们常见的网页文件,其中包含HTML源代码。

HTML源代码由HTML标签组成,这些标签往往是成对出现(个别除外)。

一个简单的HTML示例代码:

<html>

<head>

<meta charset="gbk">

<title>...</title>

</head>

<body>

<h1>一级标题</h1>

<p>我是段落内容。</p>

</body>

</html>

上方的代码复制到一个文本文档中,并将文件后缀改为“.html”,在浏览器中打开即可看到效果。

这里我们看到了一些标签:

  • <html> 和</html> 之间是描述网页的内容<head>和</head>之间是描述页面头部内容<meta>包含有关页面的元信息<title>和</title>之间是显示在浏览器标签上的页面标题<body> 和</body> 之间是描述可见的页面主体内容<h1> 和</h1> 之间的文本内容被显示为一级标题<p> 和</p> 之间的文本内容被显示为文本段落

另外,在这个案例中我们还会用到一些标签。

  • <a>和</a>可以为标签之间的文本添加链接<ul>和</ul>之间是内容列表<li>和</li>之间是列表项<strong>和</strong>之间是加重的文本内容</br>是可以对内容进行换行的换行标签

案例分析

当我们了解了HTML的结构和各种标签的作用,接下来,我们分析一下,如何进行文档与HTML的转换。

1、原始文档中的标题都是大写英文字母开头和英文字母结尾。

2、文档中除了标题,就是段落和列表,段落和列表的区别是:列表中包含列表项。

3、段落中存在换行。

4、列表项(以“●”开头)需要放置于列表中。

3、文档中“*”之间的内容需要加重显示。

实现过程

一、定义处理原始文档内容的模块(util.py)

1、定义一个生成器“lines”,能够为原始文档结尾添加空行。

def lines(file):

for line in file:

yield line # 生成文件的每一行内容

yield '\n' # 为文件末尾添加空行,保证最后添加到block的行能够被生成。

为什么需要在文档末尾添加空行,可以看下方生成器“blocks”代码中的注释进行理解。

2、定义一个生成器“blocks”,对原始文档内容进行读取,当读取到空行,将已读取的内容连接为内容块并生成。

def blocks(file):

block = []

for line in lines(file):

if line.strip(): # 如果读取的行不是空行

block.append(line) # 添加行内容到列表

elif block: # 如果读取空行(如果文件末尾不是空行,则不会执行下方语句块,导致上方语句块最后一次添加的内容无法生成。)

yield ''.join(block).strip() # 连接列表中所有的行内容

block = []

二、定义处理文档的主程序模块(main01.py)

在这个模块中,我们需要导入一些需要使用的内置模块。

  • sys:用于获取命令行终端的输入re:通过正则表达式模块对原始文档内容进行替换。

以下是主程序的具体代码,大家可以通过注释理解整个处理过程。

import sys, re

from util import *

print('<html><head><meta charset="gbk"><title>doc.txt</title></head><body>') # 添加HTML基本标签

blocks = blocks(sys.stdin) # 获取系统标准输入

for block in blocks: # 遍历文件内容

block = re.sub('\*(.+)\*', '<strong>\1</strong>', block) # 替换内容块中两个星号间的内容为加重样式

block = re.sub(r'\n *- *(.+)', '\n<li>\1</li>', block) # 替换内容块中以“-”开头的内容为列表项

block = re.sub(r'([^:>])\n', '\1<br/>\n', block) # 替换内容块中换行符“\n”为换行标签

if re.match(r'(^[A-Z][\w ]+[A-Za-z]$)', block): # 匹配大写字母开头和以字母结尾的内容

print('<h1>' + block + '</h1>') # 添加一级标题标签

elif '<li>' in block: # 如果内容块包含列表项

print('<ul>' + block + '</ul>') # 添加项目列表标签

else:

print('<p>' + block + '</p>') # 添加段落标签

print('</body></html>') # 添加HTML结束标签

当我们完成以上代码的编写,就可以通过命令行终端执行代码。

python main01.py <doc.txt> doc.html

通过以上命令就能够让主程序读取项目文件夹下的“doc.txt”,并且经过处理后输出文件“doc.html”。

这个文件会自动出现在PyCharm左侧文件列表中,在文件名称上点击鼠标右键,选择浏览器中打开(Open in Browser),就能够使用指定的浏览器进行浏览了。

在下一篇练习项目的教程中,我们将通过另外一种复杂的,但是具有很好扩展性的方式重新实现这个项目。

在很多人都热衷于玩手机,甚至于有些人用手机就可以实现办公了,那么如果有时候出门在外,身边没有电脑,但是又急需要转换PDF文件的时候该怎么办?不要着急,你可以试试这个神器——迅捷PDF转换器! 没错,用手机就可以!

迅捷PDF转换器是一款简单且实用的办公软件。可以一键完成PDF文件和OFFice、HTML、TXT和图片文档之间的格式转换,感受免费且快捷的转换,让你不再为PDF格式而忧愁。

那要怎么给PDF转换格式呢?今天小编给大家举两个栗子~

1.PDF转word

第一步:点击【PDF转换】的【PDF转换Word】进入转换页面,选择需要转换的文件,选择完毕,点击【确定转换】。

这是原来的PDF文件:

第二步:PDF文件开始转换,然后只需要几秒,即可转换完成。

第三步:转换完成,点击【查看文档】,就可以发现变成Word文档格式并且可以编辑啦!

2.Excel转PDF

第一步:点击【转为PDF】的【EXCEL转PDF】,选择文件,然后点击【确定转换】。

第二步:同样也是要稍等几秒。然后显示转换完成后,即可打开查看PDF文档啦!

这是一开始的Excel文件:

转换为PDF之后:

是不是很神奇?而且整个过程非常快哦~只需要很短的时间就可以完成PDF的格式转换哦!除了PDF的转换,还有其他有趣的小功能呢?

拍照识别文字:可以扫描图片的文字,将其提取出来,指尖上的扫描仪!

拍照翻译:可以通过拍照来翻译,支持中英文互换翻译哦,准确率超高!

WIFI传输:可以在WIFI状态下在线传输文件,不消耗你的流量!

PDF压缩:可以在线给你的PDF瘦身,节省空间!

怎么样?这个小小的APP没想到这么全能?你是否心动了呢?心动不如行为,自己试一试呗!