Как сгенерировать QR-код и внедрить его в документ перед печатью в PythonPython

Программы на Python
Ответить
Anonymous
 Как сгенерировать QR-код и внедрить его в документ перед печатью в Python

Сообщение Anonymous »

Я хочу создать сценарий на любом языке, чтобы перехватывать задание на печать документа и печатать на нем динамически генерируемый QR-код до того, как задание на печать будет обработано. Есть ли какие-нибудь решения?
Я уже разработал скрипт Python, но он не работает должным образом. Мне нужны какие-либо рекомендации, чтобы этот скрипт работал или использовал какие-либо другие подходы для достижения необходимого результата.
import win32print
import win32api
import tempfile
import os
import time
from PIL import Image, ImageDraw
import qrcode
import ctypes
import sys

processed_jobs = set() # Track processed jobs

def is_admin():
"""Check if the script is running as an administrator."""
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False

def generate_qr_code(data):
"""Generate a QR code image."""
print("Generating QR code...")
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data(data)
qr.make(fit=True)
qr_image = qr.make_image(fill_color="black", back_color="white")
print("QR code generated successfully.")
return qr_image

def inject_qr_to_document(original_doc, qr_image):
"""Inject QR code into the original document and preview it."""
print("Injecting QR code into the original document...")
qr_size = 300
qr_position = (original_doc.width - qr_size - 50, original_doc.height - qr_size - 50)
qr_image = qr_image.resize((qr_size, qr_size))
original_doc.paste(qr_image, qr_position)
print("QR code injected successfully.")

# Preview the modified document
print("Previewing the modified document...")
original_doc.show() # This will open the image in the default image viewer

return original_doc

def cancel_print_job(printer_name, job_id):
"""Cancel the print job."""
print(f"Cancelling print job ID {job_id} on printer {printer_name}...")
try:
# Open printer handle
hprinter = win32print.OpenPrinter(printer_name)

# Cancel the print job using SetJob
win32print.SetJob(hprinter, job_id, 0, None, win32print.JOB_CONTROL_DELETE)
print(f"Print job {job_id} cancelled successfully.")

# Close printer handle
win32print.ClosePrinter(hprinter)
except Exception as e:
print(f"Failed to cancel print job {job_id}: {e}")

def process_print_job(printer_name, job_id, qr_data):
"""Process the print job, inject QR code, and preview the modified document."""
print(f"Processing print job with ID {job_id} on printer {printer_name}...")

try:
# Generate QR code
qr_image = generate_qr_code(qr_data)

# Create a simulated document for the example
original_doc = Image.new("RGB", (2480, 3508), "white") # A simulated A4 page
draw = ImageDraw.Draw(original_doc)
draw.text((100, 100), f"Document: Simulated Content", fill="black")

# Inject QR code into document and preview
modified_doc = inject_qr_to_document(original_doc, qr_image)

# Save the modified document to a temporary file
with tempfile.NamedTemporaryFile(delete=False, suffix=".bmp") as temp_file:
modified_doc.save(temp_file.name, "BMP")
print(f"Modified document saved to: {temp_file.name}")

# Note: You can send this modified file to the printer if needed, but for this case, we stop here.
except Exception as e:
print(f"Error processing print job: {e}")

def monitor_printer(printer_name, qr_data):
"""Monitor the printer for new print jobs."""
print(f"Monitoring printer: {printer_name}...")
hprinter = win32print.OpenPrinter(printer_name)
try:
while True:
jobs = win32print.EnumJobs(hprinter, 0, -1, 1)
for job in jobs:
job_id = job["JobId"]
if job_id not in processed_jobs:
processed_jobs.add(job_id)
print(f"New job detected: ID {job_id}")
cancel_print_job(printer_name, job_id) # Cancel the original job
process_print_job(printer_name, job_id, qr_data)
time.sleep(5) # Check periodically
finally:
win32print.ClosePrinter(hprinter)
print("Stopped monitoring.")

if __name__ == "__main__":
# Ensure the script runs with administrative privileges
if not is_admin():
print("Restarting with administrator privileges...")
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)
sys.exit()

try:
print("Initializing script...")
default_printer = win32print.GetDefaultPrinter()
print(f"Default printer detected: {default_printer}")
qr_data = "Cairo Exchange Coprporate"
monitor_printer(default_printer, qr_data)
except Exception as e:
print(f"An error occurred: {e}")


Подробнее здесь: https://stackoverflow.com/questions/793 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»