Wie drucke ich SWF-Dateien im PDF-Format?

5736
Chen Stats Yu

Ich verwende Windows 7 X64.

Ich habe Adobe Acrobat installiert, so dass ich einen virtuellen PDF-Drucker habe. Ich habe auch den Adobe Flash Player auf dem System installiert.

Ich öffne die SWF-Datei mit dem Flash Player, und vom Flash Player aus kann ich die Datei als PDF drucken.

Ich frage mich, ob es möglich ist, den Vorgang für einen Ordner mit SWF-Dateien zu wiederholen.

Während des Druckvorgangs fragt der PDF-Drucker nach einem Dateinamen, den ich aus der SWF-Datei verwenden möchte. Ich hoffe, dass dies auch automatisiert werden kann.

Vielen Dank!

3

3 Antworten auf die Frage

3
Samuel Thompson

Im Folgenden wird mein Beitrag auch mit Pywinauto verwendet.

Ich habe den Internet Explorer als Browser verwendet (also Internet Explorer als Standardprogramm für SWF-Dateien festgelegt), da ich die SWF-Dateien am schnellsten laden konnte (ich weiß ... komisch richtig).

Ich habe auch Adobe Acrobat zum Drucken verwendet. (Es scheint, dass das Druckdialogfeld für die meisten Programme ähnlich ist, so dass Sie möglicherweise keine Probleme haben). Da ich Adobe verwendet habe, musste ich den Griff des Druckdialogs von ändern

window.OK.click auf window.Print.click (in Zeile 61)

Möglicherweise müssen Sie auch die Werte für die untere Zeile (Zeile 43) ändern. Ihre Bildschirmauflösung kann sich von meiner unterscheiden.

browser_tab.click_input (coords = (1440, 2060))

Entschuldigung, wenn es nicht gut erklärt wird, auch weil es Python ist. Bitte überprüfen Sie, ob die Einrückung im folgenden Code korrekt ist.

 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() 

Ich habe SWAPY verwendet, um die Steuerungskennungen der einzelnen Fenster zu ermitteln. SWAPY verwendet jedoch alten Code (immer noch sehr nützlich). Daher habe ich den Code aktualisiert, um die aktuelle Version von pywinauto zu berücksichtigen und zu unterstützen (zumindest für mich). Wenn Sie nachschlagen, sind die Funktionsaufrufe weitgehend gleich, sie werden jedoch nur von camelcase in Underscore_case konvertiert.

2
AXO

Ich habe das Gleiche gesucht. Nun, ich konnte auch keine spezifische Bibliothek für diesen Job finden. Zumindest können wir diesen Prozess mit GUI-Automatisierungstools automatisieren.

Für diesen Job gibt es viele Bibliotheken und Standalone-Anwendungen. Eine, die mir vielversprechend erscheint, ist Autoit .

Als Python-Fan fand ich diese erstaunliche Bibliothek namens pywinauto und schrieb das folgende Skript zum Konvertieren meiner SWF-Dateien:

"""Convert all swf files in this directory to a pdf file using Firefox.  Note that some parameters in this script need to be adjusted according to user's printer setup, screen resolution, etc.  Documentation of pywinauto: * https://pywinauto.github.io/docs/contents.html An example script using pywinauto: * https://github.com/vsajip/pywinauto/blob/master/examples/SaveFromFirefox.py """   import re import os import warnings import webbrowser from time import sleep from functools import partial  import pywinauto as pwa from pywinauto.application import Application   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)   # Using 32-bit python on 64-bit machine? Will get the following warning a lot: # "UserWarning: 64-bit application should be automated using 64-bit Python # (you use 32-bit Python)" # Limit this warnings to only show once. # The following line does not work as expected. See # github.com/pywinauto/pywinauto/issues/125 warnings.filterwarnings( 'once', message=r'.*64-bit application should.*', category=UserWarning ) # Assume Firefox is already open. app = Application().connect(title_re=".*Firefox") firefox = app.MozillaFireFox.GeckoFPSandboxChildWindow filenames = os.listdir() for filename in filenames: 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 Firefox. webbrowser.open(filename) firefox.SetFocus() firefox.Wait('exists ready', timeout=5) firefox.RightClickInput(coords=(200, 200)) firefox.Wait('ready', timeout=10) # Click "print" from the rightclick menu. firefox.ClickInput(coords=(210, 320)) pwa.timings.WaitUntilPasses( timeout=10, retry_interval=1, func=partial(app.Connect, title='Print'), exceptions=pwa.findwindows.WindowNotFoundError, ) app.Print.Wait('ready active', 5) # The printing process depends on the default printer being used. app.Print.OK.Click() app.Print.WaitNot('exists', timeout=5) pwa.timings.WaitUntilPasses( timeout=10, retry_interval=1, func=partial(app.Connect, title='Save As'), exceptions=pwa.findwindows.WindowNotFoundError, ) # Be wary that some characters such as "%" don't work correctly in Save As # dialogs. This code does not handle such awkwardness of MS Windows. app.SaveAS.ComboBox.SetFocus().TypeKeys( sendkey_escape(os.getcwd() + '\\' + pdfname), with_spaces=True ) app.SaveAS.Save.Click() firefox.Wait('exists ready', timeout=5) # Focuse is lost to flash (bugzilla: 78414). Use mouse to close the tab. firefox.ClickInput(coords=(418, 16), absolute=True) firefox.WaitNot("exists", timeout=5) 

Diese Methode hat ihre eigenen Einschränkungen. Beispielsweise können Sie Ihren Computer während des Konvertierungsvorgangs nicht verwenden, da Maus und Tastatur vom Skript gesteuert werden. Das Skript muss für einzelne Computer angepasst werden. Außerdem soll der GUI-Steuerungsprozess viel langsamer sein als eine CLI-Anwendung, die für dieselbe Aufgabe entwickelt wurde. Dies ist jedoch noch viel einfacher und schneller als die manuelle Konvertierung.

PS: Ich kann nicht umhin, Sikuli zu erwähnen . Eine weitere erstaunliche Python-Bibliothek für die GUI-Automatisierung.

Aktualisieren

Das oben beschriebene Verfahren erzeugt Vektorgrafiken, aber wenn jemand interessiert gerasterten PNG - Dateien (was leicht zu PDF konvertiert werden kann frei verfügbare Tools verwenden), können sie versuchen wollen swfrenderaus swftools Paket. Derzeit ist 0.9.0 (2009-07-21) die aktuellste stabile Binärversion für Windows. Ich empfehle jedoch, den Entwicklungs-Snapshot auszuprobieren, swftools-2013-04-09-1007.exeder einige weitere Optionen bietet, einschließlich der Option, mit -rder die Auflösung der Ausgabedatei angepasst wird.

-2
Sivanandh Kandasamy

I found an alternative way to do this:

  1. Use "Xilisoft convertor" to convert swf to jpg (batch conversion is possible)
  2. Use Online convertors to combine all jpg to pdf