我可以将 PCL5 个转义序列打印到非 PCL 基于主机的打印机吗?
Can I print PCL5 escape sequences to non-PCL host-based printer?
我有 HP LJ P1005 打印机,它不是 PCL(基于主机的)打印机。它有专门的驱动程序 link to the driver. It is not supported by HP universal print driver (HP-UPD) which supports PCL5. A list of supported UPD printers
我的问题是如何在这台打印机上使用 PCL5 转义序列,或者甚至可能吗?这是否意味着如果它是基于主机的,则通过打印机驱动程序的主机 PC 必须解释 PCL5 命令或根本无法使用 PCL5?如何知道驱动程序是否 PCL 兼容?如果主机 PC 必须解释 PCL5,打印处理器设置应该是什么样的:RAW、IMF、EMF、winprint TEXT?
好吧,现在我知道我可以创建一个带有 PCL 转义序列的文本文件并解释它并在非 PCL 基于主机的打印机上打印它。
首先,我发现here a way how to create a pcl
file from txt
file. After creating that PCL printer in Windows, from Python, I used external programm GhostPCL, which is compiled Ghostscript interpreter to create a PDF file from that pcl file here是这样的:
gpcl6win32.exe -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=print.pdf print.pcl
dNOPAUSE
和dBATCH
是静默无交互转换。
最后,我安装了 gsviewer 并从 Python 默默地将该 pdf 打印到我默认的非 PCL 基于主机的打印机。我所有的 PCL 代码都被解释并打印到我的廉价打印机上。它在打印时不会打开任何 window,因此对于客户来说似乎一切正常。
我不是程序员,所以代码不是你见过的最好的,但它有效:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Autor: hrvooje
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
else:
is_supported = False
if pcl_supported == False:
win32print.SetDefaultPrinter(tmp_printer)
# Printing RAW data to the virtual 'local_pcl' printer or to the 'HP LJ P2035'
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)
我有 HP LJ P1005 打印机,它不是 PCL(基于主机的)打印机。它有专门的驱动程序 link to the driver. It is not supported by HP universal print driver (HP-UPD) which supports PCL5. A list of supported UPD printers
我的问题是如何在这台打印机上使用 PCL5 转义序列,或者甚至可能吗?这是否意味着如果它是基于主机的,则通过打印机驱动程序的主机 PC 必须解释 PCL5 命令或根本无法使用 PCL5?如何知道驱动程序是否 PCL 兼容?如果主机 PC 必须解释 PCL5,打印处理器设置应该是什么样的:RAW、IMF、EMF、winprint TEXT?
好吧,现在我知道我可以创建一个带有 PCL 转义序列的文本文件并解释它并在非 PCL 基于主机的打印机上打印它。
首先,我发现here a way how to create a pcl
file from txt
file. After creating that PCL printer in Windows, from Python, I used external programm GhostPCL, which is compiled Ghostscript interpreter to create a PDF file from that pcl file here是这样的:
gpcl6win32.exe -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=print.pdf print.pcl
dNOPAUSE
和dBATCH
是静默无交互转换。
最后,我安装了 gsviewer 并从 Python 默默地将该 pdf 打印到我默认的非 PCL 基于主机的打印机。我所有的 PCL 代码都被解释并打印到我的廉价打印机上。它在打印时不会打开任何 window,因此对于客户来说似乎一切正常。
我不是程序员,所以代码不是你见过的最好的,但它有效:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Autor: hrvooje
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
else:
is_supported = False
if pcl_supported == False:
win32print.SetDefaultPrinter(tmp_printer)
# Printing RAW data to the virtual 'local_pcl' printer or to the 'HP LJ P2035'
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)