Проблема с печатью изображения на принтере ZebraPython

Программы на Python
Anonymous
Проблема с печатью изображения на принтере Zebra

Сообщение Anonymous »

Я написал приложение на Python для печати различных наклеек. У меня проблема с режимом img. Приложение, работающее локально, без проблем печатает изображения. Принтер подключен к локальной сети. При развертывании на сервере Windows возникают проблемы с печатью. Если я нарисую одну линию, файл zpl распечатается, но он небольшого размера. Если я нарисую или вставлю изображение, оно не будет напечатано. Я многое изменил, и у меня нет идей.
Что я уже пробовал: демон потоков Python, увеличение sock.settimeout, удаление sock.shutdown(socket.SHUT_WR), отправка zpl в частичных облаках. Я отключил сжатие zpl, возможно, это какая-то глупая ошибка... с сервера печатается одна строка... z p l б о л ь ш е г о р а з м е р а н е р а б о т а е т . . . < / p > < b r / > о н ​ ​ п е ч а т а е т < / p > < b r / > < p r e c l a s s = " l a n g - n o n e P r e t t y p r i n t - o v e r r i d e " > < c o d e > ^ X A < b r / > ^ P W 4 5 6 < b r / > ^ L L 2 5 6 < b r / > ^ F O 0 , 0 ^ G F A , 1 4 5 9 2 , 1 4 5 9 2 , 5 7 , k T 0 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : j S 0 I F 8 W 0 L 0 h I F h G 0 3 K F 8 W 0 L 0 h M F C g T 0 7 K F 8 Y 0 L 0 7 h P F E g N 0 L F g H 0 h O 0 3 Q F C g H 0 3 J F E g J 0 h S 0 1 P F 8 X 0 3 I F E g L 0 h X 0 7 N F 8 T 0 1 H F E g N 0 i G 0 1 g H F 8 g O 0 i J 0 3 X F C g P 0 i M 0 3 T F E g Q 0 k T 0 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : J 0 1 8 k N 0 J 0 3 H F E k L 0 J 0 1 K F 8 k I 0 K 0 7 M F E k 0 N 0 L F E j Y 0 P 0 3 J F E j X 0 T 0 H F E j W 0 U 0 K F E j S 0 U 0 1 h Q F 8 h L 0 V 0 1 h S F C h I 0 i G 0 3 Q F 8 W 0 1 g H 0 i M 0 3 O F C S 0 F 8 g G 0 i P 0 1 P F 8 H 0 7 M F C g G 0 i S 0 3 X F 8 g G 0 i W 0 1 R F E g I 0 j G 0 3 H F g P 0 k T 0 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : ^ F S < b r / > ^ X Z < b r / > < / к о д > < b r / > н е п е ч а т а е т с я < / p > < b r / > < p r e c l a s s = " l a n g - n o n e P r e t t y p r i n t - o v e r r i d e " > < c o d e > ^ X A < b r / > ^ P W 4 5 6 < b r / > ^ L L 2 5 6 < b r / > ^ F O 0 , 0 ^ G F A , 1 4 5 9 2 , 1 4 5 9 2 , 5 7 , k T 0 : : : h U 0 7 I F C h T 0 h T 0 1 J F E h T 0 h T 0 3 J F E h T 0 h T 0 F 8 I 0 7 h T 0 h S 0 3 F J 0 7 h T 0 h S 0 7 C J 0 3 8 h S 0 h R 0 1 F K 0 3 8 h S 0 h R 0 3 E K 0 3 8 h S 0 h R 0 F 8 K 0 1 C h S 0 g K 0 E g K 0 3 F L 0 1 C h S 0 g J 0 3 E g K 0 7 C M 0 E h S 0 g J 0 7 C g J 0 1 F N 0 E h S 0 g I 0 1 F g K 0 7 E N 0 E h S 0 g I 0 7 C g K 0 F 8 N 0 7 h S 0 g I 0 F g K 0 3 E O 0 7 h S 0 g H 0 1 E g K 0 7 C O 0 3 8 h R 0 g H 0 3 8 g K 0 F P 0 3 8 h R 0 g H 0 7 g K 0 1 E P 0 1 8 h R 0 g G 0 1 E g K 0 3 C P 0 1 C h R 0 g G 0 3 C g K 0 7 8 P 0 1 C h R 0 X 0 1 F 0 7 8 g K 0 F Q 0 1 C h R 0 X 0 7 F 0 F g K 0 1 E Q 0 1 C h R 0 X 0 7 F 1 E g K 0 3 C Q 0 1 C h R 0 X 0 E 7 3 8 g K 0 7 8 Q 0 1 C h R 0 X 0 E 7 F g L 0 F R 0 1 C h R 0 X 0 E 7 E g K 0 1 E R 0 1 C h R 0 X 0 E 7 C g K 0 3 C R 0 1 C h R 0 X 0 E 7 8 g K 0 7 8 R 0 1 8 h R 0 W 0 1 C F g L 0 F S 0 3 8 h R 0 W 0 1 D F g K 0 1 E S 0 3 8 h R 0 W 0 3 H F g K 0 3 C S 0 3 8 h R 0 W 0 3 F 7 g K 0 7 8 S 0 3 8 h R 0 W 0 7 E 7 g K 0 F T 0 3 8 h R 0 W 0 7 C 7 g J 0 1 C T 0 3 8 h R 0 W 0 F 8 7 g J 0 3 8 T 0 3 8 h R 0 W 0 F 0 7 g J 0 7 U 0 7 h S 0 V 0 1 C 0 7 g J 0 E U 0 7 h S 0 V 0 3 C 0 7 g I 0 1 C U 0 7 h S 0 V 0 7 C 0 7 g I 0 3 8 U 0 7 h S 0 V 0 F C 0 7 g I 0 F V 0 7 h S 0 V 0 F 8 0 7 g H 0 1 E V 0 7 h S 0 U 0 1 F 8 0 7 g H 0 3 C V 0 7 h S 0 U 0 3 B 8 0 7 g H 0 7 8 V 0 6 h S 0 U 0 7 3 8 0 7 g H 0 F W 0 E h S 0 U 0 E 7 H 0 7 g H 0 E W 0 E g T 0 6 X 0 T 0 1 C 7 H 0 7 g G 0 1 C V 0 1 E g T 0 7 8 W 0 T 0 3 8 7 H 0 7 g G 0 3 8 V 0 1 C Y 0 4 T 0 3 C W 0 T 0 7 0 7 H 0 7 g G 0 7 W 0 3 8 Y 0 E T 0 1 E W 0 T 0 E 0 6 H 0 7 g G 0 F W 0 7 8 X 0 1 E U 0 F W 0 S 0 1 C 0 E H 0 7 g 0 1 E W 0 7 Y 0 1 C U 0 7 C V 0 S 0 3 8 0 E H 0 7 g 0 3 C W 0 E Y 0 3 8 U 0 1 E V 0 S 0 7 8 0 E H 0 7 g 0 3 8 V 0 1 E Y 0 7 8 V 0 F V 0 S 0 F H 0 E H 0 7 g 0 7 W 0 1 C Y 0 7 W 0 7 8 U 0 R 0 1 E 0 1 C H 0 7 g 0 E W 0 3 8 Y 0 E W 0 3 8 U 0 R 0 1 C 0 1 C H 0 7 Y 0 1 C W 0 7 8 X 0 1 C W 0 1 C U 0 R 0 3 8 0 1 C H 0 7 Y 0 3 C W 0 7 Y 0 3 C X 0 E U 0 R 0 7 H 0 1 C H 0 7 Y 0 7 8 W 0 E Y 0 3 8 X 0 7 U 0 R 0 E H 0 1 8 H 0 7 Y 0 F W 0 1 E Y 0 7 Y 0 3 8 T 0 Q 0 1 C H 0 3 8 H 0 7 Y 0 E W 0 1 C Y 0 F Y 0 3 8 T 0 Q 0 3 8 H 0 3 8 H 0 7 X 0 1 C W 0 3 8 Y 0 E Y 0 1 C T 0 Q 0 7 I 0 3 8 H 0 7 X 0 3 8 W 0 7 8 X 0 1 C Y 0 1 C T 0 Q 0 E I 0 3 8 H 0 7 X 0 7 X 0 7 Y 0 3 C g 0 E T 0 P 0 1 C I 0 3 I 0 7 X 0 E X 0 E Y 0 3 8 g 0 E T 0 P 0 3 8 I 0 7 I 0 7 W 0 1 E W 0 1 E Y 0 7 g G 0 7 T 0 P 0 7 J 0 7 I 0 7 W 0 3 C W 0 1 C Y 0 E g G 0 7 T 0 P 0 F J 0 7 I 0 7 W 0 3 8 W 0 3 8 X 0 1 E g G 0 3 8 S 0 O 0 1 E J 0 7 I 0 7 W 0 7 X 0 7 8 X 0 1 C g G 0 1 8 S 0 O 0 1 C J 0 7 I 0 7 W 0 E X 0 7 Y 0 3 8 g G 0 1 C S 0 O 0 3 8 J 0 7 I 0 7 V 0 1 C X 0 E Y 0 7 8 g H 0 E S 0 O 0 7 K 0 6 I 0 7 V 0 3 8 W 0 1 E Y 0 7 M 0 1 J F C P 0 E S 0 O 0 6 K 0 E I 0 7 V 0 7 8 W 0 1 C Y 0 E L 0 1 L F 8 O 0 6 S 0 O 0 E K 0 E I 0 7 V 0 F X 0 3 8 X 0 1 E L 0 N F O 0 7 S 0 N 01CK0EI07U01EX078X03CK0HFEJ03F8N07S0N018K0EI07U01CX07Y038J07FEL078N03S0N038K0EI07U038X0EY07J07FEM038N038R0N07L0EI07U07X01EY0FI07HFN01CN038R0N06L0CI07U0EX01CY0EH03HFO01CN018R0N0EK01CI07T01EX038X01C03HF8O01CN01CR0M01CK01CI0ET03CX078X0381HF8P038N01CR0M018K01CI0ET078X07Y079HFCQ038O0CR0M038K01CI0ET07Y0EY0IFCR038O0ER0M07L01CI0ET0EX01EY0HFCS038O0ER0M06L01CI0ES01CX01CR03MFET038O06R0M0EL018I0ES038X038Q01NF8T07P07R0M0CL038I0ES038X078P01OFET07P07R0L01CL038I0ES07Y0FQ0HFCJ01F1F8S07P03R0L038L038I0CS0EX01EP0HFEK07E07ES07P038Q0L03M038H01CS0EX03CO0HFEK01FE01F8R0FP038Q0L07M038H01CR01CX078N07HFL07FCH07EQ03EP038Q0L0EM038H01CR03CX0FN07HFL01FB8H01FQ078P038Q0L0CM03I01CR038W01EM03HF8L07E78I0FCP0FQ038Q0K01CM07I01CR07X03CL03HF8L01F8FJ03FO01EQ038Q0K038M03I01CR0FX078K01HF8M07E0EK0FCN07CQ038Q0K03N038H01CR0EX0FK01HFCN0F81CK03EN0FR038Q0K07N038H01CQ01CW01EJ01HFCN03E03CL0EM01ER038Q0K0EN038H018Q01CW03CJ0HFEO0FC078L07M03CR038Q0K0CN038H038Q038M01CN078I0HFEO03FH07M038L0F8R038Q0J01CN038H038Q078M03CN0FI07HFP0FCH0EM03CK01EK0IF8J038Q0J038hIF1EH07HFP03FH01EM01CK03CH03KF8J038Q0J030hOFQ0FCH03CN0EK0F87KF8L038Q0J0707hPFEM01FI038N07J01LFO038Q0J0EO038H038P01CM038N0RFCI03CI07O07I03JFEQ038Q0J0CO018H038P038M07N01IFC1PF87J0FO03803IFES038Q0I01CO01CH038P038M0EN03HFCL07NF801EO01C1HFEU038Q0I038O01CH03Q07M01CN0HFCP01gIF8U038Q0I03P01CH07Q0FM038M07FET03gFV038Q0I07P01CH07Q0EM07M03FEU07803TFC7CV038Q0I06P01CH07P01CM0EL01HFCU0FJ0FQ079FW038Q0T01CH07P01CL01CL0IF8T01EI01EQ03FEW038Q0T01CH07P038L01CK07FCFU01CI01CQ01F8W038Q0T01CH07P07M038J03FE1EU038I038Q03EX038Q0T01CH07P07M038I01HF03CU07J078Q0FCX038Q0U0CH07P0EM07J0HF8078U0EJ0FQ01F8X038Q0U0EH0EO01EM07I07FCH0FU01CJ0EQ07F8X038Q0U0EH0EO01CM0EH01FEH01EU03CI01CP01FB8X038Q0U0EH0EO038M0EH0HFI03CU078I038P03E38X038Q0U0EH0EO038L01C03F8I078U0FJ078P0F838X038Q0U0EH0EO07M01C0FEJ0FU01EJ0FP03F038X038Q0U0EH0EO0EM0387F8I01EU03CJ0EP07C038X038Q0U0EH0EO0EM039FCJ03CU038I01CO01FH038X038Q0U0EH0EO0EM07HFK078U07J038O07EH038X038Q0U0E01CO0EM07FCK0FV0EJ078N01F8H038X038Q0U0701CN01CM0FEK01CU01CJ07O07EI038X038Q0U0701CN01CL03F8K038U038J0EO0F8I078X038Q0U0701CN01CK01HFL0FV078I01CN03EI01FY038Q0U0701CN01CK07F7K01EV038I03CN0FCI03CY038Q0U0701CN01CJ03FCEK03CV03CI078M03FJ078Y038Q0U0701CN018J0FE0EK078V01CI07N0FCJ0FS03L038Q0U0701CN038I03F80EK0FW01EI0EM03FJ03ES03L038Q0U07038N038H01FEH0EJ01EX0EH01EM0FCJ078S038K038Q0U07038N038H07FI0EJ03CX07H03CL01FK0FT01CK038Q0U03038N03801FCI0FI0HF8X07H038L07EJ03EU0EK038Q0U03838N03H0HFJ0FC3IFY03807L01F8J07CU078J038Q0U03838N0703F8J07JFCY0380EL07EK0FV03CJ038Q0U03838N070FEL0IFgG01C1EK01F8J01EV01FJ038Q0U03C38N0H7F8L03gI01E3CK0FEK07CW07CI038Q0U01C38N07FCgR0HF8J03F8K0FX01FI038Q0V0E7O07FgS07FJ01FEK01EY07CH038Q0V0E7N03FCgS01FCI0HFK01FCY01FH038Q0V0H7N0FEgT01HF803FCK0HF8g07C038Q0V0H7M03FEgT03CFE1FEK0HFCgG01E038Q0V03FL01FCEgT0783IFK07FEgI0F038Q0V03FL07F0EgT07FE7HF8I07FEgJ07838Q0V01FK01FC1CgT03MFC3HFgK03C38Q0W0FK07E01CgU0IFBLFgL01E38Q0W0EK0F801CgW0CH03IF8gM0E38Q0W0FJ01EH01ChH018gN0738Q0W0FJ078H01CiR03FR0W0F8I0FI038iQ01HFR0W0FCH01EI038iP01HFCR0W0FCH03CI038iO01IF8R0W0HEH078I038iN01HFE18R0V01CEH0HFCH038iN07FE01CR0V01C701HFEH07iO0FEH01CR0V01C783IF807iN03EJ0CR0V01C3C7E07C07iN0FCJ0ER0V01C1F7C01E07iM03FK0ER0V01C0HF8H0E07iM0FCK0ER0V01C03F8H0E07iL03FL06N0HF80V03801FCH0E078iK07CL0EM07HFC0V03801FEH0703CiJ01FM0EL03IFE0V03803HFC0701EiJ07EM0EL0HFH0E0V038038HF8EH0FiI01F8M0EK07F8H070V0380707HFEH078iH07EN0EJ03FCI070V0380E01HFCH03CiG01F8N0EJ0FEJ038V0301CH0FEI01EiG03EO0EI01F8J01CV0703CH01F8I07iG0F8O0CI07CK01CJ018P07038I07EI038hY01EO01CI0FL01CJ03HFEN0707J01F8H01ChY07CO01CH03EL03CJ01KF8K070EK07FI0FhY0FP01CH07CL038K07MFEH071EK01FCH078hW03EP01C01FM070N0LFE071CL07FH03ChW07CP01C03EM0E0P03JFHE38L01FC01EhW0FQ01C0F8L01E0T0HFE78M07FH0FhV03EQ01C1FM01C0U0KFEK01FC078hU078Q0187CM0380U01hQF8Y0FR038F8M07H0V0hTFCU03ER039EN0FH0V0FCP03F0FCgN03QF8R078I01N03FCN0EH0U01F8Q0FE7FgT03OFCM01FJ0F8M07FN01CH0U01FR03F8FCgV01PF8H07MFCM07EN038H0U01FS0FE3FgY03XF8M0F8N078H0U03ES03IFChH01RFEN01FN01FI0U03CT0JFhL03HF3CS03CN07EI0U03CU0IFChN078S0FCM01F8I0U038V0IFhM01FS01F8M07EJ0U078W0HFEhL07CS07F8L01F8J0U07X01HFEhK0F8S0F7M07EK0U07Y01HFEhI03ES03E7L03F8K0U0Eg03IFChG0FCS078EL0FEL0U0EgG0KFCgX01FT0F0EK03F8L0T01EgG03LFCgV07CS01E0CK0FCM0T01EgH0FC1KFCgS01F8S0381CJ03FN0T03CgH03FH01SF8gI03ET07018J0FCN0T03CgI0FCI01RFCgH0F8T0E038I03FO0T07CgI03FK01QFCg03FT01C03J0FCO0T078gJ0HFES07HFEY07CT03807I03FP0T0F8gJ03IFCR03IFW01FU07H07H01FCP0T0F8gK07JFR01IF8U07EU0EH0EH07FQ0S01F8gL01JFCQ01HFEU0F8T01CH0E01FCQ0S01FgO03JF8Q0FET03EU03C01C7FER0S01FgQ0JFEQ07T0F8U07803IF8R0S01FgR01JFCO038R03FV0F1JFES0S03EgT07JFN01CR07CU01KF8T0S03EgV0JFEL01EQ01FU0KFEV0S03EgW03JF8K0FQ07ES07JFC1CV0S01EgY07IFEJ078O01F8Q03KFH038V0S01Fh01NF8O03EP01KF1EH078V0S01FhH03QF8J0F8N01KF803CH07W0S01EhJ03UFN0KF8I078H0EW0S01EhN01UF807JFCK07H01CW0S01ChN01CJ03TFEM0EH03CW0T08hO0EM0FC3NFN01CH078W0iJ0EL03F8K03FP038H07X0iJ0EL0FCX07I0EX0iJ0EK03FY0EH01CX0iJ07K0FCY0EH03CX0iJ07J03Fg0EH038X0iJ07I01FCY01CH07Y0iJ07I0HFg01CH0EY0iJ07H03F8g01FCFCY0iJ0701FEgG01IFCY0iJ078HFgI07HFg0iJ03HFCgJ02gG0iJ01FEhM0iK07hN0kT0::::::::::::::::::::::::::^FS
^XZ

