質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4112閲覧

pythonプログラムにてword、excelをpdf化⇒結合作業を自動化したい

F91_

総合スコア16

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/10 03:20

##目指していることについて

・最終的に目指している形
①作成したexcel、wordをpdf⇒統合用ファルダに入れる
②プログラムを実行し、excel、wordがpdf状態で結合され、提出用フォルダに入る

・現状の作業(全てGUI作業)
①word、Excelファイルを開く
②pdfにエクスポートする
③googleの結合アプリを使用してpdfを探し、ファイルを選び、結合
⑤pdf名の変更
⑥提出用フォルダにpdfを移動
現状は非常に手間がかかっています。

上記を検討していますが、プログラムを作成中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

AttributeError Traceback (most recent call last) <ipython-input-1-13796146faf9> in <module> 82 elif file_p.suffix == '.docx': 83 file_pdf = file1.joinpath(f.replace(file_p.suffix, '.pdf')) ---> 84 WDtoPDF(str(file_p), str(file_pdf)) 85 pdfs.append(str(file_pdf)) 86 <ipython-input-1-13796146faf9> in WDtoPDF(in_wd, out_wd, formatType) 9 #wordをpdfに変換する 10 def WDtoPDF(in_wd, out_wd, formatType = 17): ---> 11 word = comtypes.client.CreateObject('Word.Application') 12 word.Visible = False 13 doc = word.Documents.Open(in_wd) ~\anaconda3\lib\site-packages\comtypes\client\__init__.py in CreateObject(progid, clsctx, machine, interface, dynamic, pServerInfo) 248 if dynamic: 249 return comtypes.client.dynamic.Dispatch(obj) --> 250 return _manage(obj, clsid, interface=interface) 251 252 def CoGetObject(displayname, interface=None, dynamic=False): ~\anaconda3\lib\site-packages\comtypes\client\__init__.py in _manage(obj, clsid, interface) 186 obj.__dict__['__clsid'] = str(clsid) 187 if interface is None: --> 188 obj = GetBestInterface(obj) 189 return obj 190 ~\anaconda3\lib\site-packages\comtypes\client\__init__.py in GetBestInterface(punk) 110 mod = GetModule(tlib) 111 # Python interface class --> 112 interface = getattr(mod, itf_name) 113 logger.debug("Implements default interface from typeinfo %s", interface) 114 # QI for this interface AttributeError: module 'comtypes.gen.Word' has no attribute '_Application'

該当のソースコード

こちらを参照しています
リンク内容

python

1#必要なものを宣言 2import os 3import comtypes.client 4import glob 5import pathlib 6import PyPDF2 7import shutil 8 9#wordをpdfに変換する 10def WDtoPDF(in_wd, out_wd, formatType = 17): 11 word = comtypes.client.CreateObject('Word.Application') 12 word.Visible = False 13 doc = word.Documents.Open(in_wd) 14 doc.SaveAs(out_wd, formatType) 15 doc.Close() 16 word.Quit() 17 18#powerpointをpdfに変換する 19def PPTtoPDF(in_ppt, out_ppt, formatType = 32): 20 powerpoint = comtypes.client.CreateObject("Powerpoint.Application") 21 #ここを1(Ture)にしないとなぜかエラーがでる 22 powerpoint.Visible = 1 23 doc = powerpoint.Presentations.Open(in_ppt) 24 doc.SaveAs(out_ppt, formatType) 25 doc.Close() 26 powerpoint.Quit() 27 28#excelをpdfに変換する 29def ELtoPDF(in_xlsx, out_xlsx): 30 excel = comtypes.client.CreateObject('Excel.Application') 31 excel.Visible = False 32 doc = excel.Workbooks.Open(in_xlsx) 33 doc.ExportAsFixedFormat(0, out_xlsx, 1, 0) 34 doc.Close() 35 excel.Quit() 36 37#pdfをまとめて1つにする 38def pdf_merger(out_pdf, pdfs): 39 merger = PyPDF2.PdfFileMerger() 40 41 for pdf in pdfs: 42 print(pdf) 43 merger.append(pdf) 44 45 merger.write(out_pdf) 46 merger.close() 47 48#結合するexcel,word,powerpoint,pdfがある場所 49file_path = r'C:/Users/yokoc/Desktop/新しいフォルダー' 50 51#変換したPDFファイル・結合したPDFファイルを入れるサブフォルダー 52sub_name = 'box' 53 54file0 = pathlib.Path(file_path) 55file1 = file0.joinpath(sub_name) 56 57#サブフォルダーを作成 58os.makedirs(file1, exist_ok=True) 59 60#もとのファイルがある場所に移動 61os.chdir(file_path) 62files = glob.glob('*') 63 64 65#excel,word,powerpointをpdfに変換し、名前の拡張子も.pdfに変更 66#変換したPDFのパスをリストに渡す 67pdfs = [] 68 69for f in files: 70 file_p = file0.joinpath(f) 71 72 if file_p.suffix == '.xlsx': 73 file_pdf = file1.joinpath(f.replace(file_p.suffix, '.pdf')) 74 ELtoPDF(str(file_p), str(file_pdf)) 75 pdfs.append(str(file_pdf)) 76 77 elif file_p.suffix == '.pptx': 78 file_pdf = file1.joinpath(f.replace(file_p.suffix, '.pdf')) 79 PPTtoPDF(str(file_p), str(file_pdf)) 80 pdfs.append(str(file_pdf)) 81 82 elif file_p.suffix == '.docx': 83 file_pdf = file1.joinpath(f.replace(file_p.suffix, '.pdf')) 84 WDtoPDF(str(file_p), str(file_pdf)) 85 pdfs.append(str(file_pdf)) 86 87 elif file_p.suffix == '.pdf': 88 shutil.copy('./'+ f, './'+ sub_name) #もともとPDFであるものはそのままコピー 89 file_pdf = file1.joinpath(f) 90 pdfs.append(str(file_pdf)) 91 else: 92 pass 93 94#結合したPDFに名前を付け、サブフォルダーに置く 95out_file = str(pathlib.Path(file1).joinpath('out.pdf')) 96#PDFの結合 97pdf_merger(out_file, pdfs)

