首页 > 解决方案 > 在python中打印多个pdf文件

问题描述

我要实现的过程是从一个文件夹打印多个 pdf 文件,然后关闭 Adob​​e Acrobat,最后使用我的另一个脚本将文件映射到新文件夹。

映射按预期工作,但我正在努力打印所有文件。我可以只打印一个文件,或者不打印任何文件,Adobe 仍然保持打开状态。我一直在玩 asyncio,但我不知道它是否能完成工作。

该代码没有很好的文档记录或出色的质量,它只需要完成任务并且很可能永远不会被触及。这里是:

import os
import sys

import keyboard
import asyncio
import psutil
from win32 import win32api, win32print

import map_files
import utility


def prepareFilesToPrint(folder):
    # Scans folder for files with naming convention and puts them in a seperate array to print
    filesToPrint = []

    for file in os.listdir(folder.value):
        if utility.checkFileName(file):
            filesToPrint.append(file)

    return filesToPrint


def preparePrinter():
    # Opens the printer and defines attributes such as duplex mode
    name = win32print.GetDefaultPrinter()
    printdefaults = {"DesiredAccess": win32print.PRINTER_ALL_ACCESS}
    handle = win32print.OpenPrinter(name, printdefaults)
    attributes = win32print.GetPrinter(handle, 2)
    attributes['pDevMode'].Duplex = 2  # Lange Seite spiegeln
    win32print.SetPrinter(handle, 2, attributes, 0)

    return handle


async def printFiles(filesToPrint):
    for file in filesToPrint:
        await win32api.ShellExecute(
            0, "print", file, '"%s"' % win32print.GetDefaultPrinter(), ".", 0)


def cleanup(handle):
    # Closes Adobe after printing ALL files (!working)
    win32print.ClosePrinter(handle)
    for p in psutil.process_iter():
        if 'AcroRd' in str(p):
            p.kill()


async def printTaskFiles():
    # Iterates over files in downloads folder and prints them if they are task sheets (!working)
    os.chdir("C:/Users/Gebker/Downloads/")
    filesToPrint = prepareFilesToPrint(utility.Folder.DOWNLOADS)

    if filesToPrint.__len__() == 0:
        print("No Files to print. Exiting...")
        sys.exit()

    print("=============================================================")
    print("The following files will be printed:")
    for file in filesToPrint:
        print(file)
    print("=============================================================")

    input("Press ENTER to print. Exit with ESC")
    while True:
        try:
            if keyboard.is_pressed('ENTER'):
                print("ENTER pressed. Printing...")
                handle = preparePrinter()
                await printFiles(filesToPrint)
                cleanup(handle)
                print("Done printing. Mapping files now...")
                # map_files.scanFolders()
                break
            elif keyboard.is_pressed('ESC'):
                print("ESC pressed. Exiting...")
                sys.exit()
        except:
            break


if __name__ == "__main__":
    asyncio.run(printTaskFiles())

标签: pythonpython-3.xpywin32

解决方案


推荐阅读