用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 sys模块sys.path使用方法示例
Dec 04 Python
分析并输出Python代码依赖的库的实现代码
Aug 09 Python
Python字典及字典基本操作方法详解
Jan 30 Python
NumPy 如何生成多维数组的方法
Feb 05 Python
Python 函数基础知识汇总
Mar 09 Python
Python minidom模块用法示例【DOM写入和解析XML】
Mar 25 Python
对python3 Serial 串口助手的接收读取数据方法详解
Jun 12 Python
python3 selenium自动化 下拉框定位的例子
Aug 23 Python
python如何调用字典的key
May 25 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
Nov 26 Python
解决pytorch读取自制数据集出现过的问题
May 31 Python
python自动化操作之动态验证码、滑动验证码的降噪和识别
Aug 30 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
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
2017/07/03 PHP
类之Prototype.js学习
2007/06/13 Javascript
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
jquery复选框全选/取消示例
2013/12/30 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
jquery密码强度校验
2015/12/02 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
Js和VUE实现跑马灯效果
2020/05/25 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
用Python输出一个杨辉三角的例子
2014/06/13 Python
python字符串常用方法
2018/06/14 Python
Python面向对象之反射/自省机制实例分析
2018/08/24 Python
Pytorch基本变量类型FloatTensor与Variable用法
2020/01/08 Python
HTML5 Canvas实现360度全景图的示例代码
2018/01/29 HTML / CSS
材料成型专业个人求职信范文
2013/09/25 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
安全生产目标责任书
2014/04/14 职场文书
产品推广策划方案
2014/05/10 职场文书
态度决定一切演讲稿
2014/05/20 职场文书
农村党员对照检查材料
2014/09/24 职场文书
2014年科室工作总结范文
2014/12/19 职场文书
单位考核聘任报告
2015/03/02 职场文书
离婚答辩状范文
2015/05/22 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书
国情备忘录观后感
2015/06/04 职场文书
MySQL中你可能忽略的COLLATION实例详解
2021/05/12 MySQL
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python
MySQL新手入门进阶语句汇总
2022/09/23 MySQL