Один і той самий сценарій — пробиття чека продажу з двома позиціями та оплатою готівкою — на трьох мовах. Спочатку код, потім короткий розбір.
Підключення до бібліотеки libprocheck.so / procheck.dll через ctypes.
import procheck as pc
# 1. Завантажити бібліотеку та налаштувати UTF-8
pc.load()
pc.SetStringEncoding(pc.ENCODING_UTF8)
# 2. Підключитись до мережевого ESC/POS-принтера
pc.ConnectLan(4000154869, '192.168.1.100', 9100)
# 3. Відкрити чек продажу
pc.OpenReceipt(0, '')
pc.AddReceiptText('Дякуємо за покупку!')
# 4. Додати позиції
pc.Sale(1001, 'Молоко 2,5% 1л', 45.50, 1.0, 1, 0, 0.0)
pc.Sale(1002, 'Хліб пшеничний', 28.00, 2.0, 1, 0, 0.0)
# 5. Оплата готівкою
total = 45.50 + 28.00 * 2.0
pc.Pay(0, total)
# 6. Закрити чек і прочитати результат
if pc.CloseReceipt() == 0:
print(f'Чек № {pc.GetDataField(4)} пробито')
print(f'Посилання : {pc.GetDataField(10)}')
print(f'PDF (base64), розмір: {len(pc.GetDataField(15))} символів')
else:
print(f'Помилка: {pc.GetLastErrorMessage()}')
pc.Disconnect()
Прямий виклик експортованих функцій libprocheck.so (Linux) або procheck.dll (Windows).
#include <stdio.h>
#include "procheck.h"
int main(void) {
// 1. Налаштувати UTF-8 та підключитись до принтера
SetStringEncoding(PROCHECK_ENCODING_UTF8);
ConnectLan(4000154869LL, "192.168.1.100", 9100);
// 2. Відкрити чек продажу
OpenReceipt(0, "");
AddReceiptText("Дякуємо за покупку!");
// 3. Додати позиції
Sale(1001, "Молоко 2,5% 1л", 45.50, 1.0, 1, 0, 0.0);
Sale(1002, "Хліб пшеничний", 28.00, 2.0, 1, 0, 0.0);
// 4. Оплата готівкою
double total = 45.50 + 28.00 * 2.0;
Pay(0, total);
// 5. Закрити чек і прочитати результат
if (CloseReceipt() == 0) {
printf("Чек № %s пробито\n", GetDataField(4));
printf("Посилання : %s\n", GetDataField(10));
printf("PDF (base64), розмір: %zu символів\n",
strlen(GetDataField(15)));
} else {
printf("Помилка: %s\n", GetLastErrorMessage());
}
Disconnect();
return 0;
}
Компіляція на Linux:
gcc demo.c -L. -lprocheck -Wl,-rpath,'$ORIGIN' -o demo
LD_LIBRARY_PATH=. ./demo
Через тонку Swift-обгортку над libprocheck.dylib. На iOS працює так само, відрізняється лише форма постачання бібліотеки (XCFramework замість dylib).
import ProCheck
// 1. Налаштувати UTF-8 та підключитись до мережевого ESC/POS-принтера
ProCheck.setStringEncoding(.utf8)
ProCheck.connectLan(id: 4_000_154_869, ip: "192.168.1.100", port: 9100)
// 2. Відкрити чек продажу
ProCheck.openReceipt(type: .sale)
ProCheck.addReceiptText("Дякуємо за покупку!")
// 3. Додати позиції
ProCheck.sale(code: 1001, name: "Молоко 2,5% 1л", price: 45.50, amount: 1.0)
ProCheck.sale(code: 1002, name: "Хліб пшеничний", price: 28.00, amount: 2.0)
// 4. Оплата готівкою
let total = 45.50 + 28.00 * 2.0
ProCheck.pay(type: .cash, sum: total)
// 5. Закрити чек і прочитати результат
if ProCheck.closeReceipt() == 0 {
print("Чек № \(ProCheck.dataField(at: 4)) пробито")
print("Посилання : \(ProCheck.dataField(at: 10))")
print("PDF (base64), розмір: \(ProCheck.dataField(at: 15).count) символів")
} else {
print("Помилка: \(ProCheck.lastErrorMessage)")
}
ProCheck.disconnect()
Збірка (macOS):
swift build -Xlinker -L. -Xlinker -lprocheck
DYLD_LIBRARY_PATH=. .build/debug/ProCheckDemo
Повний проект із Package.swift, module.modulemap та інструкцією для iOS — у Demo/Swift/.
Через тонку Java-обгортку над libprocheck.so за допомогою JNA. .so лежить у APK по шляху app/src/main/jniLibs/<ABI>/libprocheck.so.
ProCheck.Lib pc = ProCheck.L;
// 1. Налаштувати UTF-8 та підключитись до мережевого ESC/POS-принтера
pc.SetStringEncoding(ProCheck.ENCODING_UTF8);
pc.ConnectLan(4_000_154_869L, "192.168.1.100", 9100);
// 2. Відкрити чек продажу
pc.OpenReceipt(0, "");
pc.AddReceiptText("Дякуємо за покупку!");
// 3. Додати позиції
pc.Sale(1001L, "Молоко 2,5% 1л", 45.50, 1.0, 1, 0, 0.0);
pc.Sale(1002L, "Хліб пшеничний", 28.00, 2.0, 1, 0, 0.0);
// 4. Оплата готівкою
double total = 45.50 + 28.00 * 2.0;
pc.Pay(0, total);
// 5. Закрити чек і прочитати результат
if (pc.CloseReceipt() == 0) {
System.out.println("Чек № " + pc.GetDataField(4) + " пробито");
System.out.println("Посилання : " + pc.GetDataField(10));
System.out.println("PDF (base64), розмір: " + pc.GetDataField(15).length() + " символів");
} else {
System.out.println("Помилка: " + pc.GetLastErrorMessage());
}
pc.Disconnect();
Підключення JNA в app/build.gradle.kts:
dependencies {
implementation("net.java.dev.jna:jna:5.14.0@aar")
}
Повний Android Studio-проект із MainActivity, версткою та маніфестом — у Demo/AndroidJava/.
Через COM-сервер ProCheck.ProgramRRO (треба regsvr32 ProCheck.dll).
ПРРО = Новый COMОбъект("ProCheck.ProgramRRO");
// 1. Підключитись до мережевого ESC/POS-принтера
ПРРО.ConnectLan(4000154869, "192.168.1.100", 9100);
// 2. Відкрити чек продажу
ПРРО.OpenReceipt(0, "");
ПРРО.AddReceiptText("Дякуємо за покупку!");
// 3. Додати позиції
ПРРО.Sale(1001, "Молоко 2,5% 1л", 45.50, 1, 1, 0, 0);
ПРРО.Sale(1002, "Хліб пшеничний", 28.00, 2, 1, 0, 0);
// 4. Оплата готівкою
Сумма = 45.50 + 28.00 * 2;
ПРРО.Pay(0, Сумма);
// 5. Закрити чек і прочитати результат
Если ПРРО.CloseReceipt() = 0 Тогда
Сообщить("Чек № " + ПРРО.DataFields[4] + " пробито");
Сообщить("Посилання : " + ПРРО.DataFields[10]);
Сообщить("PDF (base64), розмір: " + СтрДлина(ПРРО.DataFields[15]) + " символів");
Иначе
Сообщить("Помилка: " + ПРРО.LastErrorMessage);
КонецЕсли;
ПРРО.Disconnect();
Усі три приклади роблять одне й те саме:
9100). Перший аргумент — фіскальний номер ПРРО, виданий при реєстрації каси.OpenReceipt(0, ""): 0 = продаж, порожній рядок — для повернення тут не потрібен.Sale(код, назва, ціна, кількість, група_ПДВ, тип_знижки, значення_знижки). Тип знижки 0 означає без знижки.Pay(0, сума): 0 = готівка.[4] — фіскальний номер чека[10] — посилання на чек[15] — PDF чека у base64[16] — SHA-256 хешПовний перелік методів та полів — у документації API.