用python写PDF转换器的实现

作者:不正经的kimol君 时间:2022-07-29 21:32:28 

前言

某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~
当我打开文件夹以回顾往事之余,惊现许多看似杂乱的无聊代码。我拍腿正坐,一个想法油然而生:“生活已然很无聊,不如再无聊些叭”。
于是,我决定开一个专题,便称之为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转换器的实现

写在最后

来源:https://blog.csdn.net/kimol_justdo/article/details/109267805

标签:python,PDF,转换器
0
投稿

猜你喜欢

  • ASP + XML + JavaScript 实现动态无限级联动菜单

    2008-06-13 06:31:00
  • Mysql数据库表中为什么有索引却没有提高查询速度

    2024-01-13 19:25:16
  • Python fileinput模块应用详解

    2021-06-23 14:28:09
  • python实现字典(dict)和字符串(string)的相互转换方法

    2021-10-19 18:22:44
  • python实现简易猜数小游戏

    2022-08-08 09:51:55
  • python实现周期方波信号频谱图

    2021-04-11 00:11:46
  • python 函数传参之传值还是传引用的分析

    2021-08-20 13:06:34
  • 解决使用Pandas 读取超过65536行的Excel文件问题

    2022-03-28 09:17:29
  • 利用Golang解析json数据的方法示例

    2024-04-27 15:36:04
  • Python简单格式化时间的方法【strftime函数】

    2023-03-29 11:30:16
  • 微信 小程序Demo导入详细介绍

    2023-01-13 22:16:19
  • 用CSS实现柱状图(Bar Graph)的方法(三)——复杂柱状图的实现

    2008-05-26 13:36:00
  • PHP查询快递信息的方法

    2023-11-14 10:25:48
  • Python常用库大全及简要说明

    2023-06-10 00:35:49
  • pandas groupby 分组取每组的前几行记录方法

    2021-06-19 05:52:20
  • Windows 配置Apache以便在浏览器中运行Python script的CGI模式

    2021-08-01 11:22:07
  • Python多重继承之菱形继承的实例详解

    2022-08-06 20:29:11
  • python中py文件与pyc文件相互转换的方法实例

    2021-03-29 13:15:27
  • bootstrap flask登录页面编写实例

    2024-04-16 08:49:19
  • Vue提供的三种调试方式你知道吗

    2024-05-29 22:44:57
  • asp之家 网络编程 m.aspxhome.com