尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

用python-docx拆解农业项目摘要排版参数,输出可复用Word模板

用python-docx拆解农业项目摘要排版参数,输出可复用Word模板 简介《国家农业综合开发产业化经营项目摘要》格式要求参考.pdf 是农业综合开发产业化经营项目申报材料编制的重要格式范本适用于省级农发办事机构、项目编写及评审人员帮助统一摘要结构与排版规范。资源为单个PDF文件约230KB内容涵盖封面、汇总表、目录、正文、英文罗马字符、页面排版、打印装订等全套要求明确了封面字号行距、汇总表填列方、目录与正文字体页眉、A4页面边距及双面打印左侧胶订等细节。读者可将该文件直接作为起草摘要时的对照清单快速核查各级标题、表格、字体及页面设置是否合规减少因格式问题导致的返工。目前已有50人学习文本条目清晰适合作为项目申报团队案头常备的格式参考资料。1. 拆解《国家农业综合开发产业化经营项目摘要》格式规范里的可计算排版参数评审材料里最先被退回的往往不是内容缺项而是封面字体用错、目录没有分散对齐、汇总表横向页边距超限。国家农业综合开发产业化经营项目摘要格式要求把这些易错点写得很细封面分三区块汇总表分七栏页边距固定为上空 2.5cm、下空 2.5cm、左空 3.0cm、右空 2.5cm最后还要双面打印左侧胶订。这套规范本质上是一组可计算的排版参数。做农业项目申报材料汇编、开发模板或对接评审系统的同学可以把它当成接口文档逐项映射成 Word 样式、Python 脚本和打印前检查清单。2. 封面与汇总表的样式树字体、字号、行距与栏次归属2.1 封面三区块的坐标化排版封面是整个摘要册的第一道关卡。规范要求摘要名称分两行排列、居中、小1号黑体、1.5倍行距负责人、编制人和联系电话分三行排列、居中、小3号黑体、单倍行距省级农发办事机构名称和摘要编制时间分两行排列、居中、小2号黑体、1.5倍行距。这三个区块的字体和行距各不相同如果顺着文档流连续回车后续增删文字会把间距带乱。我一般先插入一个无边框的三行一列表格把三块内容分别放进单元格再对每个单元格单独设置段落格式最后隐藏表格边框。这样每个区块的属性互相隔离模板更稳定。区块内容字体字号对齐行距上部摘要名称分两行黑体小124pt居中1.5倍中下部负责人、编制人、联系电话分三行黑体小315pt居中单倍下部省级农发办事机构名称、摘要编制时间分两行黑体小218pt居中1.5倍中文公文字号习惯用“小一、小二、小三”称呼换成磅值分别是 24pt、18pt、15pt。设置 Word 时要注意字号下拉框里显示的是“小二”而不是“小2”两者指的是同一个档位脚本赋值时直接用 Pt 值更不容易产生歧义。如果你在 Word 里用 VBA 批量处理可以选中一个区块后执行下面的宏Sub SetCoverBlock() With Selection.ParagraphFormat .Alignment wdAlignParagraphCenter .LineSpacingRule wdLineSpace1pt5 End With With Selection.Font .Name 黑体 .NameFarEast 黑体 .Size 18 End With End Sub这段宏默认把选中内容设置为小二黑体、1.5 倍行距。处理中下部区块时把.Size改成 15、.LineSpacingRule改成wdLineSpaceSingle处理上部区块时把.Size改成 24。注意Name和NameFarEast必须同时设置否则在中文环境里字体可能回退到默认宋体导致“黑体”只作用在英文和数字上。2.2 汇总表横表头字段与填写权限汇总表是这份材料里唯一明确要求横向排版的页面。标题为“XXX省 XXX年产业化经营项目摘要汇总表”居中、小2号宋体加粗横表头固定七栏表格内文字统一小4宋体。七栏不是等宽排列意见栏通常要写多行评审结论项目代码和资金栏则很窄。列宽可以按“代码窄、名称中、意见宽”的思路分配统一切到横向页面后让表格总宽小于横向可用宽度即可。栏次填写方说明项目代码省级农发办按项目计划代码编写规则填写项目名称省级农发办与封面、正文名称保持一致申请中央财政资金万元省级农发办只填数字不带单位一审专家意见国家农发办根据评审情况填列二审专家意见国家农发办根据评审情况填列最终意见国家农发办评审最终结论备注国家农发办特殊事项说明在 Word 里做这张表时建议先插入“分节符下一页”把纸张方向改为横向再插入七列表格。不要直接在纵向页面上横向拉伸表格那样打印时表头会超出页边距。标题和表格要分成两个段落不要把标题合并进表格首行否则自动目录提取标题时会漏掉汇总表。这张表的版面规则可以整理成三步操作。第一步在横向节中建立七列表格列宽分别设置为 2.2cm、5.0cm、2.5cm、3.5cm、3.5cm、3.5cm、2.0cm合计 22.2cm留出横向页面左右边距的余量。第二步表头行选小2号宋体加粗其余单元格选小4宋体。第三步用“居中对齐”处理表头和资金列意见列使用“左对齐加顶端对齐”方便专家直接填写。到这一步封面和汇总表的视觉框架已经定型。接下来的问题是如何让这些手动操作变成可重复执行的模板避免每个项目都重新调一遍。3. 用 python-docx 生成摘要模板并固化页面设置3.1 先把格式要求翻译成常量手动调格式最大的问题不是不会调而是几十个项目的格式不统一。把格式规范抽成 Python 常量后每次生成新文档只要改文本内容页面设置和样式始终一致。下面这段代码是模板生成器的基础可以在没有安装 Word 的 Linux 服务器上运行。from docx import Document from docx.shared import Pt, Cm from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.oxml.ns import qn FONT_BLACK 黑体 FONT_FANGSONG 仿宋 FONT_SONG 宋体 SIZE_XIAO1 Pt(24) # 小一 SIZE_XIAO2 Pt(18) # 小二 SIZE_3 Pt(16) # 三号 SIZE_XIAO3 Pt(15) # 小三 SIZE_XIAO4 Pt(12) # 小四 SIZE_5 Pt(10.5) # 五号 MARGIN_TOP Cm(2.5) MARGIN_BOTTOM Cm(2.5) MARGIN_LEFT Cm(3.0) MARGIN_RIGHT Cm(2.5)这里的字号常量覆盖了封面、目录、正文出现的所有档位。小1对应 24pt小2对应 18pt小3对应 15pt小4对应 12pt正文要求的小3号仿宋也直接用SIZE_XIAO3。页边距按规范写死不再依赖 Word 的默认值。以后如果格式要求有调整只需要改这个文件里的一组数字。3.2 设置页面、正文样式与页眉新建文档后首先要处理sections[0]。python-docx 创建的空文档自带一个节但页边距不一定是 A4 公文标准所以每个值都要显式赋值doc Document() sec doc.sections[0] sec.page_width Cm(21.0) sec.page_height Cm(29.7) sec.top_margin MARGIN_TOP sec.bottom_margin MARGIN_BOTTOM sec.left_margin MARGIN_LEFT sec.right_margin MARGIN_RIGHT normal doc.styles[Normal] normal.font.name FONT_FANGSONG normal.font.size SIZE_XIAO3 normal.element.rPr.rFonts.set(qn(w:eastAsia), FONT_FANGSONG) normal.paragraph_format.line_spacing 1.5代码逻辑说明前三行设置纸张为 A4接着设置四个边距。Normal样式是全文所有段落的基础把默认字体设为仿宋、小三、1.5 倍行距就对应了正文要求。关键点在rFonts.set(qn(w:eastAsia), FONT_FANGSONG)python-docx 的font.name只写西文字体必须再用w:eastAsia指定中文字体否则生成的文件在 Word 里打开后中文仍显示宋体这是最容易被忽略的一步。页眉要求写项目名称5号宋体居外侧。初审单面打印时可以先右对齐header sec.header hp header.paragraphs[0] hp.text 项目名称 hp.alignment WD_ALIGN_PARAGRAPH.RIGHT for run in hp.runs: run.font.name FONT_SONG run.font.size SIZE_5 run._element.rPr.rFonts.set(qn(w:eastAsia), FONT_SONG)这里遍历hp.runs设置字号是因为页眉段落默认继承 Normal 样式如果不单独改 run页眉就会变成仿宋小三。正式双面打印时还要把“居外侧”落到奇偶页上这个在第 4 章会继续讲。3.3 插入可自动更新的目录域目录部分要求“目录”两字居中、3号黑体项目类别和页码黑体4号项目名称和页码4号或小4号仿宋。手工维护目录很痛苦尤其是专家意见调整后页码全部变化。更稳妥的做法是插入 Word 目录域生成后按 F9 更新目录from docx.oxml import OxmlElement def add_toc(doc): p doc.add_paragraph() p.alignment WD_ALIGN_PARAGRAPH.CENTER run p.add_run(目录) run.font.name FONT_BLACK run.font.size SIZE_3 run._element.rPr.rFonts.set(qn(w:eastAsia), FONT_BLACK) doc.add_paragraph() # 与“目录”空两行的第一行 toc doc.add_paragraph() fld_begin OxmlElement(w:fldChar) fld_begin.set(qn(w:fldCharType), begin) instr OxmlElement(w:instrText) instr.set(qn(xml:space), preserve) instr.text TOC \\o 1-2 \\h \\z \\u fld_sep OxmlElement(w:fldChar) fld_sep.set(qn(w:fldCharType), separate) placeholder OxmlElement(w:t) placeholder.text 打开文档后按 CtrlA再按 F9 更新目录 fld_end OxmlElement(w:fldChar) fld_end.set(qn(w:fldCharType), end) for element in (fld_begin, instr, fld_sep, placeholder, fld_end): toc._p.append(element)TOC \o 1-2表示目录收录级别为 1 到 2 的标题\h让目录项带超链接\z隐藏 Web 预览时的页码\u使用大纲级别提取目录。插入域后目录的文字样式需要在 Word 里通过“目录-自定义目录-修改”统一调整项目类别行设为黑体4号项目名称行设为小4仿宋页码数字用 Times New Roman 小4。这个动作无法完全靠 python-docx 的默认目录样式替代通常我在模板生成后再做一次目录样式修正。常量数值对应规范SIZE_XIAO124pt封面摘要名称SIZE_XIAO218pt封面下部、汇总表标题SIZE_XIAO315pt正文、负责人区块SIZE_XIAO412pt表中文字、目录名称行4. 目录、页码与横向混合排版的坑和参数处理4.1 目录分散对齐不要依赖空格规范里“项目类别、项目名称和页码”要分散对齐。Word 的分散对齐和两端对齐不一样分散对齐会把一行文字拉伸到整行宽度。真正规范的做法是设置“右对齐制表位”在页面右侧边界的位置加一个 tab stop页码前按 Tab页码数字就会右对齐在统一位置。用 python-docx 创建手动目录项时可以这样写from docx.enum.text import WD_TAB_ALIGNMENT p doc.add_paragraph() p.paragraph_format.tab_stops.add_tab_stop(Cm(15.5), WD_TAB_ALIGNMENT.RIGHT) p.add_run(一、种植养殖项目) p.add_run(\t) p.add_run(12)这个制表位的位置取决于正文区宽度。当前页面设置下A4 宽度 21cm左空 3.0cm右空 2.5cm正文区宽度是 21 - 3.0 - 2.5 15.5cm所以 tab stop 放在 15.5cm 处正好落在右边界上。如果调整了页边距这个值必须同步重算。手动目录适合提前预览结构最终提交版本仍建议用第 3 章的 TOC 域自动生成避免页码与实际排版不一致。4.2 横向汇总表与纵向正文混排汇总表必须横向目录和正文必须纵向。python-docx 里新增一个节并把节设为横向from docx.enum.section import WD_ORIENT new_sec doc.add_section(WD_SECTION.NEW_PAGE) new_sec.orientation WD_ORIENT.LANDSCAPE new_sec.page_width Cm(29.7) new_sec.page_height Cm(21.0) new_sec.top_margin MARGIN_TOP new_sec.bottom_margin MARGIN_BOTTOM new_sec.left_margin MARGIN_LEFT new_sec.right_margin MARGIN_RIGHT注意只改orientation在很多渲染器和打印机驱动里不生效必须同时交换page_width和page_height。add_section默认从新的一页开始正好满足汇总表单独成页的要求。汇总表标题用小二宋体加粗表内文字小四宋体可以用遍历表格段落的方式完成table new_sec.add_table(rows2, cols7) table.style Table Grid table.autofit False widths [Cm(2.2), Cm(5.0), Cm(2.5), Cm(3.5), Cm(3.5), Cm(3.5), Cm(2.0)] for row in table.rows: for idx, cell in enumerate(row.cells): cell.width widths[idx] for p in cell.paragraphs: p.paragraph_format.line_spacing 1.0 for run in p.runs: run.font.name FONT_SONG run.font.size SIZE_XIAO4 run._element.rPr.rFonts.set(qn(w:eastAsia), FONT_SONG)列宽单位是Cm表格总宽 22.2cm小于横向可用宽度 24.2cm所以不会出现表格溢出到页边距外的情况。表头行的 7 个单元格要先填好“项目代码、项目名称、申请中央财政资金万元”等内容再单独把表头段落设为小二宋体加粗。注意cell.width在 python-docx 中只是建议宽度如果表格启用了自动调整Word 可能忽略它因此table.autofit False必须写上。4.3 页码连续编排与页眉外侧加了节之后最容易出的问题是页码在横向汇总表那一节重新从 1 开始。双面打印要求页码连续编排底部居中。批量处理时可以用 VBA 把文档所有节的“起始页码”全部关掉For Each s In ActiveDocument.Sections s.Footers(wdHeaderFooterPrimary).PageNumbers.RestartNumberingAtSection False NextRestartNumberingAtSection False表示该节不从 1 重新编号而是延续上一节的页码。这个宏会遍历所有节解决分节符导致的页码重排问题。如果只是手动处理可以在每一节的“页码格式”对话框里选择“续前节”。页眉“居外侧”对应双面打印的奇偶页设置奇数页页眉靠右偶数页页眉靠左。在 Word 里勾选“奇偶页不同”分别编辑奇数页页眉和偶数页页眉内容都是项目名称、5号宋体。这个设置会跟随节所以要在第一个节设置好后确认后续各节都勾选了“链接到前一节”否则每个节都要单独调一遍。故障原因修法目录页码和正文对不上目录域未更新CtrlA 后按 F9汇总表跑到纵向页没有分节或没交换页宽高在新节里改横向并交换宽高页码从 1 重新开始分节后起始页码被重置页码格式设为续前节页眉左右位置不一致未开奇偶页不同页面设置-版式-奇偶页不同5. 双面打印装订前字体嵌入、页码完整性和分册校验5.1 检查系统中文字体是否齐全打印店内经常出现字体缺失黑体变成宋体、仿宋变成楷体。先在生成环境里确认字体存在。Linux 下用fc-listWindows 下在“字体”设置里逐项核对fc-list :langzh | grep -E 黑体|宋体|仿宋|Times New Roman如果系统里找不到“仿宋”需要安装包含该字体的字库。字体文件确认后在 Word 的“文件-选项-保存”中勾选“将字体嵌入文件”避免换一台电脑打开时字体回退。5.2 导出 PDF 并核对页数与分册装订环节以省为单位按扶持方式分册。每个分册按封面、汇总表、目录、正文的顺序左侧胶订。左侧胶订的材料页数通常是双数如果页数是单数打印时会在最后多出一页空白影响胶订质量。用pdfinfo可以快速读取页数pdfinfo 摘要汇总.pdf | grep Pages这个命令输出类似Pages: 36。拿到页数后用pdftk按页码范围抽取分册pdftk 摘要汇总.pdf cat 1-10 output 分册-有偿无偿相结合.pdf pdftk 摘要汇总.pdf cat 11-20 output 分册-投资参股经营.pdfcat 1-10表示抽取第 1 到第 10 页output后跟输出文件名。分册名称要按实际扶持方式命名避免装订时混淆。5.3 分册打印前的最终检查清单检查项合格标准验证方式封面字体小1/小3/小2黑体行距正确打开 Word 样式窗口抽查汇总表横向节内表头七栏完整查看节方向目录已更新页码与正文一致按 F9 后检查字体嵌入PDF 中无缺字pdffonts 检查内嵌字体页码连续、底部居中抽查每个节首页分册页数每个分册为双数用 pdfinfo 逐一确认字体嵌入检查用pdffonts最直接看到字体行带有emb标记说明已嵌入没有emb标记的字体需要回到 Word 重新嵌入导出。检查完成后把每个分册单独提交给打印端选择“双面打印、长边翻转”出纸后按封面、汇总表、目录、正文顺序叠加。最后再用下面这行命令把所有分册的页数批量打出来确保没有单数页分册漏进胶订线for f in 分册-*.pdf; do echo $f: $(pdfinfo $f | awk /^Pages/{print $2})页; done本文还有配套的精品资源点击获取
返回列表