Sada je: 28 ožu 2024, 09:12.
Razmjena savjeta i trikova o podešavanju sustava i programa.

Moderator/ica: Moderatori/ce

Nedavno sam saznao da ne može svaki printer interpretirati escape sekvence. Dokumenti iz programa pisan u Clarionu printali su se direktno na LPT port. Tu nisu bili potrebni win driveri. Danas su printeri s paralelnim portom skupi i rijetki. Kako bi iskoristili stotine printera sa USB-om koje smo imali da mogu pristati iz Clarionu programa napisao sam Python skriptu koja ako printer ne podržava sirovo printanje bajtova i PCL, kreira .pcl file preko virtualnog printera i onda taj pcl file preko ghostscripta pretvori u PDF i pošalje na default I printer. Tako sve PCL komande budu interpretirane i na jeftinom printeru tiho u pozadini. Za korisnika sve je isto kao da printanje normalno. Rješenje je za Win, Al note se napravit i za Linux , jer Ghostscript radi i na Linuxu
Kod: Označi sve

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Autor: Hrvoje T
Last edit: June 2017
'pip install pypiwin32 --> for installing win32api'
In python 2: 'python -m pip install pypiwin32'
io module for io.open in Python2, the same as 'open' in Python3
First command line argument is for file name which we want to print:
'python print_rawpcl.py my_pcl_text_file.txt'
"""

import os, sys, io, win32print, win32api, subprocess


def remove_silently(file1):
    """Removing silently files from last time if there are any left"""
    try:
        os.remove(file1)
    except OSError:
        pass

# Asign your printers and variables
first_default_printer = win32print.GetDefaultPrinter()
tmp_printer = "local_pcl"
my_pcl_file = "print.pcl"
my_output_pdf = "print.pdf"

# Remove files if they already exist
remove_silently(my_output_pdf)
remove_silently(my_pcl_file)

# If there is command line argument, the first one is our file_to_print
if len(sys.argv) > 1:
    file_to_print = sys.argv[1]
else:
    file_to_print = "RACUN.TXT"

# Searching for supported PCL printers as default printer
pcl_supported = False
supported_printers = ["2035", "1320", "KONICA", "DIREKT"]
for item in supported_printers:
    if item.lower() in first_default_printer.lower():
        pcl_supported = True
        break

# If our printer doesn't support PCL, we declare virtual local_pcl printer
# as default one and create .pcl file
if not pcl_supported:
        win32print.SetDefaultPrinter(tmp_printer)

# Printing RAW data to the default printer
try:
    # rb --> 'read, bytes', string is 'bytes' type, not unicode (Python3)
    with io.open(file_to_print, 'rb') as f:
        raw_data = f.read()
        hPrinter = win32print.OpenPrinter(win32print.GetDefaultPrinter())
        try:
            hJob = win32print.StartDocPrinter(hPrinter, 1, (
                    "print_rawpcl.py data", None, "RAW"))
            try:
                win32print.StartPagePrinter(hPrinter)
                win32print.WritePrinter(hPrinter, raw_data)
                win32print.EndPagePrinter(hPrinter)
            finally:
                win32print.EndDocPrinter(hPrinter)
        finally:
            win32print.ClosePrinter(hPrinter)
except OSError as e:
    print("Failed: {}".format(e))

# Convert a pcl file to pdf with GhostPCL (Ghostscript)
# if the default printer is local_pcl
converter_app = 'C:/Python34/ghostpcl-9.21-win32/gpcl6win32.exe'
if win32print.GetDefaultPrinter() == "local_pcl":
    subprocess.call(
        [converter_app, '-dNOPAUSE', '-dBATCH', '-sDEVICE=pdfwrite',
        '-sOutputFile=print.pdf', 'print.pcl'])

    # return default printer to the printer that was default at the start
    win32print.SetDefaultPrinter(first_default_printer)

    # Finally, print that print.pdf to your first default printer silently
    gsprint_app = "C:\\Program Files\\Ghostgum\\gsview\\gsprint.exe"
    p = subprocess.Popen(
            [gsprint_app, my_output_pdf], stdout=subprocess.PIPE,
            stderr=subprocess.PIPE)
    # Waits for the gs process to end
    stdout, stderr = p.communicate()
    # Remove print.pcl and print.pdf file
    remove_silently(my_output_pdf)
    remove_silently(my_pcl_file)

# Removes that first txt file
remove_silently(file_to_print)

https://stackoverflow.com/q/44623389/4424698
Postovi: 286
Postovi: 286
Pridružen/a: 05 stu 2008, 14:40
Podijelio/la zahvalu: 38 puta
Primio/la zahvalu: 32 puta
Na mreži
Trenutno korisnika/ca: / i 9 gostiju.