title: python实现word判断索引页码
date: 2019-02-12 15:09:39
tags:

  • pdf
  • word
  • python
    categories:
  • python
  • 自动化

python判断word页码

1、整体思路

​ word的源码格式类似于xml,目前无法直接解析word页码

​ 整体思路是 先将word转成pdf, 通过对PDF每一页进行文字提取,判断页码。

2、使用到的python库

​ 主要是 pdfminer库进行word转换成PDF,windows去下载pdfminer3k ,该库的准确率很高,不用担心正确率的问题

​ python处理PDF有两个比较常见的库,另一个是pypdf2,该库在我的项目中表现比较差,提取PDF中的文字时准确率比较低,所以放弃了。

3、windows下安装pdfminer3k

pip install pdfminer3k

4、环境

​ python3.6

​ windows

5、代码

import os
import sys
import importlib
importlib.reload(sys)
import re
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
from win32com.client import Dispatch, constants, gencacherootDir = os.getcwd() + r"\root"
projectDir = os.getcwd()
logPath = os.path.join(projectDir, r'log.txt')
colorLogPath = os.path.join(projectDir, r'colorLog.txt')def log(*args):"""输出灰印日志:param data:"""data = "#".join(list(args))# print(data)with open(logPath, 'a') as f:f.write(data + "\n")def colorLog(*args):"""输出彩印日志:param data:"""data = "#".join(list(args))with open(colorLogPath, 'a', encoding='utf-8') as f:f.write(data + "\n")def readPartItems(partItemsPath):"""读取信息:param partItemsPath::return:"""with open(partItemsPath, 'r', encoding='utf-8') as f:return f.read()def pdfParse(path, kws):"""解析pdf 文本,返回关键检索信息:param path: pdf路径:param kws: 匹配的关键字列表:return: 元祖(blackPrint, corlorPrint,capNames)  ([灰色页] ,[彩色页])"""colorPrint = []  # 彩色打印页码blackPrint = []  # 黑白打印页码cpaNames = []    #注册师fp = open(path, 'rb')  # 以二进制读模式打开# 用文件对象来创建一个pdf文档分析器praser = PDFParser(fp)# 创建一个PDF文档doc = PDFDocument()# 连接分析器 与文档对象praser.set_document(doc)doc.set_parser(praser)# 提供初始化密码# 如果没有密码 就创建一个空的字符串doc.initialize()# 检测文档是否提供txt转换,不提供就忽略if not doc.is_extractable:raise PDFTextExtractionNotAllowedelse:# 创建PDf 资源管理器 来管理共享资源rsrcmgr = PDFResourceManager()# 创建一个PDF设备对象laparams = LAParams()device = PDFPageAggregator(rsrcmgr, laparams=laparams)# 创建一个PDF解释器对象interpreter = PDFPageInterpreter(rsrcmgr, device)count = 0  # 记录页数# 循环遍历列表,每次处理一个page的内容for page in doc.get_pages():  # doc.get_pages() 获取page列表count += 1interpreter.process_page(page)# 接受该页面的LTPage对象layout = device.get_result()# 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要获取文本就获得对象的text属性,results = ''for x in layout:if (isinstance(x, LTTextBoxHorizontal)):results += x.get_text()# 正则匹配是否彩印pattern = '|'.join(kws)data = re.findall(pattern, results, re.S)# 正则匹配注册会计师的姓名pattern = '中国注册会计师:\s*(.*?)\n'nameList = re.findall(pattern, results, re.S)for i in nameList:cpaNames.append("".join(re.split(r'\s+', i)))# 区分彩灰打印页if data:colorPrint.append(str(count))else:blackPrint.append(str(count))return blackPrint, colorPrint, cpaNamesdef createPdf(wordPath, pdfPath):"""word转pdf:param wordPath: word文件路径:param pdfPath:  生成pdf文件路径"""word = gencache.EnsureDispatch('Word.Application')doc = word.Documents.Open(wordPath, ReadOnly=1)doc.ExportAsFixedFormat(pdfPath,constants.wdExportFormatPDF,Item=constants.wdExportDocumentWithMarkup,CreateBookmarks=constants.wdExportCreateHeadingBookmarks)word.Quit(constants.wdDoNotSaveChanges)def printCredential(cpaNames):# print("打印证书:", cpaNames)passdef createData(path):data = readPartItems(path + "\project_part_items.txt")item = data.split("\n")if not os.path.exists(r'%s\pdfCachDir' % projectDir):os.mkdir(r'%s\pdfCachDir' % projectDir)pdfCachDir = r'%s\pdfCachDir' % projectDir  # pdf存放目录fileNameList = os.listdir(path)cpaNames = []  #需要打印证书的名字for file in fileNameList:pages = "Default"copies = "1"(fileName, extension) = os.path.splitext(file)fileAbsPath = os.path.join(path, file)#wordif "封面" in fileName and extension in ['.docx', '.doc']:log(extension, fileAbsPath, pages, copies)#wordelif "正文" in fileName and extension in ['.docx', '.doc']:pdfAbsPath = os.path.join(pdfCachDir, fileName + '.pdf')  # pdf 路径if not os.path.exists(pdfAbsPath):  # pdf是否存在createPdf(fileAbsPath, pdfAbsPath)kws = ["中国注册会计师", "中国·北京"]# 解析pdf 该返回二维列表 [[灰白印页], [彩印页], [cpanames]blackPrint, colorPrint, cpaNames = pdfParse(pdfAbsPath, kws)# 灰白打印记入文件log(extension,fileAbsPath, ",".join(blackPrint), copies)# 彩色打印记入文件colorPages = str(','.join(colorPrint[1]))pattern = "正文.docx:(.*?)\n"dataId = re.findall(pattern, data)[0]colorLog(item[0].split(":")[-1], item[1].split(":")[-1], copies, "%s$%s" % (dataId, colorPages))# 删除pdf缓存文件os.remove(pdfAbsPath)pass# ecxl文件操作elif "报表" in fileName and extension in ['.xls', '.xlsx']:# print('正在写入灰白打印记录', fileAbsPath)log(extension, fileAbsPath, pages, copies)pass# wordelif '附注' in fileName and extension in ['.docx', '.doc']:# print('正在写入灰白打印记录', fileAbsPath)log(extension, fileAbsPath, pages, copies)pass# 最终处理打印证书printCredential(cpaNames)def main(rootDir):fileDirs = os.listdir(rootDir)for fileDir in fileDirs:fileDirPath = os.path.join(rootDir, fileDir)createData(fileDirPath)def err():if os.path.exists(logPath):os.remove(logPath)if os.path.exists(colorLogPath):os.remove(colorLogPath)if os.path.exists(r'%s\pdfCachDir' % projectDir):pdfCachDir = r'%s\pdfCachDir' % projectDir  # pdf存放目录for pdf in os.listdir(pdfCachDir):pdfPath = os.path.join(pdfCachDir, pdf)os.remove(pdfPath)os.rmdir(pdfCachDir)if __name__ == '__main__':try:main(rootDir)except:err()

