วิธีการ batch พิมพ์ไฟล์ SWF เป็น PDF


3

ฉันใช้ windows 7 X64

ฉันได้ติดตั้ง Adobe Acrobat แล้วฉันจึงมีเครื่องพิมพ์ PDF เสมือน ฉันยังติดตั้ง Adobe Flash Player บนระบบ

ฉันเปิดไฟล์ SWF โดยใช้ Flash Player และจาก Flash Player ฉันสามารถพิมพ์ไฟล์เป็น PDF

ฉันสงสัยว่าเป็นไปได้ที่จะทำซ้ำกระบวนการสำหรับโฟลเดอร์ของไฟล์ SWF

ในระหว่างกระบวนการ "พิมพ์" เครื่องพิมพ์ PDF จะถามชื่อไฟล์ซึ่งฉันต้องการใช้ชื่อไฟล์จากไฟล์ SWF ฉันหวังว่านี่จะเป็นไปโดยอัตโนมัติเช่นกัน

ขอบคุณ!

คำตอบ:


2

ฉันกำลังมองหาสิ่งเดียวกัน ฉันไม่สามารถหาห้องสมุดที่เฉพาะเจาะจงสำหรับงานนี้ได้เช่นกัน แต่อย่างน้อยที่สุดเราจะสามารถทำให้กระบวนการนี้เป็นแบบอัตโนมัติโดยใช้เครื่องมืออัตโนมัติ GUI

มีไลบรารีและแอปพลิเคชันแบบสแตนด์อโลนจำนวนมากสำหรับงานนี้ หนึ่งที่ดูเหมือนว่ามีแนวโน้มให้ฉันเป็นAutoIt

แต่ในฐานะแฟนงูหลามฉันพบห้องสมุดที่น่าอัศจรรย์นี้ชื่อ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 ที่ออกแบบมาเพื่อทำงานเดียวกัน อย่างไรก็ตามนี่ยังง่ายกว่าและเร็วกว่าการแปลงด้วยตนเอง

ป.ล. ผมไม่สามารถช่วย แต่พูดถึงSikuli อีกหนึ่งไพ ธ อนไลบรารีที่น่าทึ่งสำหรับระบบอัตโนมัติของ GUI

ปรับปรุง

วิธีการด้านบนสร้างกราฟิกส์แบบเวกเตอร์ แต่ถ้าใครสนใจไฟล์ rasterized .png (ซึ่งสามารถแปลงเป็น pdf ได้อย่างง่ายดายโดยใช้เครื่องมือที่มีให้ใช้อย่างอิสระ) พวกเขาอาจต้องการลองswfrenderจากแพ็คเกจswftools ในปัจจุบันไบนารี่เวอร์ชั่นเสถียรล่าสุดที่มีสำหรับ Windows คือ 0.9.0 (2009-07-21) แต่ฉันขอแนะนำให้ลองพัฒนา snapshot swftools-2013-04-09-1007.exeซึ่งมีตัวเลือกเพิ่มเติมรวมถึงตัวเลือก-rที่ใช้ในการปรับความละเอียดของไฟล์ที่ส่งออก


3

ด้านล่างคือการมีส่วนร่วมของฉันโดยใช้ pywinauto

ฉันใช้ internet explorer เป็นเบราว์เซอร์ (ดังนั้นให้ตั้ง internet explorer เป็นโปรแกรมเริ่มต้นสำหรับไฟล์ swf) เพราะฉันพบว่ามันโหลดไฟล์ swf เร็วที่สุด (ฉันรู้ว่า ... แปลกจริง ๆ )

ฉันยังใช้ Adobe Acrobat เพื่อพิมพ์ด้วย (ดูเหมือนว่าจุดจับโต้ตอบการพิมพ์คล้ายกับโปรแกรมส่วนใหญ่ แต่คุณอาจไม่มีปัญหา) เพราะฉันใช้ Adobe ฉันจึงต้องเปลี่ยนหมายเลขอ้างอิงของกล่องโต้ตอบการพิมพ์จาก

window.OK.click ไปที่ window.Print.click (บรรทัด 61)

นอกจากนี้คุณอาจต้องเปลี่ยนค่าสำหรับบรรทัดด้านล่าง (บรรทัดที่ 43) เนื่องจากความละเอียดหน้าจอของคุณอาจแตกต่างจากของฉัน

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

ขอโทษถ้ามันไม่ได้อธิบายได้ดีเช่นกันเพราะมันเป็นงูหลามกรุณาตรวจสอบว่าการเยื้องนั้นถูกต้องในรหัสด้านล่าง

    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 รุ่นปัจจุบัน (อย่างน้อยก็สำหรับฉันแล้ว) หากคุณค้นหาการเรียกใช้ฟังก์ชันจะเหมือนกัน แต่จะถูกแปลงจาก camelcase เป็น underscore_case


-2

ฉันพบวิธีอื่นในการทำเช่นนี้:

  1. ใช้ "Xilisoft Converter" เพื่อแปลง swf เป็น jpg (สามารถทำการแปลงเป็นชุด)
  2. ใช้ตัวแปลงแบบออนไลน์เพื่อรวม jpg ทั้งหมดเป็น pdf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.