PyPDF2.utils.PdfReadError: Unexpected destination '/__WKANCHOR_2'
在学习这篇文章之前,对于一点都不懂python的朋友,可以去看下我之前写过的博客文章,也都是学习过程中的一些收获,感兴趣的可以去看看http://www.flybi.net/blog/seng。
之所以写这篇文章,是因为在学习《Python网络数据采集》的时候,书中提到了访问pdf的方法,于是我就想是否能将天善博客内容转成PDF文档,这个功能会很有用,以后可以方便查找。
思路:使用命令行工具wkhtmltopdf,可以将html 转成 PDF,Python有个包python-pdfkit,方便了wkhtmltopdf和Python的结合。不过目前wkhtmltopdf读取的页面数有限制,文档很多的话会生成多个PDF,这样就需要合并,试过很多种合并方法,最终使用ghostscript解决的。
接下来具体介绍一下做法。
1wkhtmltopdf功能简介
下载页面:http://wkhtmltopdf.org/downloads.html
使用0.12.3 Linux版下载后直接解压即可。
tar -xvf wkhtmltox-
0.13.0-alpha-7b36694_linux-centos6-amd64.rpm.part sudo ln -s ./wkhtmltox/bin/wkhtmltopdf /usr/bin/wkhtmltopdf
使用示例如下:
wkhtmltopdf 'http://www.flybi.net/blog/seng/3645' 'http://www.flybi.net/blog/seng/3599' sengblog.pdf
注意:天善使用的javascript,好像对这个有影响,只能生成一个页面,要等javascript运行完,加参数即可--javascript-delay 2000,或者屏蔽掉也可以--disable-javascript
wkhtmltopdf --javascript-delay 2000 'http://www.flybi.net/blog/seng/3645' 'http://www.flybi.net/blog/seng/3599' sengblog.pdf
如果出问题,可以看一下大纲的信息:
wkhtmltopdf --dump-outline out.xsl toc 'http://www.flybi.net/blog/seng/3645' 'http://www.flybi.net/blog/seng/3599' sengblog.pdf
2pdfkit调用的接口
参考网站:https://pypi.python.org/pypi/pdfkit
Install python-pdfkit: $ pip install pdfkit 简单的示例: import pdfkit pdfkit.from_url([ 'http://www.flybi.net/blog/seng/3645','http://www.flybi.net/blog/seng/3599'], 'sengblog.pdf')
3生成blog的PDF文件
以我的博客为例
我的首页:
http://www.flybi.net/people/seng
我的博客就5页,获取这些链接就可以了
http://www.flybi.net/blog/id-seng__page-1
核心逻辑如下:
(1)获取所有blog具体页面的URL;
(2)排序:暂时偷个懒,先按默认字符排序了;
(3)生成pdf文档,注意目前测试只能包含有限的页面,目前使用20个,按类似以下格式sengblog20160419_1_20生成;
(4)合并pdf文档。
目前没有现成代码,一开始使用http://www.pdfmerge.com/手工做的,后找到更好的办法,下面详细介绍如何合并。
4合并PDF文档
因为wkhtmltopdf有限制,文档多了,需要生成多个pdf文件,原来使用http://www.pdfmerge.com/在线服务合并文档,感觉不完美,合并更多文件就比较麻烦了,找了一些工具最终解决了,测试了PyPDF2、pdftk、ghostscript,都能合并,不过PyPDF2、pdftk对wkhtmltopdf生成的文档的outline合并有问题,特别是PyPDF2需要修改代码,才能完成合并。所以最后选用了ghostscript来完成合并。
相关工具版本要求:
ghostscript:9.19
wkhtmltopdf:0.12.3 (with patched qt)
ghostscript的安装使用:
下载:
http://ghostscript.com/download/gsdnld.html
帮助文档:
http://www.ghostscript.com/doc/9.19/Use.htm
命令示例:
gs-919-linux_x86_64 -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=./output/all_coffee.pdf coffee1_20.pdf coffee21_40.pdf
linux_x86_64 -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=all_seng.pdf seng*.pdf
PyPDF2的安装使用:
PyPDF2版本:1.25.1
https://pypi.python.org/pypi/PyPDF2/1.25.1
或
https://github.com/mstamy2/PyPDF2
安装:
pip install PyPDF2
使用示例:
from PyPDF2 import PdfFileMerger
merger = PdfFileMerger()
input1 = open("hql_1_20.pdf", "rb")
input2 = open("hql_21_40.pdf", "rb")
merger.append(input1)
merger.append(input2)
# Write to an output PDF document
output = open("hql_all.pdf", "wb")
merger.write(output)
--------------------
注意合并wkhtmltopdf系统会出错:
PdfReadError: Unexpected destination '/__WKANCHOR_2'
#fix PyPDF2 merge outline出问题的解决
#参考https://github.com/mstamy2/PyPDF2/issues/193
I had the same problem. For a quick and dirty fix I commented out the lines 1225 and 1226 in the file pdf.py of the package PyPDF2 which raise the exception:
# if destination found, then create outlineif dest:if isinstance(dest, ArrayObject):outline = self._buildDestination(title, dest)elif isinstance(dest, Str) and dest in self._namedDests:outline = self._namedDests[dest]outline[NameObject("/Title")] = title # else:# raise utils.PdfReadError("Unexpected destination %r" % dest)return outline
pdf.py 1225-1226按如下屏蔽即可
# if destination found, then create outline
if dest:
if isinstance(dest, ArrayObject):
outline = self._buildDestination(title, dest)
elif isinstance(dest, Str) and dest in self._namedDests:
outline = self._namedDests[dest]
outline[NameObject("/Title")] = title
#### else:
#### raise utils.PdfReadError("Unexpected destination %r" % dest)
return outline
pdftk的安装使用:
安装:
sudo yum install libgcj
sudo rpm -i pdftk-2.02-1.*.rpm
使用:
pdftk a1*.pdf cat output combined.pdf
outline的手工修复:
pdftk支持outline的编辑,可以参考这个,
http://stackoverflow.com/questions/296****79/merge-pdfs-with-pdftk-with-bookmarks
pdftk hql_1_20.pdf dump_data > in1.info
#手工修改in1.info文件
pdftk hql_1_20.pdf update_info in1.info output out.pdf.
当然程序还有些欠缺:
1.uft8的文件名在linux能使用,到windows下就软乱码了。
2.wkhtmltopdf读取html遇到503错误,需要再次检查和重新读取。
PyPDF2.utils.PdfReadError: Unexpected destination '/__WKANCHOR_2'相关推荐
- PyPDF2 编码问题 PyPDF2.utils.PdfReadError Illegal character in Name Object
PyPDF2 编码问题 PyPDF2.utils.PdfReadError Illegal character in Name Object 参考资料:https://github.com/mstam ...
- python读取pdf文档书签 bookmark_Python利用PyPDF2库获取PDF文件总页码实例
Python中可以利用PyPDF2库来获取该pdf文件的总页码,可以根据下面的方法一步步进行下去: 1.首先,要安装PyPDF2库,利用以下命令即可: pip install PyPDF2 2.接着, ...
- Python:使用pypdf2合并、分割、加密pdf文件。
朋友需要对一个pdf文件进行分割,在网上查了查发现这个pypdf2可以完成这些操作,所以就研究了下这个库,并做一些记录.首先pypdf2是python3版本的,在之前的2版本有一个对应pypdf库. ...
- python读取扫描形成的pdf_Python利用PyPDF2库获取PDF文件总页码实例
Python中可以利用PyPDF2库来获取该pdf文件的总页码,可以根据下面的方法一步步进行下去: 1.首先,要安装PyPDF2库,利用以下命令即可: pip install PyPDF2 2.接着, ...
- Python利用PyPDF2库获取PDF文件总页码
Python中可以利用PyPDF2库来获取该pdf文件的总页码,可以根据下面的方法一步步进行下去: 1.首先,要安装PyPDF2库,利用以下命令即可: pip install PyPDF2 2.接着, ...
- Python中用PyPDF2拆分pdf提取页面
有时候我们只需要pdf中的几页,或许还想把这几页内容整合成新的pdf,那该怎么做呢? 准备工作: 安装扩展库PyPDF2,参考命令 pip install PyPDF2 代码如下: from PyPD ...
- Python实现按序合并多个pdf文件
技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.整体实现步骤 在日常办公中,我们可能会有一个需求,需要将多个pdf文件合并成一个文件. ...
- PYTHON得到pdf页数、遍历当前文件夹
#第一步安装PyPDF2 pip install PyPDF2#第二步导入相应的模块 from PyPDF2 import PdfFileReader#第三步:定义相对应的函数 def get_num ...
- python打印pdf特定页面_使用Python自由切分pdf文件提取任意页面
这个小知识来自公众号[python小屋] 问题描述: 给定一个PDF文件,对其进行任意切分,提取其中任意页面,保存为新的PDF文件. 准备工作: 安装扩展库PyPDF2,参考命令 pip instal ...
最新文章
- databinding 入门 知识 给TextView 赋值
- japid-controller自动绑定的数据类型
- mp4v2再学习 -- H264视频编码成MP4文件
- C/C++语言中联合体union的妙用
- c语言标准io中可读可写,C语言标准IO: [先读再feof] VS [先feof再读]
- spring中使用注解代替xml配置
- nullable field verification in gateway backend
- CMOS图像传感器——TDI CIS
- QT找不到python27.dll或python36.dll解决办法
- VS安装包注册com组件
- java 单点_java实现单点登录的两种方式
- LabVIEW设计程序框图
- mat1 and mat2 shapes cannot be multiplied ( )的解决
- 直播电商平台开发,video组件实现视频弹幕功能
- 社会化商业的基础架构
- 电子书资源 Kindle PDF
- 安装prometheus遇到:Failed to execute operation:file existed解决办法
- 基于单片机的篮球计分器系统设计(#0456)
- HDUOJ 1114 Piggy-Bank
- Python字典推导式
热门文章
- solid 设计原则 php,面向对象设计SOLID五大原则
- opencv 处理黑夜_基于 opencv图像去噪
- 基于YUM安装与源码编译或二进制多实例安装Mariadb,mysql
- 2.python数据结构的性能分析
- 流媒体地址文件制作方法
- Java多线程 5 多线程其他知识简要介绍
- Enterprise Solution 进销存管理软件 C/S架构,支持64位系统 物流,资金流,信息流全面集成...
- [LeetCode] 3Sum
- 局部临时表 全局临时表 表变量
- 黄聪:用于 Web 应用程序项目部署的 Web.config 转换语法