使用python实现公文自动排版的经验分享

简介

最近正在开发一个对docx文件进行公文自动排版的程序,将经验分享一下,让看到的人少走弯路,主要使用的是python 3.8.8,docxtpl 0.16.6,python-docx 0.8.11。

我遇到的具体需求是:用户在前端可以通过类似腾讯文档、金山文档等在线文档编辑的方式,对正文内容进行编辑,然后将正文以docx文件格式及其他相关参数提交给后端,后端再使用docxtpl和python-docx对文档进行格式化,生成统一格式的公文。

目前的效果是:从发送内容到生成文件只需要几分钟。

公文结构分析

公文主要包含几个部分:1、红头,2、正文,3、附件,4、版记

开发方案

通过对各类公文的分析,制定的方案为:

一、先对获取到的docx文件清除所有格式,然后使用统一的格式进行一遍设置。这一步比较简单。

二、对特定的格式进行设置,例如:正文标题、一级标题、二级标题、接收单位、附件清单、落款日期等。这一步的难点在于如何对内容进行判断,这里需要与用户进行约定和确认,以确保不同的内容使用不同的格式。

比如我遇到的情况是:

一级标题统一为“一、二、三、四、”,

二级标题统一为“(一)(二)(三)(四)”,

默认正文的第一行为正文标题,第二行为接收单位,第三行开始为正文及附件内容。

三、制作不同公文对应的模板,将对应的内容填写到模板对应的位置,然后将已经设置好格式的正文内容复制到模板中。这一步的问题是复制到模板中的正文格式会发生变化,还需要对发生变化的地方重新设置格式。

核心代码

对于填充模板内容相对简单,这里提供一个演示代码,实际使用需要根据具体需求进行调整

from docxtpl import DocxTemplate

class fdocx:
    def format_docx(self):
        # 创建文档对象,并加载模板文件
        doc = DocxTemplate(r"e:\doctest\fgstzs1.docx")
        # 定义模板上要替换的标记
        title='这是标题'
        towho='各部门'
        ftype='工作通知书'   
        year= '2023'
        month= '06'
        day= '15'
        who='拟稿人'
        bumen='办公室'
        params = {
            'title': title,
            'towho':towho,
            'type1':ftype,
            'year': year,
            'month': month,
            'day': day,
            'who':who,
            'bumen':bumen
        }
        doc.render(params)

        # 将生成的 Word 文档保存到本地
        doc.save(r"e:\doctest\output.docx")

清除所有内容的格式,演示代码如下:

import docx

class fdocx:
    def clear_formatting(self, doc):
        # 清除段落格式和字体格式
        for paragraph in doc.paragraphs:
            text = paragraph.text
            paragraph.clear()
            paragraph.text = text

定位正文的内容以设置不同的格式,思路是通过find查找对应的内容,然后进行格式设置。示例代码如下:

import docx
from docx.oxml.ns import qn
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

class fdocx:
    def __init__(self):
        #用json统一定义不同内容对应的字体格式,段落格式。
        self.formats = [
            {'id': 1, 'font': '黑体', 'pt': 16, 'alignment': WD_PARAGRAPH_ALIGNMENT.LEFT, 'color': RGBColor(0, 0, 0),
             'first_line_indent': 391160,'style':'Normal'}
            , {'id': 2, 'font': '楷体_GB2312', 'pt': 16, 'alignment': WD_PARAGRAPH_ALIGNMENT.LEFT,
               'color': RGBColor(0, 0, 0),
               'first_line_indent': 391160,'style':'Normal'}
            , {'id': 3, 'font': '仿宋_GB2312', 'pt': 16, 'alignment': WD_PARAGRAPH_ALIGNMENT.LEFT,
               'color': RGBColor(0, 0, 0),
               'first_line_indent': 391160,'style':'Normal'}
            , {'id': 4, 'font': '仿宋_GB2312', 'pt': 16, 'alignment': WD_PARAGRAPH_ALIGNMENT.LEFT,
               'color': RGBColor(0, 0, 0),
               'first_line_indent': 0,'style':'Normal'}
            , {'id': 5, 'font': '方正小标宋简体', 'pt': 22, 'alignment': WD_PARAGRAPH_ALIGNMENT.CENTER,
               'color': RGBColor(0, 0, 0), 'first_line_indent': 0,'style':'Normal'}
            , {'id': 6, 'font': '仿宋_GB2312', 'pt': 16, 'alignment': WD_PARAGRAPH_ALIGNMENT.LEFT,
               'color': RGBColor(0, 0, 0),
               'first_line_indent': 963930,'style':'Normal'}
            , {'id': 7, 'font': '仿宋_GB2312', 'pt': 16, 'alignment': WD_PARAGRAPH_ALIGNMENT.RIGHT,
               'color': RGBColor(0, 0, 0),
               'first_line_indent': 0,'style':'Normal'}
            ]
        self.fjformats = [
            {'id': 1, 'font': '黑体', 'pt': 16, 'alignment': WD_PARAGRAPH_ALIGNMENT.LEFT, 'color': RGBColor(0, 0, 0),
             'first_line_indent': 0,'style':'Normal'}
            , {'id': 2, 'font': '仿宋_GB2312', 'pt': 16, 'alignment': WD_PARAGRAPH_ALIGNMENT.LEFT,
               'color': RGBColor(0, 0, 0),
               'first_line_indent': 391160,'style':'Normal'}
            , {'id': 3, 'font': '方正小标宋简体', 'pt': 22, 'alignment': WD_PARAGRAPH_ALIGNMENT.CENTER,
               'color': RGBColor(0, 0, 0), 'first_line_indent': 0,'style':'Normal'}]

    #根据不同内容获取不同的格式设置的函数
    def getformatjson(self, id, no):
        # print('id',id)
        ans = {}
        if no == 0:
            for w in self.formats:
                if w['id'] == id:
                    ans = w
                    continue
        else:
            for w in self.fjformats:
                if w['id'] == id:
                    ans = w
                    continue
        return ans
    #对格式进行设置的函数
    def formatit(self, paragraph, run, id, no):
        jsondata = self.getformatjson(id, no)
        #设置段落格式
        paragraph.style = jsondata['style']
        paragraph.paragraph_format.alignment = jsondata['alignment']
        paragraph.paragraph_format.first_line_indent = jsondata['first_line_indent']
        #设置字体格式
        run.font.name = jsondata['font']
        run.font.size = docx.shared.Pt(jsondata['pt'])        
        r = run._element.rPr.rFonts
        r.set(qn("w:eastAsia"), u''+jsondata['font'])
        run.font.color.rgb = jsondata['color']
    #遍历docx文档,进行相应的格式设置
    def get_paragraph_formats(self, file_path):
        doc = docx.Document(file_path)
        self.clear_formatting(doc)
        doc.save(file_path)
        doc = docx.Document(file_path)
        # self.outprint(doc)
        # 遍历每个段落,Pt与磅的转换值为12700
        for pno, paragraph in enumerate(doc.paragraphs):
            if not paragraph.text.isspace() and len(paragraph.text) > 0:
                for run in paragraph.runs:
                    if not run.text.isspace() and len(run.text) > 0:                        
                        # 先按照普通正文格式设置一次
                        self.formatit(paragraph, run, 3, 0)
                        #此处自行添加对各种内容的判断,然后设置相应的格式

