# pdfTemplate **Repository Path**: mengyinggitee/pdf-template ## Basic Information - **Project Name**: pdfTemplate - **Description**: pdf的模板填充和docx转换pdf基于xml方式的元素重建,在重建中开发者可以通过hook的方式随意修改相关内容 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-03-22 - **Last Updated**: 2024-04-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

pdfRebuilder

pdf基于xml的内容重建功能实现(v1.0.1)

👉 个人网站:http://124.71.212.219:8028/ 👈

### 解决问题 * word模板填充功能是开发中常见的功能,目前常用的技术方案是docx的模板填充和docx转换pdf的功能,所存在的问题 * docx转换pdf,从目前的来看常用的MS office, wps的linux版本,libreoffice都依赖系统级锁,并发性能低 * docx转换pdf中,流行的库都无法完全解决样式问题,用户可以自定义在重建中修改样式 * 用户在转化过程中无法自定义操作,做一些基于业务的特殊处理的痛点 ### 技术方案介绍 * 基于xml技术和pdf的元素重建, 融合部分图像处理的识别功能,实现以下功能 ### 实现功能 * pdf的模板替换方案 * pdf的元数据提取(内容,位置,图片提取) * pdf中指定内容的替换功能 * 构建元数据hook功能,实现实际业务的diy ### 运行环境 ``` # 环境 python3.10 # 安装依赖 pip install -r requirements.txt ``` ### 功能实现示例 #### pdf的模板填充 ``` from core.pdfTemplateApi import PdfTemplateApi import io if __name__ == '__main__': # 兼容文件路径 和 open(".\test.pdf", 'rb') pdf_io:io.BytesIO = PdfTemplateApi(".\test.pdf").render({"flag": "这是flag的值"}) with open(r".\result.pdf", "wb") as f: f.write(t.read()) ``` #### word转pdf ``` from core.wordTemplateApi import WordTemplateApi if __name__ == '__main__': WordTemplateApi.docx2pdf(r".\tess.docx", r".\tess.pdf") ``` #### pdf元数据提取 ``` from core.pdfTemplateApi import PdfTemplateApi import io if __name__ == '__main__': # 或者图片数据(包括图片大小,pdf位置和PIL.Image)和字体数据(大小, 颜色,位置) metadata:dict= PdfTemplateApi(".\test.pdf").get_metadata() image_data:dict= PdfTemplateApi(".\test.pdf").get_image_data() ``` #### pdf过程重建 ``` from core.pdfTemplateApi import PdfTemplateApi import io def selfHook(metadata) """pdf在重建前都会回调该函数,可以自定义你的操作, 以下为子替换自定支付穿的实现""" renderData = {"flag": "这是替换flag的值"} if metadata.get("type") == "draw_textbox": text = metadata.get("text") for key, value in renderData.items(): key = "{{" + str(key) + "}}" text = re.sub(key, value, text) metadata["text"] = text return metadata if __name__ == '__main__': pdf_io:io.BytesIO = PdfTemplateApi(".\test.pdf", hook=selfHook).get_metadata() ``` ### 演示图