最近查看vba文档发现 调用vba可以很简单实现

Autoit 实现word拆分页解析 (python同理)

背景

之前一直在做相关工作,由于没有找到解决最佳解决方案,老办法思路是 python先将word 转成pdf,按照页码 提取文字,从而实现word的页索引工作。

最近研究了一下vba,终于找到了最佳解决方案!!!

AutoIt

我用AutoIt测试的,AutoIt调用vba

#include <MsgBoxConstants.au3>
#include <Word.au3>; 创建应用对象
Local $oWord = _Word_Create()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocOpen 示例", _"创建新 Word 应用对象时发生错误." & @CRLF & "@error = " & @error & ", @extended = " & @extended); *****************************************************************************
; 只读打开文档
; *****************************************************************************
Local $sDocument = 'D:\Desktop\tzcpa\BJ自动打印\新建文件夹\AutoPrinter\log\backupFile\2019-04-03 08h39m03s140\天职业字[2019]11884号\2.单体审计报告2018-标准无保留意见.docx'
Local $doc = _Word_DocOpen($oWord, $sDocument, Default, Default, True)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocOpen 示例 1", "打开文档 '.\Extras\Test.doc' 发生错误." & _@CRLF & "@error = " & @error & ", @extended = " & @extended);关键部分!!!!
; $doc 是当前活动文档,Pages是页码索引,Item是矩形框索引 改成请自行更改测试,因为一页可能有多个矩形框
;返回值时 活动文档某一页的 矩形框中的文本Local $objPage = $doc.ActiveWindow _.Panes(1).Pages(2).Rectangles.Item(2).Range.Text
MsgBox(1,1,$objPage)MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocOpen 示例 1", "文档 '" & $sDocument & "' 已成功打开.")

思路

整体思路是调用vba,由于目前python没有发现 有库可以对 页对象进行操作,所以采用了调用底层vba来操作

在vba中 页对象有一个是 Rectangles属性,解释如下

