## 背景说明 最近参与了一个档案管理系统,使用java开发,部署在centos,其中的一个功能需要获取到word文件准确的页码,现在将尝试过的方法汇总如下:

Apache POI

由于系统是java开发的,所以首先尝试了poi,但是获取的页码不准确,所以这个方案放弃掉了。poi操作word的例子很多,这里就不上示例代码了。

C# Microsoft.Office.Interop.Word.Application

这种方法是能运行在windows上,直接上代码

public int GetWordPageCount(string filepath)

{

FileInfo f = new FileInfo(filepath);

if (!f.Exists)

{

System.Console.WriteLine("打开文件失败");

pageNum = -1;

return -1;

}

string file_name = f.Name;

string file_path = f.FullName;

int pageCount = 0;

Microsoft.Office.Interop.Word.Application app;

app = new Microsoft.Office.Interop.Word.Application();

app.Visible = false;

object missing = System.Reflection.Missing.Value;

object FileName = file_path;

Microsoft.Office.Interop.Word.Document doc = null;

try

{

doc = app.Documents.Open(ref FileName, ReadOnly: true);

Microsoft.Office.Interop.Word.WdStatistic stat = Microsoft.Office.Interop.Word.WdStatistic.wdStatisticPages;

pageCount = doc.ComputeStatistics(stat);//得到文档总页数 pageNum = pageCount;

doc.Close(Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges, ref missing);

app.Quit(Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges, ref missing, ref missing);

return pageCount;

}

catch (Exception ex)

{

app.Quit(Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges, ref missing, ref missing);

System.Console.WriteLine(ex.Message);

return -1;

}

}

这个方法需要使用做成dll,通过jni调用,将结果传给java。这个方法运行了一段时间后,运维反应还是有页数不对的,于是有了下一个方法。

Python oletools

上一个方法,由于C# Microsoft.Office.Interop.Word.Application只能在windows使用,所以还特意配了一台windows服务器,而使用oletools则可以运行在linux。 word文件本质上是一个ole文件,所以可以使用oletools工具包中的一个工具olemeta将信息读取到,meta是指word文件的元属性,如图

olemeta使用起来很简单,调用如下

olemeta E5D49CC1CB29E07F4825853D00379A50ZW.doc

结果如下:

遇到的例外

如果word中打开了阅读模式,如图,则olemeta获取的页码数是1

将文件另存为后,再次调用olemeta工具,就可以获取到正确的页码了。

Python zipfile xml.etree.ElementTree

docx格式不是一个ole格式文件,所以不能够使用ole工具。docx实质上是一个压缩包,如图所示:

其中,docProps/app.xml包含了页数属性,如图

所以可以使用zipfile解压并且使用xml.etree.ElementTree解析xml然后获取页数属性,代码如下:

#!/usr/bin/env python

import sys, os, optparse

import zipfile

import xml.etree.ElementTree as ET

def getPages(filename):

with zipfile.ZipFile('E:\\work\\local\\20200910Word\\t.docx') as docx:

tree = ET.XML(docx.read('docProps/app.xml'))

for child in tree:

if(child.tag.find('Pages') != -1):

print(child.text)

def main():

usage = 'usage: docx '

parser = optparse.OptionParser(usage=usage)

(options, args) = parser.parse_args()

# Print help if no arguments are passed

if len(args) == 0:

print(__doc__)

parser.print_help()

sys.exit()

for filename in args:

if filename.endswith('/'):

continue

getPages(filename)

if __name__ == '__main__':

main()

总结

实践中,使用了oletools,zipfile和c#三种方法,首先使用python分别获取到doc和docx的页数,如果获取的页数是1,则使用c#方法再次计算。

