精华内容
下载资源
问答
  • python判断word页码

    千次阅读 2019-02-12 17:10:00
    title: python实现word判断索引页码 date: 2019-02-12 15:09:39 tags: pdf word python categories: python 自动化 python判断word页码 1、整体思路 ​ word的源码格式类似于xml,目前无法直接解析word页码 ​ ...

    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, gencache
    
    
    rootDir = 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 PDFTextExtractionNotAllowed
        else:
            # 创建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 += 1
                interpreter.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, cpaNames
    
    
    def 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)
        pass
    
    
    
    def 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)
            #word
            if "封面" in fileName and extension in ['.docx', '.doc']:
                log(extension, fileAbsPath, pages, copies)
            #word
            elif "正文" 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
            # word
            elif '附注' 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计算书页码的统计数字问题,是Python程序设计中一个比较典型的应用实例。分享给大家供大家参考。具体如下: 问题描述:对给定页码n,计算出全部页码中分别用到多少次数字0,1,2,3,4…,9 实例代码...
  • 查单词所在页码 python

    2021-06-04 16:44:33
    7-2 查单词所在页码 (10 分) 输入一组单词在字典中的页码。而后得出多个单词在字典中的页码分别是多少。 输入格式: 首先输入的是一组单词及其在字典中的页码。其中,第一行一个整数 N,表示字典中一共有多少单词(N≤...

    7-2 查单词所在页码 (10 分)

    输入一组单词在字典中的页码。而后得出多个单词在字典中的页码分别是多少。

    输入格式:
    首先输入的是一组单词及其在字典中的页码。其中,第一行一个整数 N,表示字典中一共有多少单词(N≤20000)。接下来每两行表示一个单词,其中: 两行中的第 1 行是一个长度≤100 的字符串,表示这个单词,全部字母小写,单词不会重复。两行中的第 2 行是一个整数,表示这个单词在字典中的页码。

    接下来输入的是要查询页码的单词。其中的第一行是一个整数 M,表示要查的单词数(M≤10000)。 接下来 M 行,每行一个字符串,表示要查的单词,保证在字典中存在。

    输出格式:
    M 行,每行一个整数,表示第 i 个单词在字典中的页数。

    输入样例:

    4
    cungneh
    19
    wyd
    17
    aqkj
    2
    olckomm
    15
    4
    wyd
    aqkj
    cungneh
    olckomm
    

    输出样例:

    17
    2
    19
    15
    

    代码如下:

    n=int(input())
    p=[]
    for i in range(n):
        m=input().split()
        s=input().split()
        m.extend(s)
        p.append(m)
    x=int(input())
    for j in range(x):
        l=input()
        for k in range(len(p)):
            if p[k][0]==l:
                print(p[k][1])
    
    展开全文
  • num = int(input())#输入页码 page = [0,0,0,0,0,0,0,0,0,0] for i in range(1,num+1): list1 = list(str(i)) page[0]+=list1.count('0') page[1]+=list1.count('1') page[2]+=list1.count('2') page[3]+=...
  • 主要介绍了Python Django 页面上展示固定的页码数实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • and some pages may not be numbered.) Instead, have a look at how extractText() actually does its job—PyPDF is written in Python, after all—and use it as a basis of a routine that checks each text ...

    At the moment I'm looking into doing some PDF merging with pyPdf, but sometimes the inputs are not in the right order, so I'm looking into scraping each page for its page number to determine the order it should go in (e.g. if someone split up a book into 20 10-page PDFs and I want to put them back together).

    I have two questions - 1.) I know that sometimes the page number is stored in the document data somewhere, as I've seen PDFs that render on Adobe as something like [1243] (10 of 150), but I've read documents of this sort into pyPDF and I can't find any information indicating the page number - where is this stored?

    2.) If avenue #1 isn't available, I think I could iterate through the objects on a given page to try to find a page number - likely it would be its own object that has a single number in it. However, I can't seem to find any clear way to determine the contents of objects. If I run:

    pdf.getPage(0).getContents()

    This usually either returns:

    {'/Filter': '/FlateDecode'}

    or it returns a list of IndirectObject(num, num) objects. I don't really know what to do with either of these and there's no real documentation on it as far as I can tell. Is anyone familiar with this kind of thing that could point me in the right direction?

    解决方案

    For full documentation, see Adobe's 978-page PDF Reference. :-)

    More specifically, the PDF file contains metadata that indicates how the PDF's physical pages are mapped to logical page numbers and how page numbers should be formatted. This is where you go for canonical results. Example 2 of this page shows how this looks in the PDF markup. You'll have to fish that out, parse it, and perform a mapping yourself.

    In PyPDF, to get at this information, try, as a starting point:

    pdf.trailer["/Root"]["/PageLabels"]["/Nums"]

    By the way, when you see an IndirectObject instance, you can call its getObject() method to retrieve the actual object being pointed to.

    Your alternative is, as you say, to check the text objects and try to figure out which is the page number. You could use extractText() of the page object for this, but you'll get one string back and have to try to fish out the page number from that. (And of course the page number might be Roman or alphabetic instead of numeric, and some pages may not be numbered.) Instead, have a look at how extractText() actually does its job—PyPDF is written in Python, after all—and use it as a basis of a routine that checks each text object on the page individually to see if it's like a page number. Be wary of TOC/index pages that have lots of page numbers on them!

    展开全文
  • # coding=utf-8 # jn10010537 import os
  • 页码分析-》正常显示分析 ...备注:可以明显看到有/list/3?...例子网站:https://cuiqingcai.com/category/technique/python 这个没有页码下一页情况,其实是存在的,只是被隐藏了 备注:将/page/2隐藏了 ...

    页码分析-》正常显示分析

    例子网站:https://blog.csdn.net/weixin_41665637/article/list/3?
    备注:可以明显看到有/list/3?

    在这里插入图片描述

    页码分析-》隐藏式分析

    例子网站:https://cuiqingcai.com/category/technique/python
    这个没有页码下一页情况,其实是存在的,只是被隐藏了
    备注:将/page/2隐藏了
    在这里插入图片描述

    一页有多少数据的查看办法

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 书的总页码放在文件中 统计每个数字出现的次数,统计结果放在文件中 ''' def main(): f = open('contents_num','r',encoding='UTF-8') n = int(f.read()) print("已读取到页码是{}".format(n)) f.close(...
  • 主要介绍了Python利用PyPDF2库获取PDF文件总页码实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • def count_num1(page_num):num_zero = 0num_one = 0num_two = 0num_three = 0num_four = 0num_five = 0num_six = 0num_seven = 0num_eight = 0num_nine = 0page_list = range(1,page_num + 1)for page in page_list:...
  • Python利用PyPDF2库获取PDF文件总页码

    千次阅读 2020-01-17 16:19:25
    Python中可以利用PyPDF2库来获取该pdf文件的总页码,可以根据下面的方法一步步进行下去: 1、首先,要安装PyPDF2库,利用以下命令即可: pip install PyPDF2 2、接着,就是直接编写代码了,其中我新建了一个py...
  • python爬虫(五)多页码

    千次阅读 2017-05-06 21:15:35
    from bs4 import BeautifulSoup import requests import timeurl = 'https://knewone.com/discover?page='def get_page(url,data=None): wb_data = requests.get(url) soup = BeautifulSoup(wb_data.text,'lxm
  • 如果是一本书,虽然有页码,但是封面、前言、目录、章节的封面很可能不会标上页码,而正文的页码和该pdf文件本身的页码对不上,如页面里的第1页会是pdf的第5页,页面的第2页是pdf的第6页……为了统一,我将页码...
  • Python处理Word文档,该文档除了标题之外是一个很长的表格,会随着填充内容长短变化自动换行。 试过docx库,没找到页码设置及页数统计,整个文档的sections=1,无法看出页数。试了w.ActiveDocument....
  • 使用vba代码/python更新word目录——只更新页码 工作中出现了如题的需求。实际上这个操作人工的话只需要右键区域→更新域→选择只更新页码然后确定就行了。不过工作需求就是得用代码去完成以上事情。 这个问题的主体...
  • 深度学习面试问题 回答对应的DeepLearning中文版页码
  • 推荐教材:《Python程序设计基础与应用》(ISBN:9787111606178),董付国,机械工业出版社图书详情:配套资源:用书教师可以联系董老师获取教学大纲、课件、源码、教案、考试系统等配套教学资源。公众号后台发送消息...
  • 推荐教材:《Python程序设计基础与应用》(ISBN:9787111606178),董付国,机械工业出版社图书详情:配套资源:用书教师可以联系董老师获取教学大纲、课件、源码、教案、考试...
  • ## 背景说明 最近参与了一个档案管理系统,使用java开发,部署在centos,其中的一个功能需要获取到word文件准确的页码,现在将尝试过的方法汇总如下:Apache POI由于系统是java开发的,所以首先尝试了poi,但是...
  • PrintOut()可实现整个word文档的打印,但实现不了指定页码范围(比如指定直打印1-2页,其余不打印)打印。在vba中,这个方法里面参数很多,照着vba写发写,似乎不起作用。请问如何实现指定页码范围的打印?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,205
精华内容 5,282
关键字:

python页码

python 订阅