下面的示例返回活动文档中第一页的矩形集合。

Dim objRectangles As Rectangles Set objRectangles = ActiveDocument.ActiveWindow _ .Panes(1).Pages(1).Rectangles

然后顺藤摸瓜找到了Rectangles对象可以操作Range ,这样就可以获得某一页的某一矩形 内的 text,之后对于大多数页对象的操作也就解决了。

python同理,使win32库调用 vba就好了

python判断word页码相关推荐

  1. python统计word页码_python 实现 Word Count

    一.WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数.单 ...

  2. Python检查Word文件中包含特定关键字的所有页码

    推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情: 配套资源: 用书教师可以联系董老师获取教学大纲.课件.源码.教案. ...

  3. Python实现Word文档标题格式判断

    本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 引言 在日常生活里,不管是办公.学习还是制作邀请函.请柬.简历等等,我们都会使用一个软件Microso ...

  4. 使用Python处理Word文件

    使用Python处理Word文件 安装外部模块python-docx pip install python-docx 1. 从Python看Word文件结构 在python-docx模块中,将Word ...

  5. 用python将word文档导入数据库_python读取word文档,插入mysql数据库的示例代码

    表格内容如下: 1.实现批量导入word文档,取文档标题中的数字作为编号 2.除取上面打钩的内容需要匹配出来入库入库,其他内容全部直接入库mysql # wuyanfeng # -*- coding: ...

  6. python解析word中表格_python读取word表格

    python如何获取word文件中某个关键字之后的表格 用python对word文档进行搜索和读取,要CSS布局HTML小编今天和大家分享读取docx文件中某个关键字文本最好是全部都读取到程序中,在程 ...

  7. Python操纵Word神器——python-docx大全(含插入pptx图表)

    有定制化需求可私信联系 文章目录 简介 安装 初试 基本概念 快速上手 使用文本 块级与内联文本对象 段落属性 水平对齐 缩进 制表符 段落间距 行距 分页 字体格式 长度单位 字号对应关系 使用分区 ...

  8. python合并word表格单元格_Python实战009:读取Word文档中的表格数据及表格合并问题解决...

    同事最近被安排整理资料,主要工作室将文档中的表格数据提取出来并整理层Excel表格供我们FII刀具商城进行资料维护.由于刀具的种类繁多且规格无数,所以要处理的数据量相当的庞大.人工核对整理既费时又费力 ...

  9. python读取word详解【from docx import Document】

    python读取word详解[from docx import Document] 目录 python读取word详解[from docx import Document] 前言 环境 示例字符串 下 ...

最新文章

  1. 9.MYSQL:MyISAM表级锁(共享读锁 独占写锁)串行+并发
  2. 通过福禄克LinkIQ网络电缆测试仪排除 VLAN 故障
  3. 全新的 Vue3 状态管理工具:Pinia
  4. php maximum,解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示...
  5. xshell怎么让程序后台运行_使程序在Linux下后台运行
  6. python数学计算模块之math常用函数学习使用
  7. java list 包含字符串_Java8实战:查找列表中包含的字符串
  8. 蓝桥杯真题:单词分析
  9. 爬虫中无头浏览器如何选择
  10. 精品谷歌浏览器chrome插件大汇总!值得收藏
  11. xp系统telnet服务器,xp电脑telnet服务器
  12. go语言swag注解示例
  13. MHDD 4.6 硬盘工具简介、下载、启动盘制作、扫描及修复硬盘坏道、坏道修复原理简介、常用命令等
  14. php exec 命令,概述PHP命令行shell_exec()使用
  15. 数字藏品的价值是什么?
  16. 海康威视(HIKViSION)2009年校园招聘笔试题-杭州(1)
  17. 软件测试测试用例—用户注册界面
  18. 信息系统项目管理(五)信息系统安全技术
  19. 【论文精读】OmniFusion全景相机的深度估计
  20. python文件操作3--批量修改文件后缀名

热门文章

  1. 兼容各操作系统平台的Anki选择题库模板
  2. [ARC086]F - Shift and Decrement 位运算+数论+DP
  3. C# 扫描并读取图片中的文字
  4. C/C++开3次方函数cbrt
  5. Unity Android Unable to load resource的问题
  6. @Idempotent注解限制同一时刻的访问间隔
  7. 苹果支付返回html,苹果应用内支付,服务器端的实现
  8. 小姜的Android之路
  9. ps:消除锯齿和羽化
  10. php 图片处理羽化,ps羽化的作用及羽化的使用方法