欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用python写PDF转换器的实现

程序员文章站 2022-03-11 14:57:25
前言某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~当我打开文件夹以回顾往事之余,惊现许多看似杂乱的无聊代码。我拍腿正坐,一个想法油然而生:“生活已然很无聊,不如再无聊些叭”。于是,我决定开一个专...

前言

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

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

用python写PDF转换器的实现

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

一、思路分析

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

用python写PDF转换器的实现

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

通过抓包分析,知道这是一个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转换器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!