Python/Djangoはdoc文書およびIIS 8を読み取る.5の導入で経験した波乱と解決プロセス


Tips(主な問題):
  • doc回転docx
  • 「無効なクラスの文字列」
  • DCOMコンポーネントアクセス拒否
  • NoneType has no attribute SaveAs

  • 簡単な業務過程:Wordドキュメント(.doc,.docxではない)をサーバにアップロードし(IIS+Django+wfastcgiで配置)、ドキュメントの内容と画像情報を読み取る.すなわち、この過程でdocドキュメントをdocxのフォーマットとして保存してから、このdocxのドキュメントを読み取る必要があります(docドキュメントを直接読み取る方法は見つかりません).第2のステップは、docxがオープンな標準であるため、python-docxライブラリで実現できます.必要なのは、APIを熟知するのに時間がかかるだけです.ここではdocドキュメントをdocxとして保存するピットプロセスに重点を置いています(ファイル拡張子を直接変更することはできません.使用できません.そうしないと早いです...):1、win 32 comの使い方参考:https://www.cnblogs.com/Jacklovely/p/5743868.htmlこの方法はComコンポーネントによってWordをロードすることである.Application:
    from win32com import client as wc #    
    
    pythoncom.CoInitialize()
    word = wc.Dispatch('Word.Application')
    #word = wc.Dispatch('kwps.Application') #  WPS       
    doc = word.Documents.Open(filepath)  #      doc  ,(       )
    doc.SaveAs(filepath+'x', 12)  #          ,12  docx  
    doc.Close()
    word.Quit()

    ピットプロセス:
  • ローカルの開発モデルはすべて正常であるが、サーバIIS 8に配備されている.5で質問が来て、「無効なクラスの文字列」と報告します.理由:Office/Wordがインストールされていません..
  • はofficeが大きすぎて有料だし(サーバーに海賊版が入っているのは何となく違う)、しかも「名前を付けて保存」が欲しいだけなので、無料のWPSを入れて、コードのサービス名を「kwps」に変えた.Application’ですが、同じ間違いです(Wordと同じように、ローカル開発モデルは正常です).
  • 仕方がないので、次の試用版のOfficeで測ってみましょう.インストール後に実行するのは間違いありませんが、「アクセス拒否」を報告し、システムログに「XXXはCLSIDに対して{000209 FF-00000-00000-C 00000-00000-00000-00000,046}使用できないCOMサーバアプリケーションのローカルアクティブ化権限を付与します.このセキュリティ権限はコンポーネントサービス管理ツールを使用して変更できます.」すなわち、ユーザー権限の問題です.また、コンポーネントサービス-->「DCOM構成」の下のWORD権限を変更する資料をたくさん調べます.参考資料:http://blog.163.com/xiangyue119@126/blog/static/1651455322009242214739/
  • 上記の構成が完了した後、「NoneType has no attribute SaveAs」のエラーを報告します.つまりWord.Applicationは見つかったようですが、正しく作成されていません.そのため、上のコードは使えません.引き続き資料を探して、最後にやっと解決しました:
  • 2、LibreOfficeプログラムを使用するsoffice.exeコマンドPS:LibreOffice公式サイトにダウンロードしてもOpenOfficeで、ファイルも大きくなく、インタフェースが使いにくいです.参照先:https://www.cnblogs.com/vamei/archive/2012/09/23/2698014.html幸いなことに、オープンソースには多くの良いものがあり、インストール(パスにスペースと中国語がないことをお勧めします.意外を避けるために)し、Python/Djangoプログラムで以下の方法で呼び出します.
    import subprocess
    
    #  LibreOffice  soffice  
    #shell=True        ,      cmd  ,         
    #         、    、       
    subprocess.call(['C:/LibreOffice5/program/soffice.exe', '--headless', '--convert-to', 'docx', phyFilepath,'--outdir', os.path.split(phyFilepath)[0]], shell=True)

    やっと解決し、Office/WPSをアンインストールできるようになりました.後ろにpandocのライブラリが見えますが、doc to docxのdemoは見えず、試していないので、使えるかどうか分かりません.
    PS:docxドキュメントの情報と画像などを読み、参考にすることができる:https://www.cnblogs.com/zhanghongfeng/p/7043412.html