用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中的Django框架中prefetch_related()函数对数据库查询的优化
Apr 01 Python
微信跳一跳自动运行python脚本
Jan 08 Python
Python工程师面试必备25条知识点
Jan 17 Python
python 把列表转化为字符串的方法
Oct 23 Python
python爬取cnvd漏洞库信息的实例
Feb 14 Python
Python实现的爬取小说爬虫功能示例
Mar 30 Python
Numpy 中的矩阵求逆实例
Aug 26 Python
Pandas操作CSV文件的读写实现方法
Nov 13 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
Jun 02 Python
在Keras中利用np.random.shuffle()打乱数据集实例
Jun 15 Python
Python LMDB库的使用示例
Feb 14 Python
python和anaconda的区别
May 06 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正确解析UTF-8字符串技巧应用
2012/11/07 PHP
php使用百度天气接口示例
2014/04/22 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
php实现将Session写入数据库
2015/07/26 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
在模板页面的js使用办法
2010/04/01 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
2013/11/13 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
jQuery实现移动 和 渐变特效的点击事件
2015/02/26 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
vue实现五子棋游戏
2020/05/28 Javascript
vue3.0 上手体验
2020/09/21 Javascript
vue实现广告栏上下滚动效果
2020/11/26 Vue.js
在类Unix系统上开始Python3编程入门
2015/08/20 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
tensorflow 重置/清除计算图的实现
2020/01/19 Python
python实现图片横向和纵向拼接
2020/03/05 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
卫校护理专业毕业生求职信
2013/11/26 职场文书
科级干部考察材料
2014/02/15 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android