if __name__ == '__main__':
    file_path = 'e:\\doctest\\111.docx'
    doc = docx.Document(file_path)
    

总结

技术上难度不大,难点在于前期需要和用户反复沟通确认需求,然后在开发时,细节上需要厘清思路,对文档内容进行合理判断,确保不同的内容使用不同的格式。

最后,就是合理使用gpt等大模型,帮助判断分析代码中的问题。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python实现word自动排版是通过操作Word文档来实现的。Word文档是一种MS Word应用程序的文档格式,使用Python可以通过Office API来实现Word的操作。 Python提供了一些针对Word文档的库,比如Python-docx库、Win32com库等,可以通过这些库来实现Word文档的排版。其中Python-docx库对于Word文档的操作比较简单,可以使用该库来创建、修改和保存Word文档。 在Python-docx库中,最基础的操作是创建文档对象Document(),这个文档对象就是一个Word文档,之后可以在文档中添加各种元素,包括文本、表格、图片、图表等,还可以设置这些元素的格式、字体、大小等属性。 例如,我们可以使用Python-docx库通过以下代码来创建一个包含一段文字和一个表格的Word文档: ``` import docx # 创建空的Word文档 doc = docx.Document() # 添加文本 doc.add_paragraph('这是一段文字') # 添加表格 table = doc.add_table(rows=3, cols=3) table.cell(0, 0).text = '单元格1' table.cell(0, 1).text = '单元格2' table.cell(0, 2).text = '单元格3' # 保存文档 doc.save('example.docx') ``` 另外,可以通过Python-docx库的样式Style类来设置字体、大小、颜色等样式,进一步实现Word文档的排版。 综上所述,Python实现Word自动排版,需要熟练掌握Python-docx库的各种操作,灵活运用Word文档中的元素和样式,结合实际需求,通过编写Python代码实现Word文档的自动排版。 ### 回答2: Python可以使用多种库来实现Word自动排版,其中应用最广泛的是python-docx库。该库使得用户可以在Python环境下读取和修改Microsoft Word文档,实现文本格式设置、插入图片和表格等各种功能。 使用python-docx库排版Word文档需要掌握一些基本的Python编程知识,包括创建和修改文本、格式化文本样式、处理表格数据、插入图片等操作。首先要导入python-docx库,然后需要创建和打开Word文档,向文档中添加文本和文本格式,例如设置字体、大小、颜色、加粗、斜体等。还可以通过调整段落格式实现排版,例如调整行距、段落间距、缩进等。如果需要插入表格,可以使用python-docx库中的表格模块,创建表格并向其中添加数据。需要插入图片时,也可以使用相应的函数,将图片插入到文档中。 除此之外,还可以使用其他Python库如Pillow对图片进行处理,使得图片在文档中显示时具有更好的效果。此外,用户还可以使用模板功能,实现文档自动排版,大大增强了Python实现Word自动排版的便捷性。 总之,Python作为一种广泛应用的编程语言,通过使用现有的第三方库和自己编写创建的自定义代码,可以在Word文档上实现各种自动化操作,从而提高工作效率和减少出错几率。 ### 回答3: Python是一种非常流行的编程语言,它在文本处理方面有很多强大的功能。其中之一就是实现Word自动排版Python可以通过读取Word文档的内容,自动对文本进行格式化和排版。我们可以通过使用Python的Docx库来实现这个功能。该库可以让我们操作Word文档,包括添加、更改和删除内容等。 使用Python实现Word自动排版需要完成以下几个步骤: 1. 读取Word文档:我们可以使用Docx库中的Document函数来读取Word文档。 2. 设置格式化样式:使用Docx库的相关函数设置需要的样式,如字体、字号、段落格式等。 3. 对文本进行格式化处理:比如对某个段落进行缩进、对齐方式的修改等。 4. 保存处理后的Word文档:将处理后的文本保存为新的Word文档。 Python实现Word自动排版可以帮助我们节约大量的时间和精力。它可以使我们的文档更加规范、美观、易读,并提高我们的工作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值