ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PDF转换成TXT脚本代码-QZQ-2026-9-28

PDF转换成TXT脚本代码-QZQ-2026-9-28 # -*- coding: utf-8 -*- PDF转TXT工具 - 有文本层的PDF直接用PyMuPDF提取 - 扫描件PDF用RapidOCR识别需要先 pip install rapidocr-onnxruntime pymupdf 用法python pdf2txt.py import pymupdf import os import time from rapidocr_onnxruntime import RapidOCR # 配置 SRC_DIR rF:\BaiduNetdiskDownload\python电子书籍 OUT_DIR rF:\BaiduNetdiskDownload\python电子书籍_TXT # 要转换的文件按需增删 PDF_FILES [ Python算法教程_中文版.pdf, Python学习手册(第4版).pdf, ] ZOOM 1.5 # 渲染分辨率越大越准但越慢 # os.makedirs(OUT_DIR, exist_okTrue) engine RapidOCR() def has_text_layer(doc, sample_pages10): 检测PDF是否有文本层 total 0 for i in range(min(sample_pages, doc.page_count)): total len(doc[i].get_text(text, sortTrue).strip()) return total 200 def extract_text_pdf(src_path, out_path): 直接提取文本层 doc pymupdf.open(src_path) total doc.page_count with open(out_path, w, encodingutf-8) as f: for i in range(total): text doc[i].get_text(text, sortTrue) f.write(f\n 第 {i1} 页 \n\n{text}\n) if (i1) % 100 0: print(f 提取中: {i1}/{total}) doc.close() return total def ocr_scanned_pdf(src_path, out_path): OCR识别扫描件支持断点续传 doc pymupdf.open(src_path) total doc.page_count # 断点续传检查已完成页数 start_page 0 mode w if os.path.exists(out_path): with open(out_path, r, encodingutf-8) as f: done f.read().count( 第 ) if done total: print(f 已完成跳过) doc.close() return total start_page done mode a print(f 从第 {start_page1} 页继续) mat pymupdf.Matrix(ZOOM, ZOOM) t0 time.time() with open(out_path, mode, encodingutf-8) as f: for i in range(start_page, total): pix doc[i].get_pixmap(matrixmat, alphaFalse) tmp_img os.path.join(OUT_DIR, f_tmp_p{i}.png) pix.save(tmp_img) result, _ engine(tmp_img) lines [line[1] for line in result] if result else [] f.write(f\n 第 {i1} 页 \n\n \n.join(lines) \n) f.flush() os.remove(tmp_img) if (i1) % 10 0: elapsed time.time() - t0 speed (i1-start_page) / elapsed eta (total-i-1) / speed / 60 print(f OCR: {i1}/{total} 页, 速度{speed:.1f}页/秒, 预计剩余{eta:.0f}分钟) doc.close() return total if __name__ __main__: for fname in PDF_FILES: src os.path.join(SRC_DIR, fname) txt_name os.path.splitext(fname)[0] .txt out os.path.join(OUT_DIR, txt_name) print(f\n处理: {fname}) doc pymupdf.open(src) pages doc.page_count doc.close() print(f 共 {pages} 页) if has_text_layer(pymupdf.open(src)): print( - 有文本层直接提取) n extract_text_pdf(src, out) else: print( - 扫描件使用OCR识别) n ocr_scanned_pdf(src, out) size os.path.getsize(out) / 1024 print(f 完成: {n}页, {size:.0f}KB - {out}) print(\n全部完成)
返回列表