특정 POS 프린터 용 Python 문자열을 포맷하는 방법

Nov 16 2020

여기 에서 찾은 열전 사 영수증 프린터 POS-8330을 사용하고 있습니다.

프린터에 파이썬 문자열을 보내는 코드를 작성 중입니다.이 작업을 수행하는 코드는 다음과 같습니다.

companyName = "Hilton Steel and Cement"
paytype = self.payment_Mode
companyName = companyName + "\n\nSale Receipt\n\nOpp Golden Line Mall\nP.O BOX 3404-20100\n TEL: 0727441192\nEMAIL: [email protected]"
receiptNo = randint(1, 100000)
finalString = companyName + "\n\nReceipt No:" + str(receiptNo) + "\n\n" + self.getproductList()\
                              + "\n______________________________________\n" + "Total Due:        " + str(self.totaltoBePaid)  + "\n______________________________________\n\n" + "Paid In:     " + paytype + "\n\n"+ "Served By:     " + str(self.user) +"\n" + "Payment:           " + str(self.finalvariables[1])+ "\nBalance:            " + str(self.finalvariables[0])  + "\n\n\nWelcome Back"

open(self.filename, "w").write(finalString)
os.startfile(self.filename, "print")

프린터에는 여기에 프로그래밍 설명서가 있지만 여기 에서 아무것도 알아낼 수 없으며 특히 적용 방법을 알 수 없습니다. 다음과 관련하여 친절하게 도움을주세요.

  1. 글꼴 크기를 줄이려면
  2. 가장 왼쪽부터 인쇄를 시작할 수 있도록 가로 여백을 줄입니다.

내가 작성한 코드는 POS 프린터에서이 결과를 제공합니다.

일반 풀 사이즈 프린터에서는

정확히 내가 원하는 것입니다.

답변

1 RolandSmith Nov 17 2020 at 18:31

설명서를 보면이 프린터는 제어 문자 (ASCII의 처음 32 자)를 사용하여 명령을 시작하고 텍스트와 구분합니다.

따라서 텍스트와 프린터 명령을 섞을 수 있습니다. binary모드 에서 출력 파일을 열 었는지 확인하십시오 !

예를 들어 프로그래밍 매뉴얼의 17 페이지를 보면 명령 ESC @이 프린터를 재설정합니다. 이 명령은 두 문자 (바이트)로 구성됩니다. 십진수 27 다음에 십진수 64가 나옵니다. 다음과 같이 해당 명령을 만들 수 있습니다.

In [7]: bytes([27,64])
Out[7]: b'\x1b@'

왼쪽 여백 (command GS L, page 37) 및 인쇄 영역 너비 (command GS W, page 38)를 설정해야합니다. "수평 모션 단위"는 GS P38 페이지 의 명령에 설명되어 있습니다 . 기본 수평 모션 단위는 25.4 / 180 = 0.1411mm 또는 1/180 = 0.0055 인치입니다.

따라서 왼쪽 여백을 약 5mm (정확하게는 4.94mm)로 설정하려면 다음 명령을 전송해야합니다.

dIn [14]: bytes([29, 76, 35,0])
Out[14]: b'\x1dL#\x00'

값 35는 다음과 같이 계산됩니다.

In [13]: round(5/(25.4/180))
Out[13]: 35

인쇄 너비도 60mm로 설정하려는 경우 GS W명령 인수는 다음과 같아야 합니다.

In [15]: round(60/(25.4/180))
Out[15]: 425

이것은 255보다 크므로 2 바이트에 걸쳐 분산되어야합니다.

In [17]: 425-256
Out[17]: 169

명령은 다음과 같습니다.

In [18]: bytes([29, 87, 169,1])
Out[18]: b'\x1dW\xa9\x01'

이러한 명령을 결합 할 수 있습니다.

In [20]: bytes([29, 76, 35, 0, 29, 87, 169,1])
Out[20]: b'\x1dL#\x00\x1dW\xa9\x01'

편집하다:

데이터에 인쇄 명령을 추가하는 것은 쉽습니다.

printdata = b'\x1dL#\x00\x1dW\xa9\x01' + finalString.encode('utf-8')

encode프린터 명령이 이진이므로 문자열 이 필요합니다 .

또한 바이너리 모드 에서 파일에 문자열을 써야 합니다.

with open(self.filename, "wb") outf:
    outf.write(printdata)
os.startfile(self.filename, "print")

마지막으로 with작성 후 파일이 제대로 닫히도록 사용 했습니다. 사용하는 방식에 따라 파일이 열려 있습니다.