python获取word页数_用程序获取word页码方法汇总相关推荐

  1. python获取word页数_使用Python的word文档的页数(Number of pages of a word document with Python)...

    使用Python的word文档的页数(Number of pages of a word document with Python) 有没有办法用Python有效地获得word文档(.doc,.doc ...

  2. PHP能获取word页数吗,PHP快速将WORD文档转成PDF,PHP获得文档打印页数-让我来

    PHP快速将文档转成PDF并获取页数 孟德 1640 2020-04-26 去年有个功能是实现html转成pdf,这个功能解决办法在: 今年是打印小程序,用户问别人都能做到?你们怎么做不到?那不是难为 ...

  3. jqprint获取打印页数_高年级应用题40道,假期快给孩子打印练习吧!(含答案)...

    1.王爷爷家养的4头奶牛每个星期产奶896千克,平均1头奶牛每天产多少奶呢? 2.4辆汽车3次运水泥960袋,平均每辆汽车每次运水泥多少袋? 3.水波小学每间教室有3个窗户,每个窗户安装12块玻璃,9 ...

  4. jqprint获取打印页数_如何将每张打印多页PPT的PDF变成常规课件

    在工作和学习中,经常会收到各种 PDF 文件,尤其是老师的课件. 为了防止学生大量上传到各种文库网站赚积分,或者为了方便学生打印出来预习复习. 通常,会在每页 PDF 里面,打印多张 PPT 内容. ...

  5. 获取附近小区信息_小程序获取当前位置加搜索附近热门小区及商区的方法

    本文详细的介绍了小程序获取当前位置加搜索附近热门小区及商区的方法,分享给大家 两种方法:一种是腾讯地图获取,另一种是百度地图获取 我用的是腾讯地图获取步骤如下 1.话不多说,直接上干货 实现上图效果, ...

  6. 小程序获取城市行政区号_小程序获取用户手机号操作代码示例

    小程序获取手机号操作,获取微信用户绑定的手机号,需先调用wx.login接口.因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 组件的点击来触发,也就是用户主动点击按钮 ...

  7. python获取pdf页数_Python分割指定页数的pdf文件方法

    Python分割指定页数的pdf文件方法 如下所示: from PyPDF2 import PdfFileWriter, PdfFileReader # 开始页 start_page = 0 # 截止 ...

  8. js怎么获取访问页数记录(知道的能不能告诉我一下)

    这次老大布置了一个任务,但是我有几个地方不会,请大家帮一个忙吧.这个任务主要就是使用js获取:1.网站来源截取2.上网IP截取3.上网地址截取4.操作系统截取5.分辨率截取6.访问页数记录,但是我只能 ...

  9. python 统计pdf页数

    python 统计pdf页数 import os import PyPDF2 import sys, jm, traceback from PyQt5.QtWidgets import QApplic ...

最新文章

  1. React: 关于React通信方式
  2. springboot + ApplicationListener
  3. [Error]SyntaxError: unindent does not match any outer indentation level
  4. 李天平×××作诞生记——《亮剑.NET:.NET深入体验与实战精要》
  5. ubuntu14.04 在自带python2.7上安装python3.3.5 可以用但是有问题
  6. HDU-Keywords Search(AC自动机)
  7. C#读取 *.exe.config
  8. indesign教程,如何在文档中导航页面?
  9. ArcGIS Runtime SDK for Android 加载shp数据,中文乱码问题
  10. 对测试开发工程师的理解
  11. Google 因果推断的CausalImpact 贝叶斯结构时间序列模型(二十二)
  12. Steam如何打开控制台
  13. springboot hikari数据库连接池死链 出现异常
  14. JavaScript基础Date函数
  15. linux 深度定制,基于ubuntu发行版的安装界面的深度定制过程
  16. wireshark 安装与使用
  17. 计算机与昆虫关系的论文,浅谈昆虫与人类的关系.doc
  18. Windows小技巧 -- 命令行窗口打开指定目录的资源管理器
  19. 万亿数字化市场,数据科学为何能扛起“价值担当”?
  20. 练手之经典病毒熊猫烧香分析(上)

热门文章

  1. PVE下的黑群晖的其他后续设置
  2. 初学SLAM二之BA当中的数学知识点
  3. MapReduce当中的计数器
  4. C# 获取笔记本电池信息 调用 Win32 Api
  5. FiveThirtyEight Comic Characters Dataset(五分之八漫画人物数据集)
  6. 电梯广告框尺寸批发供应|电梯相框广告规格
  7. MarkDown图床助手: 截图-传图-生成url 一步到位
  8. 2011年第36届大连赛区现场赛Board
  9. Linux 服务器安装、配置和维护,一文看全~
  10. 不会聊天的程序员,如何开发聊天机器人