def send_zpl(ip: str, port: int, zpl_cmd: str,
auto_calibrate: bool = True,
printer_dpi: int = 203) -> tuple:
calibration_prefix = ""
if auto_calibrate:
pw = round(448 * printer_dpi / 203)
ll = round(256 * printer_dpi / 203)
calibration_prefix = f"\n^XA\n^PW{pw}\n^LL{ll}\n^PON\n"
full_command = f"{calibration_prefix}{zpl_cmd}\n^XZ"
flush_wait = max(0.3, len(full_command) / 50000)

try:
with socket.create_connection((ip, int(port)), timeout=3) as sock:
sock.settimeout(15)
sock.sendall(full_command.encode())
sock.shutdown(socket.SHUT_WR)
time.sleep(flush_wait)
return True, None

except socket.timeout:
return False, "Connection timed out."
except ConnectionRefusedError:
return False, "Connection refused by printer."
except socket.gaierror:
return False, "DNS error or invalid IP address."
except ConnectionResetError:
return False, "Connection reset by printer."
except BrokenPipeError:
return False, "Connection interrupted during transmission."
except OSError as e:
return False, f"System error: {e}"
except Exception as e:
return False, f"Unexpected error: {e}"

def _compress_zpl_hex(hex_string: str, bpr: int) -> str:
rows = [hex_string[i: i + bpr * 2]
for i in range(0, len(hex_string), bpr * 2)]

