批量把word转图片再转pdf,防止文字被复制

🎯 程序主要功能

该程序实现了一个 自动化文档处理流水线,核心目标是:

将指定目录中的 Microsoft Word(.docx)文档批量转换为高质量、小体积的图像型 PDF 文件,适用于归档、分享或嵌入系统等场景。

注意不是word直接转pdf,而是先转图片,再拼凑成pdf,这样可以有效的防止pdf的文字被复制。

✅ 具体功能包括:

  1. 批量处理
    自动扫描 C:\temp 目录下所有 .docx 文件(自动跳过 Word 临时文件如 ~$xxx.docx)。

  2. Word → PDF 转换
    利用 Microsoft Word 的 COM 接口,将每个 .docx 文档导出为标准 PDF(保留原始排版)。

  3. PDF → 高清 JPEG 图像
    使用高分辨率(默认 150 DPI)将 PDF 每一页渲染为 JPEG 图片,兼顾清晰度与文件体积。

  4. 图像 → 压缩 PDF 合并
    将所有 JPEG 页面重新组合成一个单一 PDF 文件,并启用:

    • zlib 流压缩(deflate=True
    • 图像流压缩(deflate_images=True
    • 冗余对象清理(garbage=3clean=True
  5. 错误容错与重试机制
    对于因 Word 卡顿或复杂内容导致失败的文档,自动重试最多 2 次,提升成功率。

  6. 输出结构清晰

    • 图片临时目录:xxx_pages/
    • 最终 PDF:xxx_combined.pdf
    • 显示生成文件大小(MB),便于监控
  7. 资源安全释放
    严格管理 Word 进程、临时文件、内存对象,防止进程残留或磁盘堆积。


⚙️ 技术栈(依赖库)

技术用途安装命令
pywin32调用 Windows 上的 Microsoft Word COM 接口,实现 .docx → PDFpip install pywin32
PyMuPDF (fitz)高性能 PDF 渲染、图像提取、PDF 合并与压缩pip install PyMuPDF
Pillow (PIL)将位图数据保存为 JPEG 格式(控制质量与体积)pip install Pillow
Python 标准库tempfile(临时文件)、pathlib(路径操作)、os(文件系统)等内置

💡 运行环境要求

  • Windows 系统(因依赖 Word COM)
  • 已安装 Microsoft Word(2010 或更高版本)
  • Python 3.7+

📦 典型应用场景

  • 项目文档自动化归档(可以代替出扫描文档再组成pdf)
  • 将动态 Word 报表转为不可编辑的 PDF 快照
  • 为无 Office 环境提供标准化文档交付格式
  • 减少人工操作,提升批量处理效率

📌 总结一句话

本程序利用 Word + PyMuPDF + Pillow 构建了一条稳定、高效、低体积的 Word → 图像型 PDF 自动化转换流水线,专为 Windows 企业文档处理场景设计。

import os
import time
import tempfile
from pathlib import Path

import win32com.client
import fitz
from PIL import Image

TEMP_DIR = r"C:\temp"
DPI = 150
JPEG_QUALITY = 85
MAX_RETRIES = 2  # 失败重试次数

def pixmap_to_image(pix):
    return Image.frombytes("RGB", (pix.width, pix.height), pix.samples)

def safe_word_quit(app):
    try:
        if app:
            app.Quit()
    except:
        pass

def process_docx(word_path, retry=0):
    print(f"\n正在处理: {word_path.name} (尝试 {retry + 1}/{MAX_RETRIES + 1})")
    safe_name = "".join(c if c.isalnum() or c in "._-" else "_" for c in word_path.stem)
    output_folder = Path(TEMP_DIR) / f"{safe_name}_pages"
    output_folder.mkdir(exist_ok=True)

    temp_pdf = None
    word_app = None
    doc_obj = None

    try:
        # 创建临时 PDF
        with tempfile.NamedTemporaryFile(suffix=".pdf", delete=False) as tmp:
            temp_pdf = tmp.name

        # 启动 Word(关键:加延迟避免冲突)
        word_app = win32com.client.Dispatch("Word.Application")
        word_app.Visible = False
        word_app.DisplayAlerts = False  # 禁用弹窗

        doc_obj = word_app.Documents.Open(
            str(word_path.resolve()),
            ReadOnly=True,
            PasswordDocument="",  # 无密码
            AddToRecentFiles=False
        )
        doc_obj.ExportAsFixedFormat(OutputFileName=temp_pdf, ExportFormat=17)
        doc_obj.Close(SaveChanges=False)
        doc_obj = None
        safe_word_quit(word_app)
        word_app = None

        # PDF → JPEG
        pdf_doc = fitz.open(temp_pdf)
        zoom = DPI / 72.0
        mat = fitz.Matrix(zoom, zoom)
        image_paths = []

        for i in range(pdf_doc.page_count):
            page = pdf_doc.load_page(i)
            pix = page.get_pixmap(matrix=mat, alpha=False)
            img = pixmap_to_image(pix)
            img_path = output_folder / f"page_{i+1:03d}.jpg"
            img.save(img_path, "JPEG", quality=JPEG_QUALITY, optimize=True)
            image_paths.append(str(img_path))
            print(f"  → 已保存: {img_path}")

        pdf_doc.close()

        # 合并为 PDF
        if image_paths:
            output_pdf = Path(TEMP_DIR) / f"{safe_name}_combined.pdf"
            new_pdf = fitz.open()
            for img_path in image_paths:
                img_doc = fitz.open(img_path)
                w = img_doc[0].get_pixmap().width
                h = img_doc[0].get_pixmap().height
                img_doc.close()
                page = new_pdf.new_page(width=w, height=h)
                page.insert_image(fitz.Rect(0, 0, w, h), filename=img_path)
            new_pdf.save(str(output_pdf), garbage=3, deflate=True, deflate_images=True, clean=True)
            new_pdf.close()
            print(f"  → 已生成压缩 PDF: {output_pdf}")
            print(f"    文件大小: {output_pdf.stat().st_size / (1024*1024):.2f} MB")

        # 可选:删除图片文件夹
        # import shutil; shutil.rmtree(output_folder)

        return True

    except Exception as e:
        print(f"  ❌ 处理失败: {e}")
        if retry < MAX_RETRIES:
            time.sleep(2)  # 等待 2 秒再重试
            return process_docx(word_path, retry + 1)
        return False
    finally:
        # 强制清理
        if doc_obj:
            try:
                doc_obj.Close(SaveChanges=False)
            except:
                pass
        safe_word_quit(word_app)
        if temp_pdf and os.path.exists(temp_pdf):
            try:
                os.remove(temp_pdf)
            except:
                pass

def main():
    temp_dir = Path(TEMP_DIR)
    if not temp_dir.exists():
        print(f"目录 {TEMP_DIR} 不存在!")
        return

    # 只处理真正的 .docx,排除 ~$ 临时文件
    docx_files = [
        f for f in temp_dir.glob("*.docx")
        if f.is_file() and not f.name.startswith("~$")
    ]

    if not docx_files:
        print(f"{TEMP_DIR} 中没有找到有效的 .docx 文件。")
        return

    print(f"共发现 {len(docx_files)} 个文档待处理。")

    success_count = 0
    for word_path in docx_files:
        if process_docx(word_path):
            success_count += 1

    print(f"\n✅ 完成!成功: {success_count}/{len(docx_files)}")

if __name__ == "__main__":
    main()

源码链接: https://pan.quark.cn/s/a4b39357ea24 斐讯K2是一款广受用户青睐的无线路由器,其运行表现稳定且具备较高的可操作性,在DIY爱好者群体中拥有极高的声誉。本资料将系统性地阐述斐讯K2的固件刷机方法及其关联的技术要点。固件升级是路由器爱好者改善设备性能、扩展功能的一种普遍手段,经由替换出厂固件,能够达成更加个性化的网络配置、增强安全防护等目标。斐讯K2固件资源库涵盖了多种知名的非官方固件,诸如Tomato Pheonix 不死鸟、高恪、PandoraBox 潘多拉等,这些固件均具备独特的优势,能够适配不同用户的需求。 1. Tomato Pheonix 不死鸟:Tomato是一款立足于Linux的开源固件,以其精巧、高效而备受推崇。不死鸟版本是专门为华硕及斐讯路由器优化的分支,提供了卓越的QoS(服务质量)配置、详尽的图表监控以及便捷的固件升级途径。对于那些需要精准调控带宽和监测网络状态的用户而言,这是一个理想的选项。 2. 高恪:高恪固件是OpenWrt的定制化版本,着重于操作的便捷性和运行的可靠性,特别适合对路由器操作不甚熟悉的用户群体。它提供了一些实用的功能,例如内置的广告屏蔽、快速测速工具等,同时保留了OpenWrt的适应性。 3. PandoraBox 潘多拉:潘多拉盒是另一款基于OpenWrt的固件,它以丰富的插件库和强大的自定义潜力而闻名。用户能够依据个人需求安装各类插件,实现更多功能,如远程接入、DDNS(动态域名解析服务)等。 4. 官方固件的纯净版本与定制版本:官方固件通常更侧重于稳定性,纯净版意味着未预置额外的应用或服务,适合注重稳定性的用户。定制版则可能包含了制造商的特色功能或优...
源码下载地址: https://pan.quark.cn/s/926926948560 AS3.0与XML结合的通用图片滚动功能,是一种基于ActionScript 3.0和XML技术的动态图像展示方案,非常适合初学者进行学习和实践应用。此项目的关键在于借助XML文件作为数据媒介,用来保存图像的相关参数,例如图像的链接地址、展示的次序等,接着在AS3.0环境中对XML进行解析,并动态地载入和展示这些图像,达成图像的滚动或是循环播放的目的。 我们需要明确ActionScript 3.0(AS3.0)是Adobe Flash Professional以及Flex Builder等开发工具中采用的编程语言,用于构建交互式内容以及丰富的互联网应用。相较于先前的版本,AS3.0在性能上有了大幅度的提升,并且引入了更为规范的面向对象编程模式,涵盖了类、接口以及包等概念。 XML(可扩展标记语言)是一种简明且高效的数据传输格式,既便于人类阅读和编写,也易于机器进行解析和生成。在该项目中,XML文件用于存储图像数据,例如图像的URL、延时的时长、动画的样式等,通过这种方式可以将数据与程序代码分离,从而增强代码的可维护性与可扩展程度。 实施这一图片滚动功能,主要涉及到以下AS3.0的核心知识点: 1. **XML解析**:运用`XML`类来载入并解析XML文件,从而获取图像的清单。AS3.0提供了简便的API来操作XML节点,例如`children()`、`attributes()`等,用以获取子节点和属性值。 2. **事件监听**:借助`EventDispatcher`类来监控载入和解析过程中的事件,比如`Event.OPEN`、`Event.PROGRESS`、`Event...
内容概要:本文介绍了软件许可管理的技术实现方式及相关工具资源,重点阐述了加密外壳(EMS)和API加密两种保护机制。加密外壳通过将程序(如.exe、.dll、.apk)封装在加密壳中,实现运行时内存解密,防止静态反编译和代码篡改,同时支持对数据文件、系统参数及部分代码的加密,并依赖硬件锁(HL)或软件锁(SL)进行授权控制。API加密则通过在代码中嵌入安全验证调用,确保授权合法后才执行核心逻辑。文章还说明了锁的类型(HL/SL)、模式(有驱/AdminMode与无驱/UserMode)、升级路径以及虚拟时钟功能,并描述了产品授权流程从功能定义到产品创建、授权生成的全过程,支持通过C2V文件或锁ID复制已有授权状态。文中附带多个开源平台链接和技术博客参考资源。; 适合人群:从事软件版权保护、授权系统开发或安全技术研究的研发人员,尤其是具备一定逆向工程、软件安全基础的1-3年经验开发者。; 使用场景及目标:①构建安全的软件授权体系,防止盗版和非法使用;②实现灵活的功能授权管理(如时效、并发、硬件绑定);③选择合适的加密方案(硬件锁/软锁、有驱/无驱)并集成到现有产品中;④学习加密外壳与API验证的实际应用方法; 阅读建议:此资源侧重于软件许可的技术架构与实施细节,建议结合提供的GitHub、Gitee项目链接及CSDN技术文章深入理解实现原理,并通过实际调试加密壳和模拟授权流程加强实践能力。
内容概要:本文聚焦于“风光制氢合成氨系统优化研究”,系统阐述了基于Cplex求解器对该耦合系统进行数学建模与优化求解的全过程,并提供了完整的Matlab代码实现。研究整合风能、光伏等可再生能源发电与电解水制氢、合成氨化工工艺,构建涵盖系统容量配置与运行调度的联合优化模型,旨在提升绿电就地消纳水平、降低碳排放强度并实现综合能源利用效率的最大化。文中详细解析了优化模型的核心构成,包括以综合成本最小化或能源效率最大化为目标的目标函数设计,以及涵盖设备出力能力、系统能量动态平衡、设备启停特性等关键环节的约束条件建模方法,利用Cplex求解器进行高效精确求解,模型适用于并网与离网等多种运行场景。; 适合人群:具备一定能源系统建模与优化理论基础,熟练掌握Matlab编程语言及常用优化工具箱(如YALMIP)应用的科研人员与工程技术从业者,特别适用于从事综合能源系统规划、绿色氢能与绿氨生产、可再生能源高效集成等前沿领域的硕士、博士研究生及高校科研人员。; 使用场景及目标:①复现高水平学术论文中关于风光制氢合成氨系统的复杂优化模型;②深入掌握Cplex求解器在大规模、多约束能源系统优化问题中的高级建模与调用技巧;③开展面向“双碳”战略的绿氢、绿氨生产项目的可行性分析、规划设计与运行策略研究,为清洁能源项目的科学决策与工程落地提供量化依据和技术支撑。; 阅读建议:建议读者结合文中提供的Matlab代码与相关领域的权威文献进行对照学习,重点剖析模型构建的物理逻辑与数学推导过程,熟练掌握Cplex与Matlab的接口调用方法;鼓励读者通过调整系统参数、修改目标函数或扩展模型结构(如引入更多不确定性因素)等方式进行二次开发,以适应不同的实际应用场景,进一步深化对综合能源系统优化的理解与实践能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值