用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中实现单例模式的三种方法
Apr 08 Python
Python 提取dict转换为xml/json/table并输出的实现代码
Aug 28 Python
利用python为运维人员写一个监控脚本
Mar 25 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
将python代码和注释分离的方法
Apr 21 Python
python爬取网页内容转换为PDF文件
Jul 28 Python
Linux系统(CentOS)下python2.7.10安装
Sep 26 Python
python 函数内部修改外部变量的方法
Dec 18 Python
Python提取特定时间段内数据的方法实例
Apr 01 Python
用Python实现校园通知更新提醒功能
Nov 23 Python
keras打印loss对权重的导数方式
Jun 10 Python
Python中的tkinter库简单案例详解
Jan 22 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
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
PHP设置图片文件上传大小的具体实现方法
2013/10/11 PHP
php 解决substr()截取中文字符乱码问题
2016/07/18 PHP
PHP哈希表实现算法原理解析
2020/12/11 PHP
Javascript this指针
2009/07/30 Javascript
jQuery 使用手册(三)
2009/09/23 Javascript
15款优秀的jQuery导航菜单插件分享
2011/07/19 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
2013/06/05 Javascript
document.write()及其输出内容的样式、位置控制
2013/08/12 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
jQuery给多个不同元素添加class样式的方法
2015/03/26 Javascript
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
[02:20]DOTA2英雄基础教程 黑暗贤者
2013/12/19 DOTA
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
Python工程师面试题 与Python Web相关
2016/01/14 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
2019/01/29 Python
Python flask框架post接口调用示例
2019/07/03 Python
解决pandas展示数据输出时列名不能对齐的问题
2019/11/18 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
python def 定义函数,调用函数方式
2020/06/02 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
副处级干部考察材料
2014/05/17 职场文书
教师考察材料范文
2014/06/03 职场文书
四风问题对照检查整改措施思想报告
2014/10/05 职场文书
2014年大学生工作总结
2014/11/20 职场文书
投诉信范文
2015/07/02 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
Python安装使用Scrapy框架
2022/04/12 Python