"""
Microsoft Word (docx) ドキュメントをPDF形式に変換するためのユーティリティスクリプトです。
このモジュールは、`comtypes.client` ライブラリを使用してWordアプリケーションのCOMオブジェクトを操作し、
指定されたWordファイルをPDFに変換する機能を提供します。
関連リンク:
:doc:`docx2pdf_usage`
"""
import os
try:
import comtypes.client
except Exception:
print("\ndocx2pdf.py: Import error: comtypes.client")
input("Install: pip install comtypes\n")
[ドキュメント]
def docx_to_pdf(input_path: str, output_path: str = None) -> str:
"""
指定されたWord (docx) ファイルをPDF形式に変換します。
この関数は、Microsoft WordアプリケーションのCOMオブジェクトを利用して、
Wordドキュメントをバックグラウンドで開き、PDF形式で保存します。
出力パスが指定されない場合、入力ファイルと同じディレクトリにファイル名を引き継ぎ
拡張子を.pdfとしたパスが自動生成されます。
変換中にエラーが発生した場合は、Wordドキュメントを安全に閉じ、エラーメッセージを表示してNoneを返します。
:param input_path: str: 変換するWordファイル(.docx)のパス。
:param output_path: Optional[str]: 生成されるPDFファイルの出力パス。Noneの場合、
入力ファイルと同じディレクトリにファイル名を引き継ぎ
拡張子を.pdfとしたパスが自動生成されます。
:returns: Optional[str]: 変換に成功した場合は生成されたPDFファイルの絶対パス、失敗した場合はNoneを返します。
"""
word = comtypes.client.CreateObject("Word.Application")
word.Visible = 0
wdFormatPDF = 17
input_path = os.path.abspath(input_path)
if output_path is None:
output_path = os.path.splitext(input_path)[0] + ".pdf"
else:
output_path = os.path.abspath(output_path)
print(f" Converting '{os.path.basename(input_path)}' to PDF...")
doc = None
try:
doc = word.Documents.Open(
input_path,
ConfirmConversions=False,
ReadOnly=True,
AddToRecentFiles=False,
)
doc.SaveAs(output_path, FileFormat=wdFormatPDF)
doc.Close()
print(f" Successfully converted to PDF: '{output_path}'")
return output_path
except Exception as e:
print(f" Error converting '{input_path}' to PDF: {e}")
if doc is not None:
try:
doc.Close(False)
except Exception:
pass
return None
finally:
word.Quit()
if __name__ == "__main__":
import sys
input_path = sys.argv[1] if len(sys.argv) > 1 else None
output_path = sys.argv[2] if len(sys.argv) > 2 else None
if not input_path:
print("Usage: python docx2pdf.py input.docx [output.pdf]")
input("\nPress ENTER to terminate>>\n")
raise SystemExit(1)
docx_to_pdf(input_path, output_path)
print("\nProgram execution completed.")
input("\nPress ENTER to terminate>>\n")