首頁 > 軟體

兩行Python程式碼實現pdf轉word功能

2023-03-31 06:01:17

一、安裝依賴包

pip install --index https://pypi.mirrors.ustc.edu.cn/simple/ python-office

二、pdf轉word

2.1 程式碼實現

import office
office.pdf.pdf2docx(file_path = 'test.pdf')

執行過程如下:

[1/4] Opening document...
[INFO] [2/4] Analyzing document...
[WARNING] 'created' timestamp seems very low; regarding as unix timestamp
[WARNING] 'modified' timestamp seems very low; regarding as unix timestamp
[WARNING] 'created' timestamp seems very low; regarding as unix timestamp
[WARNING] 'modified' timestamp seems very low; regarding as unix timestamp
[INFO] [3/4] Parsing pages...
[INFO] (1/9) Page 1
[INFO] (2/9) Page 2
[INFO] (3/9) Page 3
[INFO] (4/9) Page 4
[INFO] (5/9) Page 5
[INFO] (6/9) Page 6
[INFO] (7/9) Page 7
[INFO] (8/9) Page 8
[INFO] (9/9) Page 9
[INFO] [4/4] Creating pages...
[INFO] (1/9) Page 1
[INFO] (2/9) Page 2
[INFO] (3/9) Page 3
[INFO] (4/9) Page 4
[INFO] (5/9) Page 5
[INFO] (6/9) Page 6
[INFO] (7/9) Page 7
[INFO] (8/9) Page 8
[INFO] (9/9) Page 9
[INFO] Terminated in 1.30s.
 
Process finished with exit code 0

2.2 pdf內容

2.3 轉換後的word

由上可見,效果還不錯。

補充

除了上文的辦法,小編還為大家整理了更多Python實現的PDF轉Word方法,需要的可以參考一下

方法一:

import os
from configparser import ConfigParser
from io import StringIO
from io import open
from concurrent.futures import ProcessPoolExecutor

from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from docx import Document


def read_from_pdf(file_path):
    with open(file_path, 'rb') as file:
        resource_manager = PDFResourceManager()
        return_str = StringIO()
        lap_params = LAParams()

        device = TextConverter(
            resource_manager, return_str, laparams=lap_params)
        process_pdf(resource_manager, device, file)
        device.close()

        content = return_str.getvalue()
        return_str.close()
        return content


def save_text_to_word(content, file_path):
    doc = Document()
    for line in content.split('n'):
        paragraph = doc.add_paragraph()
        paragraph.add_run(remove_control_characters(line))
    doc.save(file_path)


def remove_control_characters(content):
    mpa = dict.fromkeys(range(32))
    return content.translate(mpa)


def pdf_to_word(pdf_file_path, word_file_path):
    content = read_from_pdf(pdf_file_path)
    save_text_to_word(content, word_file_path)


def main():
    config_parser = ConfigParser()
    config_parser.read('config.cfg')
    config = config_parser['default']

    tasks = []
    with ProcessPoolExecutor(max_workers=int(config['max_worker'])) as executor:
        for file in os.listdir(config['pdf_folder']):
            extension_name = os.path.splitext(file)[1]
            if extension_name != '.pdf':
                continue
            file_name = os.path.splitext(file)[0]
            pdf_file = config['pdf_folder'] + '/' + file
            word_file = config['word_folder'] + '/' + file_name + '.docx'
            print('正在處理: ', file)
            result = executor.submit(pdf_to_word, pdf_file, word_file)
            tasks.append(result)
    while True:
        exit_flag = True
        for task in tasks:
            if not task.done():
                exit_flag = False
        if exit_flag:
            print('完成')
            exit(0)


if __name__ == '__main__':
    main()

方法二:

加密過的PDF轉word

#-*- coding: UTF-8 -*- 
#!/usr/bin/python
#-*- coding: utf-8 -*-
import sys
import importlib
importlib.reload(sys)
from pdfminer.pdfparser import PDFParser,PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import *
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
import os
#設定工作目錄資料夾
os.chdir(r'c:/users/dicey/desktop/codes/pdf-docx')
#解析pdf檔案函數
def parse(pdf_path):
 fp = open('diya.pdf', 'rb') # 以二進位制讀模式開啟
 # 用檔案物件來建立一個pdf檔案分析器
 parser = PDFParser(fp)
 # 建立一個PDF檔案
 doc = PDFDocument()
 # 連線分析器 與檔案物件
 parser.set_document(doc)
 doc.set_parser(parser)
 # 提供初始化密碼
 # 如果沒有密碼 就建立一個空的字串
 doc.initialize()
 # 檢測檔案是否提供txt轉換,不提供就忽略
 if not doc.is_extractable:
  raise PDFTextExtractionNotAllowed
 else:
  # 建立PDf 資源管理器 來管理共用資源
  rsrcmgr = PDFResourceManager()
  # 建立一個PDF裝置物件
  laparams = LAParams()
  device = PDFPageAggregator(rsrcmgr, laparams=laparams)
  # 建立一個PDF直譯器物件
  interpreter = PDFPageInterpreter(rsrcmgr, device)
  # 用來計數頁面,圖片,曲線,figure,水平文字方塊等物件的數量
  num_page, num_image, num_curve, num_figure, num_TextBoxHorizontal = 0, 0, 0, 0, 0
  # 迴圈遍歷列表,每次處理一個page的內容
  for page in doc.get_pages(): # doc.get_pages() 獲取page列表
   num_page += 1 # 頁面增一
   interpreter.process_page(page)
   # 接受該頁面的LTPage物件
   layout = device.get_result()
   for x in layout:
    if isinstance(x,LTImage): # 圖片物件
     num_image += 1
    if isinstance(x,LTCurve): # 曲線物件
     num_curve += 1
    if isinstance(x,LTFigure): # figure物件
     num_figure += 1
    if isinstance(x, LTTextBoxHorizontal): # 獲取文字內容
     num_TextBoxHorizontal += 1 # 水平文字方塊物件增一
     # 儲存文字內容
     with open(r'test2.doc', 'a',encoding='utf-8') as f: #生成doc檔案的檔名及路徑
      results = x.get_text()
      f.write(results)
      f.write('n')
  print('物件數量:n','頁面數:%sn'%num_page,'圖片數:%sn'%num_image,'曲線數:%sn'%num_curve,'水平文字方塊:%sn'
    %num_TextBoxHorizontal)

if __name__ == '__main__':
 pdf_path = r'diya.pdf' #pdf檔案路徑及檔名
 parse(pdf_path)

到此這篇關於兩行Python程式碼實現pdf轉word功能的文章就介紹到這了,更多相關Python實現pdf轉word內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com