python操作word、pdf函数大全(持续更新)

采用的是Django,所以主函数是test(),也可以把函数但是拿出来放到脚本中运行,无任何影响!自行下载相关库!

# -*-coding:utf-8-*-
from django.http import HttpResponse
import docx
import win32com.client as win32
from PyPDF2 import PdfFileWriter, PdfFileReader, PdfFileMerger
from win32com.client import constants, gencache
import pythoncom


#word转pdf  支持doc和docx转pdf
def wordToPdf(wordPath, pdfPath):
    pythoncom.CoInitialize()
    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)
    pythoncom.CoUninitialize()


# 将Word文件写入到另一个文件中
'''
   files为word文件的数组,里面包含多个word文件
        合并的时候是将以第一个文件为模板进行合并内容的合并,
    即是只是内容的追加,不同的word文件之间并不换页。
   savefile为合并后保存的文件

   其中:files中的部分文件和 savefile文件均可为docx或doc格式的文件
'''


def addWord(files, savefile):
    pythoncom.CoInitialize()
    word = win32.gencache.EnsureDispatch('Word.Application')  # 启动word对象应用
    word.Visible = False
    output = word.Documents.Add()  # 新建合并后的文档
    for file in files:
        output.Application.Selection.InsertFile(file)  # 拼接文档
    doc = output.Range(output.Content.Start, output.Content.End)  # 获取合并后文档的内容
    output.SaveAs(savefile)  # 保存
    output.Close()
    pythoncom.CoUninitialize()


# 删除首页
'''
删除第一页的内容,由于会删除第二页的第一行文字,所以要补上
'''


def delWordPageFirst(file1, file2):
    doc = docx.Document(file1)
    doc.paragraphs[1].clear()
    doc.paragraphs[1].text = '目录'
    doc.save(file2)


# 分割pdf  截取文件中间的指定单个页数
def splitPdfsMiddleOnly(filename, resultname, page):
    output = PdfFileWriter()
    f = open(filename, "rb")
    pdf_file = PdfFileReader(f)
    for i in range(page - 1, page):
        output.addPage(pdf_file.getPage(i))
    outputStream = open(resultname, "wb")
    output.write(outputStream)
    f.close()


# 分割pdf  截取文件中间的指定页数
def splitPdfsMiddleMore(filename, resultname, start, end):
    output = PdfFileWriter()
    f = open(filename, "rb")
    pdf_file = PdfFileReader(f)
    for i in range(start - 1, end):
        output.addPage(pdf_file.getPage(i))
    outputStream = open(resultname, "wb")
    output.write(outputStream)
    f.close()


# 拆分pdf page开始后几页(包含page)
def splitPdfLast(filename, resultname, page):
    output = PdfFileWriter()
    f = open(filename, "rb")
    pdf_file = PdfFileReader(f)
    pdf_pages_len = pdf_file.getNumPages()  # 总页数
    for i in range(page - 1, pdf_pages_len):
        output.addPage(pdf_file.getPage(i))
    outputStream = open(resultname, "wb")
    output.write(outputStream)
    f.close()

# 合并pdf文档
def mergePdf(pdfs, rePdf):
    merger = PdfFileMerger()  # 创建一个合并的对象
    input = []   # 定义数组,用来保存打开的文件
    for i in range(0, len(pdfs)):
        f = open(pdfs[i], 'rb')
        input.append(f)  # 打开的文件保存到数组中
        merger.append(fileobj=f)
    output = open(rePdf, 'wb')  # 保存硬盘上
    merger.write(output)  # 写入到硬盘上
    output.close()  # 关闭文件句柄
    for j in input:
        j.close()  # 遍历关闭打开的文件


def test(request):
    # 路径要写成 \\  不然可能提示找不到文件
    p = 'H:\\program_w\\code\\python\\django\\file\\'
    rp = r'H:\\program_w\\code\\python\\django\\file\\'  # 只读路径,如果word文件合并的时候出错,就用这个

    fModelData = [p + "model.docx", p + "olddata.doc"] # 原来的只有两个文件!
    
    tempWord = p + "temp.docx"  # 写入模板的临时word文档
    tempWordDel = p + "tempdel.docx"  # 删除首页的临时word文件
    tempPdfDel = p + "tempdel.pdf"  # 删除首页的临时pdf文件
    tempPdfmid1 = p + "tempmid1.pdf"  # 截取中间单页
    tempPdfmid2 = p + "tempmid2.pdf"  # 截取中间多页
    tempPdfmid3 = p + "tempmid3.pdf"  # 截取最后几页
    rePdfMore = [tempPdfmid1, tempPdfmid2, tempPdfmid3]  # 需要合并的pdf文档
    rePdf = p + "result.pdf"  # 最终结果
    addWord(fModelData, tempWord)  # 写入模板
    delWordPageFirst(tempWord, tempWordDel)  # 删除首页测试
    wordToPdf(tempWordDel, tempPdfDel)  # Word转换为PDF
    splitPdfsMiddleOnly(tempPdfDel, tempPdfmid1, 2)  # 截取中间的一页码
    splitPdfsMiddleMore(tempPdfDel, tempPdfmid2, 2, 4)  # 截取中间多页
    splitPdfLast(tempPdfDel, tempPdfmid3, 10)  # 截取最后几页
    mergePdf(rePdfMore, rePdf)  # 合并pdf文档
    return HttpResponse(rePdf)

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值