Как конвертировать из docx в pdf с помощью функции python (WINDOWS)? - PullRequest
0 голосов
/ 18 февраля 2019

Я работаю над env с функцией python для преобразования docx в pdf файлы.Я использую почтальон для отправки base64.Затем я монтирую файл docx (пока что все работает), но когда он конвертирует файл docx в pdf, появляется ошибка.Я думаю, это потому, что у меня нет Office на моем env?Как я могу это исправить, не имея офиса?Спасибо.

import sys
import os
import comtypes.client
import pythoncom
import uuid
import requests
from docx import Document
import base64
from os import listdir
from os.path import isfile, join
import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:
  bytesDoc = req.get_json()['base']

  path = '/users/echornet/pruebas/'
  newFile = open(path + 'prueba.docx','wb')
  newFile.write(base64.b64decode(bytesDoc))

  newFile.close()
  wdFormatPDF = 17

  out_file = path + 'prueba.pdf'
  word = comtypes.client.CreateObject('Word.Application')

  doc = word.Documents.Open(newFile)
  doc.SaveAs(out_file, FileFormat=wdFormatPDF)
  doc.Close()

Это ошибка, которую я получаю.Я получаю docx, созданный из base64, но без преобразования.

System.Private.CoreLib: Исключительная ситуация при выполнении функции: Functions.FunConverter.System.Private.CoreLib: Результат: Сбой Исключение: AttributeError: модуль 'comtypes.gen.Word' не имеет атрибута '_Application' Стек: Файл 'C: \ PruebaFunction \ ConvEnv \ lib \ site-packages \ azure \ functions_worker \ dispatcher.py ", строка 288, в _handle__invocation_request self. run_sync_func, invocation_id, fi.func, args) Файл" C: \ Users \ echornet \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ concurrent \ futures \ thread.py ", строка 55, в результате выполнения = self.fn (* self.args, ** self.kwargs) Файл" C: \ PruebaFunction \ ConvEnv \ lib \ site-packages \ azure \ functions_worker \ dispatcher.py ", строка347, в __run_sync_func вернуть func (** params) Файл "C: \ PruebaFunction \ FunConverter__init .py", строка 32, в главном файле word = comtypes.client.CreateObject ('Word.Application') "C: \PruebaFunction \ ConvEnv \ lib \ site-packages \ comtypes \ client__init __. Py ", строка 250, в CreateObject возвращает _manage (obj, clsid, interface = interface) Файл" C: \ PruebaFunction \ ConvEnv \ lib \ site-packages \ comtypes \ "client__init__.py ", строка 188, в _manage obj= GetBestInterface (obj) Файл "C: \ PruebaFunction \ ConvEnv \ lib \ site-packages \ comtypes \ client__init __. Py", строка 112, в интерфейсе GetBestInterface = getattr (mod, itf_name)

1 Ответ

0 голосов
/ 18 февраля 2019

Вы можете попробовать lib win32com, чтобы закончить это

# -*- encoding: utf-8 -*-
import  os
from win32com import client
#pip instatll win32com
def doc2pdf(doc_name, pdf_name):
    """
    :word to pdf
    :param doc_name word file name
    :param pdf_name to_pdf file name
    """
    try:
        word = client.DispatchEx("Word.Application")
        if os.path.exists(pdf_name):
            os.remove(pdf_name)
        worddoc = word.Documents.Open(doc_name,ReadOnly = 1)
        worddoc.SaveAs(pdf_name, FileFormat = 17)
        worddoc.Close()
        return pdf_name
    except:
        return 1
if __name__=='__main__':
    doc_name = "f:/test.doc"
    ftp_name = "f:/test.pdf"
    doc2pdf(doc_name, ftp_name)
...