Como imprimir em lote arquivos SWF para PDF?

3

Estou usando o Windows 7 X64.

Instalei o Adobe Acrobat, para que eu tenha uma impressora virtual de PDF. Eu também instalei o Adobe Flash Player no sistema.

Eu abro o arquivo SWF usando o flash player e, no flash player, posso imprimir o arquivo em PDF.

Gostaria de saber se é possível repetir o processo para uma pasta de arquivos SWF.

Durante o processo de "impressão", a impressora PDF solicita um nome de arquivo, que eu quero usar o nome do arquivo do arquivo SWF. Espero que isso também possa ser automatizado.

Obrigado!

    
por Chen Stats Yu 27.06.2015 / 23:12

3 respostas

2

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.

    
por 02.12.2015 / 08:34
3

Abaixo está minha contribuição também usando pywinauto.

Eu usei o Internet Explorer como o navegador (então configurei o Internet Explorer como o programa padrão para arquivos swf) como achei para carregar os arquivos swf mais rápido (eu sei ... estranho).

Eu também usei o Adobe Acrobat para imprimir. (parece que o identificador de diálogo de impressão é semelhante para a maioria dos programas, embora você possa não ter problemas). Porque eu usei adobe eu tive que mudar minha alça do diálogo de impressão de

window.OK.clique para window.Print.click (na linha 61)

Além disso, você pode precisar alterar os valores para a linha abaixo (linha 43). Como sua res da tela pode ser diferente da minha.

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

Desculpas se não for bem explicado, também porque é python, por favor, verifique se o recuo está correto no código abaixo.

    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'{}', 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()

Eu usei o SWAPY para ajudar a obter os identificadores de controle de cada janela. No entanto SWAPY usa o código antigo (ainda é muito útil), então eu atualizei o código para refletir e apoiar a versão atual do pywinauto (pelo menos para mim de qualquer maneira). Se você procurar, as chamadas de função são as mesmas, mas são convertidas do camelcase para underscore_case.

    
por 27.02.2018 / 13:05
-2

Eu encontrei uma maneira alternativa de fazer isso:

  1. Use "Xilisoft convertor" para converter swf para jpg (conversão em lote é possível)
  2. Use conversores on-line para combinar todos os jpg a pdf
por 06.05.2016 / 08:24