Я искал то же самое. Ну, я не мог найти какой-либо конкретной библиотеки для этой работы. Но, по крайней мере, мы сможем автоматизировать этот процесс с помощью инструментов автоматизации графического интерфейса.
Есть много библиотек и автономных приложений для этой работы. То, что мне кажется многообещающим, это Autoit.
Но, как фанат Python, я нашел эту удивительную библиотеку под названием pywinauto и написал следующий скрипт для конвертации моих SWF-файлов:
"""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)
Этот метод имеет свои ограничения. Например, вы не сможете использовать свой компьютер во время процесса преобразования, поскольку мышь и клавиатура контролируются сценарием. Скрипт нуждается в корректировке для отдельных компьютеров. Также предполагается, что процесс управления GUI будет намного медленнее, чем приложение CLI, предназначенное для выполнения той же работы. Однако это все еще намного проще и быстрее, чем конвертировать их вручную.
PS Не могу не упомянуть Сикули. Еще одна удивительная библиотека Python для автоматизации графического интерфейса.
Обновить
Вышеупомянутый метод создает векторную графику, но если кому-то интересны растеризованные файлы .png (которые можно легко преобразовать в pdf с помощью свободно доступных инструментов), они могут попробовать swfrender
из пакета swftools . В настоящее время последняя стабильная бинарная версия, доступная для Windows, - 0.9.0 (2009-07-21). Но я рекомендую попробовать снимок разработки swftools-2013-04-09-1007.exe
который предлагает еще несколько опций, включая опцию -r
которая используется для настройки разрешения выходного файла.