質問: swfファイルをpdfにバッチ印刷する方法は? 私はwindows7x64を使用しています。adobe acrobatをインストールしたので、仮想pdfプリンターがあります。adobeflashplayerもシステムにインストールしました。フラッシュプレーヤーを使用してswfファイルを開き、フラッシュプレーヤーからファイルをpdfに印刷できます。swfファイルのフォルダに対してこのプロセスを繰り返すことは可能かと思います。「印刷」プロセス中に、pdfプリンターがファイル名を要求します。これは、swfファイルのファイル名を使用します。これも自動化できることを願っています。ありがとう!
回答: 以下は、pywinautoを使用した私の貢献です。私はインターネットエクスプローラーをブラウザーとして使用しました(したがって、インターネットエクスプローラーをswfファイルのデフォルトプログラムとして設定しました)。また、adobeacrobatを使用して印刷しました。 (印刷ダイアログのハンドルはほとんどのプログラムで似ているようですが、問題はないかもしれません)。 adobeを使用していたため、印刷ダイアログのハンドルをから変更する必要がありました。window.ok.click to window.print.click(61行目)また、以下の行(43行目)の値を変更する必要がある場合もあります。あなたの画面の解像度は私のものとは異なるかもしれないので。browser_tab.click_input(coords =(1440、2060))うまく説明されていない場合、またpythonであるため、お詫びします。以下のコードでインデントが正しいかどうかを確認してください。 import sys import re import os import warnings import webbrowser from time import sleep import pywinauto as pwa from pywinauto.application import application from pywinauto.keyboard import sendkeys def sendkey_escape(string): """escape `+ ^ % ~ { } ] ( )` by putting them within curly braces. refer to sendkeys' documentation for more info: * https://github.com/zvodd/sendkeys-py-si/blob/master/doc/sendkeys.txt (could not open the original site: rutherfurd.net/python/sendkeys/ ) """ return re.sub(r'([+^%~{}\[\', r'{\1}', string) warnings.filterwarnings( 'once', message=r'.*64-bit application should.*', category=userwarning ) filenames = os.listdir(os.getcwd()) app = application() for filename in filenames: #pwa.timings.timings.slow() if not filename.endswith('.swf'): continue pdfname = filename[:-3] + 'pdf' if pdfname in filenames: # already there! continue # assume the default application to open swf files is browser_tab. webbrowser.open(filename) sleep(2) app.connect(title_re='.*explorer', class_name='ieframe') browser_tab = app.ieframe browser_tab.wait('active') browser_tab.set_focus() #below to enable activex controls browser_tab.click_input(coords=(1440, 2060)) sleep(2) browser_tab.right_click_input(coords=(500, 500)) # click "print" from the rightclick menu. browser_tab.click_input(coords=(540, 645)) pwa.timings.wait_until_passes( 20, 0.5, browser_tab[u'print'].exists, pwa.findwindows.windownotfounderror ) app2 = application().connect(title=u'print') pwa.timings.timings.defaults() window = app2.print window.wait('ready') button = window.print button.click() pwa.timings.wait_until_passes( 20, 0.5, browser_tab[u'save pdf file as'].exists, pwa.findwindows.windownotfounderror ) app3 = application().connect(title=u'save pdf file as', class_name='#32770') window = app3.dialog combobox = window[u'4'] combobox.set_focus().type_keys(sendkey_escape(os.getcwd() + '\\' + pdfname), with_spaces=true) window.save.click() pwa.timings.wait_until_passes( 20, 0.5, app[u'creating adobe pdf'].exists, pwa.findwindows.windownotfounderror ) app4 = app.connect(title=u'creating adobe pdf', class_name='#32770') window3 = app4.dialog window3.wait_not('active',20,1) browser_tab.close() swapyを使用して、各ウィンドウのコントロール識別子を取得しました。ただし、swapyは古いコードを使用しているため(それでも非常に便利です)、現在のバージョンのpywinautoを反映してサポートするようにコードを更新しました(少なくとも私にとっては)。調べてみると、関数呼び出しはほとんど同じですが、キャメルケースからアンダースコアケースに変換されているだけです。