@echo offchcp 65001 >nul:: ========== 可自定义的参数(只需修改等号后面的值) ==========:: 输出的 Word 文件名(可包含路径,若只写文件名则生成在当前文件夹)set "OUTPUT_NAME=合并文档.docx":: 页边距(单位:英寸,1英寸≈2.54厘米):: 如果希望图片尽可能大,四个值可以都设小一点,比如 0.3set "MARGIN_TOP=1"set "MARGIN_BOTTOM=1"set "MARGIN_LEFT=0.3"set "MARGIN_RIGHT=0.3":: PDF 渲染清晰度,数值越大图片越清晰,生成的文件也越大:: 推荐 150~300,默认 200set "DPI=300":: 图片缩放比例,仅在 FIT_WIDTH=0 时有效:: 1.0 为原大小,0.5 缩小一半,2.0 放大一倍set "SCALE=1.0":: 是否生成目录:1=生成,0=不生成set "USE_TOC=1":: 是否自动适应页面宽度:1=图片宽度自动填满页边距内的空间(推荐):: 0=使用上面的 SCALE 来控制大小set "FIT_WIDTH=1":: ====================================set "WORK_DIR=%~dp0"cd /d "%WORK_DIR%"echo =============================================echo PDF 合并转 Word 工具(双击运行)echo =============================================echo 当前文件夹: %WORK_DIR%:: --- 1. 检查 Python ---python --version >nul 2>&1if %errorlevel% neq 0 ( echo [错误] 未找到 Python,请先安装 Python 3.7+ pause exit /b 1)echo [√] 已检测到 Python:: --- 2. 安装必要的库 ---echo 正在检查并安装依赖库...python -m pip install PyMuPDF python-docx Pillow -i https://mirrors.aliyun.com/pypi/simple/ --disable-pip-version-check >nul 2>&1if %errorlevel% neq 0 ( echo [错误] 依赖安装失败 pause exit /b 1)echo [√] 依赖库已就绪:: --- 3. 检查 PDF 文件 ---set "PDF_COUNT=0"for %%f in ("*.pdf") do set /a PDF_COUNT+=1if %PDF_COUNT% equ 0 ( echo [错误] 当前文件夹没有 PDF 文件。 pause exit /b 1)echo 找到 %PDF_COUNT% 个 PDF 文件,开始处理...:: --- 4. 生成临时 Python 脚本 ---set "TMP_PY=%WORK_DIR%_temp_pdf2word.py"setlocal disabledelayedexpansion> "%TMP_PY%" echo(for /f "tokens=*" %%a in ('findstr /b "#PY#" "%~f0"') do ( set "line=%%a" call echo(%%line:~4%%>> "%TMP_PY%")endlocal:: --- 5. 调用 Python ---python "%TMP_PY%" "%WORK_DIR%%OUTPUT_NAME%" %MARGIN_TOP% %MARGIN_BOTTOM% %MARGIN_LEFT% %MARGIN_RIGHT% %DPI% %SCALE% %USE_TOC% %FIT_WIDTH%set EXIT_CODE=%errorlevel%del "%TMP_PY%" >nul 2>&1if %EXIT_CODE% neq 0 ( echo [错误] 转换过程中出现问题,请检查。 pause exit /b 1)echo =============================================echo 转换完成!Word 文档保存在: %WORK_DIR%%OUTPUT_NAME%echo 用 Word 打开后,右键目录 → 更新域即可显示页码。echo =============================================pauseexit /b 0:: ========== 内嵌 Python 脚本(每行以 #PY# 开头,不要修改) ==========#PY#import sys, os, io, glob#PY#import fitz#PY#from PIL import Image#PY#from docx import Document#PY#from docx.shared import Inches, Emu#PY#from docx.enum.text import WD_ALIGN_PARAGRAPH#PY#from docx.oxml.ns import qn#PY#from docx.oxml import OxmlElement#PY##PY#def add_toc(doc):#PY# doc.add_paragraph("目录", style="Heading 1")#PY# p = doc.add_paragraph()#PY# run = p.add_run()#PY# fldChar1 = OxmlElement('w:fldChar')#PY# fldChar1.set(qn('w:fldCharType'), 'begin')#PY# run._r.append(fldChar1)#PY# run2 = p.add_run()#PY# instrText = OxmlElement('w:instrText')#PY# instrText.set(qn('xml:space'), 'preserve')#PY# instrText.text = ' TOC \\o "1-3" '#PY# run2._r.append(instrText)#PY# run3 = p.add_run()#PY# fldChar2 = OxmlElement('w:fldChar')#PY# fldChar2.set(qn('w:fldCharType'), 'end')#PY# run3._r.append(fldChar2)#PY##PY#def main():#PY# if len(sys.argv) != 10:#PY# print("参数错误!需要 9 个参数,收到", len(sys.argv)-1)#PY# sys.exit(1)#PY# output_docx = sys.argv[1]#PY# margin_top = float(sys.argv[2])#PY# margin_bottom = float(sys.argv[3])#PY# margin_left = float(sys.argv[4])#PY# margin_right = float(sys.argv[5])#PY# dpi = int(sys.argv[6])#PY# scale = float(sys.argv[7])#PY# use_toc = sys.argv[8] == '1'#PY# fit_width = sys.argv[9] == '1'#PY##PY# input_dir = os.path.dirname(output_docx)#PY# pdf_files = sorted(set(glob.glob(os.path.join(input_dir, "*.pdf"))))#PY# if not pdf_files:#PY# print("未找到 PDF 文件")#PY# sys.exit(1)#PY##PY# doc = Document()#PY# sec = doc.sections[0]#PY# sec.top_margin = Inches(margin_top)#PY# sec.bottom_margin = Inches(margin_bottom)#PY# sec.left_margin = Inches(margin_left)#PY# sec.right_margin = Inches(margin_right)#PY##PY# page_width = sec.page_width.inches#PY# usable_width = page_width - margin_left - margin_right#PY##PY# if use_toc:#PY# add_toc(doc)#PY# doc.add_page_break()#PY##PY# for idx, pdf_path in enumerate(pdf_files):#PY# fname = os.path.splitext(os.path.basename(pdf_path))[0]#PY# doc.add_heading(fname, level=1)#PY# pdf_doc = fitz.open(pdf_path)#PY# for pg in range(len(pdf_doc)):#PY# page = pdf_doc.load_page(pg)#PY# pix = page.get_pixmap(dpi=dpi)#PY# img = Image.open(io.BytesIO(pix.tobytes("png")))#PY# orig_w = img.width / dpi#PY# orig_h = img.height / dpi#PY##PY# if fit_width:#PY# w_inch = usable_width#PY# h_inch = orig_h * (usable_width / orig_w) if orig_w != 0 else usable_width#PY# else:#PY# w_inch = orig_w * scale#PY# h_inch = orig_h * scale#PY##PY# img_bytes = io.BytesIO()#PY# img.save(img_bytes, format="PNG")#PY# img_bytes.seek(0)#PY# p = doc.add_paragraph()#PY# p.alignment = WD_ALIGN_PARAGRAPH.CENTER#PY# run = p.add_run()#PY# run.add_picture(img_bytes, width=Inches(w_inch), height=Inches(h_inch))#PY# if pg < len(pdf_doc) - 1:#PY# doc.add_page_break()#PY# pdf_doc.close()#PY# if idx < len(pdf_files) - 1:#PY# doc.add_page_break()#PY##PY# doc.save(output_docx)#PY# print(f"Word 文档已保存: {output_docx}")#PY##PY#if __name__ == '__main__':#PY# main()