def count_to_chars(n):
upper = 'GHIJKLMNOPQRSTUVWXYZ'
lower = 'ghijklmnopqrstuvwxyz'
result = ''
if n >= 20:
result += lower[(n // 20) - 1]
n = n % 20
if n > 0:
result += upper[n - 1]
return result

def compress_row(row):
out = ''
i = 0
while i < len(row):
c = row
count = 1
while i + count < len(row) and row[i + count] == c:
count += 1
out += (count_to_chars(count) if count > 1 else '') + c
i += count
return out

result = ''
prev = None
for row in rows:
c = compress_row(row)
if c == prev:
result += ':'
else:
result += c
prev = c
return result

def build_img(base64_png: str) -> tuple:
if not PIL_AVAILABLE:
return None, "Pillow is not installed."

try:
if "," in base64_png:
base64_png = base64_png.split(",", 1)[1]

img = Image.open(io.BytesIO(base64.b64decode(base64_png))).convert("RGBA")
bg = Image.new("RGBA", img.size, (255, 255, 255, 255))
bg.paste(img, mask=img.split()[3])
img = bg.convert("L")

img = img.resize((456, 256), Image.LANCZOS)
img = img.point(lambda x: 0 if x < 160 else 255, '1')

bbox = img.getbbox()
if bbox:
img = img.crop(bbox)

width, height = img.size

if width % 8 != 0:
new_width = width + (8 - width % 8)
new_img = Image.new("1", (new_width, height), 1)
new_img.paste(img, (0, 0))
img = new_img
width = new_width

try:
pixels = list(img.get_flattened_data())
except AttributeError:
pixels = list(img.getdata())

bpr = width // 8
total = bpr * height

hex_rows = []
for row in range(height):
rh = ""
for b in range(bpr):
val = 0
for bit in range(8):
px = row * width + b * 8 + bit
if px < len(pixels) and pixels[px] == 0:
val |= 1

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