用python写PDF转换器的实现


Posted in Python onOctober 29, 2020

前言

某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~
当我打开文件夹以回顾往事之余,惊现许多看似杂乱的无聊代码。我拍腿正坐,一个想法油然而生:“生活已然很无聊,不如再无聊些叭”。
于是,我决定开一个专题,便称之为kimol君的无聊小发明。
妙…啊~~~

想必小伙伴都经历过,当你想要把PDF转为WORD时,自己打字赫赫甩在你眼前:

用python写PDF转换器的实现

不充钱就想白嫖?? 想得美~
然而,kimol君是不会退缩的,毕竟迎难而上是传统美德。于是,今天的主题出来了:用python写一个PDF转WORD的小工具(基于某网站接口)。

一、思路分析

网上一搜,你可以发现很多PDF转换的工具,其中不乏在线转换的网站,比如这样的:

用python写PDF转换器的实现

那么,通过网站提供的测试接口,我们便可以通过爬虫模拟的方式实现转换。
没有错了~思路就是如此的简单明了,今天的主角便是:https://app.xunjiepdf.com

通过抓包分析,知道这是一个POST请求,接下来用requests库模拟即可。
需要注意的是,这个接口仅用于测试,所以可供转换的页面等都有所限制,如需更完整的功能还请支持原版。

二、我的代码

正所谓一万个coders,就有一万种codes,以下为我的代码,仅供参考。
导入相关库:

import time
import requests

定义PDF2Word类:

class PDF2Word():
 def __init__(self):
  self.machineid = 'ccc052ee5200088b92342303c4ea9399'
  self.token = ''
  self.guid = ''
  self.keytag = ''
 
 def produceToken(self):
  url = 'https://app.xunjiepdf.com/api/producetoken'
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'X-Requested-With': 'XMLHttpRequest',
    'Origin': 'https://app.xunjiepdf.com',
    'Connection': 'keep-alive',
    'Referer': 'https://app.xunjiepdf.com/pdf2word/',}
  data = {'machineid':self.machineid}
  res = requests.post(url,headers=headers,data=data)
  res_json = res.json()
  if res_json['code'] == 10000:
   self.token = res_json['token']
   self.guid = res_json['guid']
   print('成功获取token')
   return True
  else:
   return False
 
 def uploadPDF(self,filepath):
  filename = filepath.split('/')[-1]
  files = {'file': open(filepath,'rb')}
  url = 'https://app.xunjiepdf.com/api/Upload'
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0',
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'Content-Type': 'application/pdf',
    'Origin': 'https://app.xunjiepdf.com',
    'Connection': 'keep-alive',
    'Referer': 'https://app.xunjiepdf.com/pdf2word/',}
  params = (
    ('tasktype', 'pdf2word'),
    ('phonenumber', ''),
    ('loginkey', ''),
    ('machineid', self.machineid),
    ('token', self.token),
    ('limitsize', '2048'),
    ('pdfname', filename),
    ('queuekey', self.guid),
    ('uploadtime', ''),
    ('filecount', '1'),
    ('fileindex', '1'),
    ('pagerange', 'all'),
    ('picturequality', ''),
    ('outputfileextension', 'docx'),
    ('picturerotate', '0,undefined'),
    ('filesequence', '0,undefined'),
    ('filepwd', ''),
    ('iconsize', ''),
    ('picturetoonepdf', ''),
    ('isshare', '0'),
    ('softname', 'pdfonlineconverter'),
    ('softversion', 'V5.0'),
    ('validpagescount', '20'),
    ('limituse', '1'),
    ('filespwdlist', ''),
    ('fileCountwater', '1'),
    ('languagefrom', ''),
    ('languageto', ''),
    ('cadverchose', ''),
    ('pictureforecolor', ''),
    ('picturebackcolor', ''),
    ('id', 'WU_FILE_1'),
    ('name', filename),
    ('type', 'application/pdf'),
    ('lastModifiedDate', ''),
    ('size', ''),)
  res= requests.post(url,headers=headers,params=params,files=files)
  res_json = res.json()
  if res_json['message'] == '上传成功':
   self.keytag = res_json['keytag']
   print('成功上传PDF')
   return True
  else:
   return False
  
 def progress(self):
  url = 'https://app.xunjiepdf.com/api/Progress'
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0',
    'Accept': 'text/plain, */*; q=0.01',
    'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'X-Requested-With': 'XMLHttpRequest',
    'Origin': 'https://app.xunjiepdf.com',
    'Connection': 'keep-alive',
    'Referer': 'https://app.xunjiepdf.com/pdf2word/',}
  data = {
    'tasktag': self.keytag,
    'phonenumber': '',
    'loginkey': '',
    'limituse': '1'}
  res= requests.post(url,headers=headers,data=data)
  res_json = res.json()
  if res_json['message'] == '处理成功':
   print('PDF处理完成')
   return True
  else:
   print('PDF处理中')
   return False
  
 def downloadWord(self,output):
  url = 'https://app.xunjiepdf.com/download/fileid/%s'%self.keytag
  res = requests.get(url)
  with open(output,'wb') as f:
   f.write(res.content)
   print('PDF下载成功("%s")'%output)
   
 def convertPDF(self,filepath,outpath):
  filename = filepath.split('/')[-1]
  filename = filename.split('.')[0]+'.docx'
  self.produceToken()
  self.uploadPDF(filepath)
  while True:
   res = self.progress()
   if res == True:
    break
   time.sleep(1)
  self.downloadWord(outpath+filename)