###環境
Windows 10
Word 2016
Python 3.9.1
pip install comtypesでモジュールをインストール済み
jupyternotebookを使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

回答というよりも、単なる情報の提供になってしまうのですが。

プログラミングの質問サイト Stack Overflow に、2021年3月4日付けで全く同じエラーに関する質問が投稿されています。

回答が1件だけついています。
その回答によると、

「その問題はプログラムの問題でもなければライブラリの問題でもない。Windows レジストリにおいて COM 相互運用の設定に間違いがあるのが原因だ。
MS Office の複数のバージョンでテストしたところ、特定のバージョンで COM オブジェクトの呼び出しに問題があるようだ。
対策としては、問題のない MS Office のバージョンを使用するか、もしくは Office アプリケーションの修復を行ってくれ」

とのことです。

回答者のテストによると、この問題の生じた Office のバージョンは 2007 と 2013、問題の生じなかった Office のバージョンは 2010、2019、365 だそうです。

Office アプリケーションの修復については、マイクロソフトの公式サイトに、たとえば次のような記事があります。

この回答には質問者からの反応が何もなく、また他のユーザからの評価も一切ないため、この回答が正しいのかどうか、有効なのかどうかは、このサイトからは判断することができません。

投稿2021/10/10 16:45

etherbeg

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

F91_

2021/10/11 12:20

ありがとうございます。使用しているofficeに関して心当たりがありました。家庭のPCでプログラム作成しているのですが、会社のPCで試してみることにします。
F91_

2021/10/11 12:23

ちなみに以下のプログラムも試したのですが、PDF出力までいくのですが、PDF自体が破損していると表示されます。おそらくこれもofficeの問題かと思っています。 import sys import comtypes.client import glob import pathlib import PyPDF2 import time start = time.time() wdFormatPDF = 17 def convert(in_file, out_file): word = comtypes.client.CreateObject('Word.Application') doc = word.Documents.Open(in_file) doc.SaveAs(out_file, FileFormat=wdFormatPDF) doc.Close() word.Quit() def pdf_merger(out_pdf, pdfs): merger = PyPDF2.PdfFileMerger() for pdf in pdfs: print(pdf) merger.append(pdf) merger.write(out_pdf) merger.close() argvs = sys.argv arg_count = len(argvs) if arg_count > 1: file_path = argvs[1] else: file_path = 'C:/Users/yokoc/Desktop/文章のルール.docx' parent_folder = pathlib.Path(file_path).parent files = glob.glob(file_path) pdfs = [] for f in files: file_p = pathlib.Path(f) file_pdf = f.replace(file_p.suffix, '.pdf') pdfs.append(file_pdf) convert(f, file_pdf) out_file = str(pathlib.Path(parent_folder).joinpath('out.pdf')) pdf_merger(out_file, pdfs) process_time = time.time() - start print(f'Process time is : {process_time}')
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問