Eu estava procurando a mesma coisa. Bem, eu não encontrei nenhuma biblioteca específica para este trabalho também. Mas, no mínimo, poderemos automatizar esse processo usando ferramentas de automação da GUI.
Existem muitas bibliotecas e aplicativos independentes para esse trabalho. Um que parece promissor para mim é Autoit .
Mas como fã de Python, encontrei esta incrível biblioteca chamada pywinauto e escrevi o seguinte script para converter meus arquivos 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'{}', 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)
Este método tem suas próprias limitações. Por exemplo, você não poderá usar seu computador durante o processo de conversão, pois o mouse e o teclado são controlados pelo script. O script precisa de ajustes para computadores individuais. Além disso, o processo de controle da GUI deve ser muito mais lento do que um aplicativo CLI projetado para fazer o mesmo trabalho. No entanto, isso ainda é muito mais fácil e rápido do que convertê-los manualmente.
P.S. Não posso deixar de mencionar Sikuli . Outra incrível biblioteca python para automação de GUI.
Atualizar
O método acima produz gráficos vetoriais, mas se alguém estiver interessado em arquivos .png rasterizados (que podem ser facilmente convertidos para pdf usando ferramentas disponíveis gratuitamente), eles podem tentar swfrender
de swftools package. Atualmente, a última versão binária estável disponível para Windows é 0.9.0 (2009-07-21). Mas eu recomendo testar o instantâneo de desenvolvimento swftools-2013-04-09-1007.exe
, que oferece mais algumas opções, incluindo a opção -r
, que é usada para ajustar a resolução do arquivo de saída.