执行主函数:

if __name__=='__main__': 
 pdf2word = PDF2Word()
 pdf2word.convertPDF('001.pdf','')

注意:convertPDF函数有两个参数,第一个为需要转换的PDF,第二个参数为转换后的目录。
run一下,一键入魂,".docx"文件已经躺在了我的目录中,舒服了~

用python写PDF转换器的实现

写在最后

到此这篇关于用python写PDF转换器的实现的文章就介绍到这了,更多相关用python写PDF转换器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python插入排序算法实例分析
Jul 03 Python
Python简单计算文件夹大小的方法
Jul 14 Python
请不要重复犯我在学习Python和Linux系统上的错误
Dec 12 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
Mar 16 Python
Python中getpass模块无回显输入源码解析
Jan 11 Python
Python实现的旋转数组功能算法示例
Feb 23 Python
详解Matplotlib绘图之属性设置
Aug 23 Python
基于spring boot 日志(logback)报错的解决方式
Feb 20 Python
Django media static外部访问Django中的图片设置教程
Apr 07 Python
python 数据分析实现长宽格式的转换
May 18 Python
python实现大文本文件分割成多个小文件
Apr 20 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 Python
python查询MySQL将数据写入Excel
Oct 29 #Python
Python 使用office365邮箱的示例
Oct 29 #Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
Oct 29 #Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
Oct 29 #Python
15个Pythonic的代码示例(值得收藏)
Oct 29 #Python
python 如何设置守护进程
Oct 29 #Python
python 多线程中join()的作用
Oct 29 #Python
You might like
php保存信息到当前Session的方法
2015/03/16 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
Prototype Date对象 学习
2009/07/12 Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
2013/06/04 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
jquery form 隐藏的input 选择
2014/04/29 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
JavaScript字符串对象(string)基本用法示例
2017/01/18 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
使用js获取伪元素的content实例
2017/10/24 Javascript
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
聊聊Vue中provide/inject的应用详解
2019/11/10 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
TensorFlow损失函数专题详解
2018/04/26 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
flask应用部署到服务器的方法
2019/07/12 Python
实例详解Python装饰器与闭包
2019/07/29 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
中文专业毕业生自荐信
2013/10/28 职场文书
社区清明节活动总结
2014/07/04 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
党员争先创优承诺书
2015/01/20 职场文书