分类 其它 下的文章

原理

使用python win32 库 调用word底层vba,将word转成pdf

安装pywin32

pip install pywin32 

python代码

from win32com.client import gencache
from win32com.client import constants, gencache

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)

安装

pip insatll Pyinstaller

参数

pyinstaller -Fw main.py
参数 概述
-F,-onefile 打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用
-D, –onedir 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护
-K, –tk 在部署时包含 TCL/TK
-a, –ascii 不包含编码.在支持Unicode的python版本上默认包含所有的编码.
-d, –debug 产生debug版本的可执行文件
-w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
-s,–strip 可执行文件和共享库将run through strip.注意Cygwin的strip往往使普通的win32 Dll无法使用.
-X, –upx 如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)(参见note)
-o DIR, –out=DIR 指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录.如果没有指定,而当前目录不是PyInstaller的根目录,则会输出到当前的目录下.
-p DIR, –path=DIR 设置导入路径(和使用PYTHONPATH效果相似).可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录.也可以使用多个-p参数来设置多个导入路径,让pyinstaller自己去找程序需要的资源
–icon=<FILE.ICO> 将file.ico添加为可执行文件的资源(只对Windows系统有效),改变程序的图标 pyinstaller -i ico路径 xxxxx.py
-v FILE, –version=FILE 将verfile作为可执行文件的版本资源(只对Windows系统有效)
-n NAME, –name=NAME 可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字

注意事项

  • 如果程序有采用外部文件,如配置文件, 需要将文件放在dist中
  • -F 适合生成一个单一可执行的文件
  • -o 适用于多个文件引用情况,或者框架的结构

打包进程相关代码失败

例如编写一些进程相关的shell命令,打包失败,一般是使用 -F 可以成功,但是执行exe时有cmd弹窗,这非常不美观, 如果使用-Fw c参数执行exe 直接失败。 这种情况有两种解决方案。

方案一: 使用 pyinstaller -Dw file.py 生成的是一个目录文件。 程序执行成功,无黑名终端弹窗情况。

方案二: 起用 os.popen() 方法, 改用subprocess.Popen() 模块

​ 下面是我的测试,亲测成功, 参数一定要配置好,否则程序执行失败!

import subprocess
def checkprocess():
    processnames = ['EXCEL.EXE']
    for processname in processnames:
        p = subprocess.Popen('taskkill /F /IM %s' %processname,shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
        p.wait()
checkprocess()

有空写一个 关于subprocess的教程,详细研究一下他的参数配置

决定把我的渣机脱坑

一、制作启动盘

  1. 官方下载ubuntu18.04LTS iso文件
    [ubuntu官方链接](https://www.ubuntu.com/download/desktop
  2. UltraISO制作启动文件(采用试用)
    UltraISO官方链接
  3. 打开UltraISO
  4. 打开文件选择iso文件
  5. 选择 启动 =》 写入硬盘映像
    在这里插入图片描述
  6. 点击便捷启动
    在这里插入图片描述

接着选择 便捷式启动=》Sysliunx=》写入新的驱动扇区=》sysliunx
在这里插入图片描述

  1. 接下来选择 =》写入
    注意 写入方式最好选择USB-HDD 兼容性比较好

u盘制作完成

二、bios设置

  1. 一般电脑设置为快速启动无法进入bios设置,需要在关闭快速启动, 电源选项=》系统设置 =》关闭快速启动
    在这里插入图片描述

  2. 插入启动盘,开机 出现画面 =》长按F2 到bios设置

  3. bios设置
    Boot =》Lunch CSM=》设置为 enable,
    Security=》secure boot control-=》设置为disable
    Boot =》 将Boot Option #1 选择为 =》 UEFI 的启动盘
    然后按 F10 保存退出
    等待重启

  4. 之前被坑,我的不需要编辑,直接install就ok选择 install Ubuntu =》按e键进入编辑模式选择 install Ubuntu =》按e键进入编辑模式
    在 linux这行 找到quiet splash,在后面空格接着输入 $vt_handoff acpi_osi=linux nomodeset

  5. 按F10 等待安装

  6. 选择语言 键盘布局语言

  7. 无线选择

  8. 更新和其他软件 (网不好就选正常安装吧,其他选项默认,勾选了其他的可能要等一会,系统在下载文件)

  9. 安装类型=》 根据自己的实际需求

  10. 选择地区 =》shanghai (直接鼠标选择中国区域)

  11. 如果有分盘需求选择其他选项
    =》【手打超链接,后续补上】

  12. 用户配置

  13. 等待安装

其他配置链接:
后续更新!

如有问题请评论区留言 第几步骤!

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就好了

附vba官方中文文档https://docs.microsoft.com/zh-cn/office/vba/api/
之前的思路]https://mp.csdn.net/mdeditor/87099782#

python字符串replace替换无效

背景

今天想把一个列表中符合条件的元素中 替换部分字符串, 发现怎么替换,改元素还是没有改变,本以为是内存引用的问题后来发现并不然。

经查阅解决

在Python中字符串是immutable对象,是不可变对象。

所以string使用replace需要重新赋值,生成一个新的对象。

str_a = 'hello world'
#replace 其实创建了新的字符串对象,需要重新引用这个字符串
str_a = str_a.replace('*****')

之前没有重新引用,导致该变量 指向的是 以前的对象,实则已经发生变化,只是没有重新引用而已。