ブラザーのラベルライタの印刷アプリ

追加アプリケーションパッケージ、PETやSFSなどの話題です

モデレータ: 暇人, YoN, nyu

返信する
アバター
タロ兵衛
記事: 892
登録日時: 08/07/08(火) 00:11
お住まい: よこはま
連絡する:

ブラザーのラベルライタの印刷アプリ

投稿記事 by タロ兵衛 »

ブラザーのラベルプリンタPT-710 にLinuxから印刷するためのコマンドラインアプリです。
対象パピーは BookwormPup64-10.0.8 です

今回は完成アプリではなく、コンパイルして作成します
これは、プリンタの型名やIDなどの指定がソースコード内に書かれているためです

1) ソースコードの入手
  githubからお借りします。検索すると、似たコードがたくさん出てきますが、
 今回はNihlusさんのコードですC言語でかかれています(Cしか分からんのでこれにしましたw)
  https://github.com/Nihlus/ptouch-print

  ptouch-print-master.zip のようなファイルが手に入るはずです

2) devx_dpup_10.0.8.sfs をインストール

3)不足ライブラリのインストール
  3つですが、芋蔓式に結構入りますので、puppyを太らせたくない方は注意して下さい。
  aptを使って自動で入れたかったのですが、上手く行かないのでdebファイルは手動でdebianから落としました

  https://packages.debian.org/bookworm/libusb-1.0-0-dev
  https://packages.debian.org/bookworm/libexpat1
  https://packages.debian.org/bookworm/libgd-dev
  アーキテクチャはamd64です

  インストールはダウンロードしたフォルダから直接指定して行いました

コード: 全て選択

# apt update
# apt upgrade
# apt install ./libusb-1.0-0-dev_1.0.26-1_amd64.deb 
# apt install ./libexpat1_2.5.0-1+deb12u1_amd64.deb 
# apt install ./libgd-dev_2.3.3-9_amd64.deb 
4) USBのIDの取得
  プリンタをUSBケーブルでつなぎ、電源を入れて、10程度待ちます
  lsusb を実行して、接続されている機器の一覧の中からラベルプリンタを探します
  今回使う PT-P710BT は04f9:20afでした

コード: 全て選択

# lsusb
Bus 009 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 008 Device 002: ID 04f9:20af Brother Industries, Ltd PT-P710BT
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
5) 解凍とソース変更(プリンタの登録)
  ptouch-print-master.zip を任意の空フォルダ内に解凍します
  解凍してできたフォルダのsrcフォルダの libptouch.c をエディタで開きます
  このファイルの69行目付近({0, 0, "", 0, 0, 0}の上)に、IDや名称を追記します
  パラメタの詳しい意味は分かっていません。他のプリンタを真似て作っています

コード: 全て選択

	{0x04f9, 0x2073, "PT-D450", 180, 16, FLAG_RASTER_PACKBITS},
	{0x04f9, 0x200d, "PT-3600", 360, 48, FLAG_RASTER_PACKBITS},
	/* Notes about the PT-D450: I'm unsure if print width really is 128px */

	{0x04f9, 0x20af, "PT-P710", 180, 16, FLAG_RASTER_PACKBITS},     /* <-- Line 69  PT-P710 */

	{0, 0, "", 0, 0, 0}
};
6) コンパイル
  解凍したフォルダに移動して、READMEに従いコンパイルしていきます

コード: 全て選択

./autogen.sh
./configure --prefix=/usr
make
  これで実行ファイル「ptouch-print」ができあがているはずです。
  これをmy-applicationsなどパスの通ったフォルダに移動して完成です

7) 実行例
  詳しくは--help で使い方を読んで下さい

コード: 全て選択

# ptouch-print --font M+1P+IPAG --fontsize 100 --text 焼肉定食
PT-P710BT found on USB bus 8, device 2
setting font size=100
# 
  漢字も印字可能ですが、フォント名を指定してサイズを指定して下さい
  私の場合、一番下のラインが切れてしまいました。font size=100で収まりました

印字例
.
添付ファイルを見るにはパーミッションが必要です
neo実験君こと次期メインマシン
Intel Core i5-8400 2.80GHz
xenialpup64 7.5+lang_pack_ja-xenial64e
アバター
タロ兵衛
記事: 892
登録日時: 08/07/08(火) 00:11
お住まい: よこはま
連絡する:

フォントの上下ズレ対策

投稿記事 by タロ兵衛 »

フォントによって、印字位置が上下にずれることがあるので、オプションを追加してみました
起動時に「--vertical 25」のように移動量を指定して位置調整ができます。与える数値の単位は分かっていません。トライアンドエラーで調整して下さい(調整時は--writepng オプションが便利)
使用例

コード: 全て選択

ptouch-print --font "Noto Sans  CJK JP:Thin" --fontsize 90  --vertical 25 --writepng test.png --text 柴犬
パラメタの意味
--font "Noto Sans CJK JP:Thin"
 ・フォントはNoto Sans CJK JPを使用して、文字の太さはThinで
--fontsize 100
 ・フォントの大きさ(単位は不明)
--vertical 25
 ・縦方向のオフセットを25に設定(上にはみ出したフォントが降りてきます)
--writepng test.png
 ・実際の印字は行わず「test.png 」に出力する
--text 柴犬
 印字する文字

パッチ
 ・「PT-P710」の設定入

コード: 全て選択

--- /home/ptouch/org/libptouch.c
+++ /home/ptouch/src/libptouch.c
@@ -61,6 +61,7 @@
 	{0x04f9, 0x205f, "PT-E500", 180, 16, FLAG_RASTER_PACKBITS},
 	/* Note about the PT-E500: was reported by Jesse Becker with the
 	   remark that it also needs some padding (white pixels) */
+	{0x04f9, 0x20af, "PT-P710", 180, 16, FLAG_RASTER_PACKBITS},
 	{0x04f9, 0x2061, "PT-P700", 180, 16, FLAG_RASTER_PACKBITS|FLAG_P700_INIT},
 	{0x04f9, 0x2064, "PT-P700 (PLite Mode)", 128, 16, FLAG_PLITE},
 	{0x04f9, 0x2073, "PT-D450", 180, 16, FLAG_RASTER_PACKBITS},

コード: 全て選択

--- /home/ptouch/org/ptouch-print.c
+++ /home/ptouch/src/ptouch-print.c
@@ -47,7 +47,7 @@
 int write_png(gdImage *im, const char *file);
 gdImage *img_append(gdImage *in_1, gdImage *in_2);
 gdImage *img_cutmark(int tape_width);
-gdImage *render_text(char *font, char *line[], int lines, int tape_width);
+gdImage *render_text(char *font, char *line[], int lines, int tape_width, int v_adj);
 void unsupported_printer(ptouch_dev ptdev);
 void usage(char *progname);
 int parse_args(int argc, char **argv);
@@ -212,7 +212,7 @@
 	return brect[2]-brect[0];
 }
 
-gdImage *render_text(char *font, char *line[], int lines, int tape_width)
+gdImage *render_text(char *font, char *line[], int lines, int tape_width, int v_adj)
 {
 	int brect[8];
 	int i, black, x=0, tmp=0, fsz=0;
@@ -270,7 +270,7 @@
 	}
 	/* now render lines */
 	for (i=0; i<lines; i++) {
-		int ofs=get_baselineoffset(line[i], font_file, fsz);
+		int ofs=get_baselineoffset(line[i], font_file, fsz)-v_adj;
 		int pos=((i)*(tape_width/(lines)))+(max_height)-ofs-1;
 		if (debug) {
 			printf("debug: line %i pos=%i ofs=%i\n", i+1, pos, ofs);
@@ -379,6 +379,7 @@
 	printf("\t\t\t\tIf the text contains spaces, use quotation marks\n\t\t\t\taround it.\n");
 	printf("\t--cutmark\t\tPrint a mark where the tape should be cut\n");
 	printf("\t--fontsize\t\tManually set fontsize\n");
+	printf("\t--vertical\t\toffset vertical position\n");
 	printf("\t--pad <n>\t\tAdd n pixels padding (blank tape)\n");
 	exit(1);
 }
@@ -395,6 +396,12 @@
 		if (strcmp(&argv[i][1], "-font") == 0) {
 			if (i+1<argc) {
 				font_file=argv[++i];
+			} else {
+				usage(argv[0]);
+			}
+		} else if (strcmp(&argv[i][1], "-vertical") == 0) {
+			if (i+1<argc) {
+				i++;
 			} else {
 				usage(argv[0]);
 			}
@@ -447,7 +454,7 @@
 
 int main(int argc, char *argv[])
 {
-	int i, lines = 0, tape_width;
+	int i, lines = 0, tape_width, v_adj = 0;
 	char *line[MAX_LINES];
 	gdImage *im=NULL;
 	gdImage *out=NULL;
@@ -478,6 +485,12 @@
 		if (strcmp(&argv[i][1], "-font") == 0) {
 			if (i+1<argc) {
 				font_file=argv[++i];
+			} else {
+				usage(argv[0]);
+			}
+		} else if (strcmp(&argv[i][1], "-vertical") == 0) {
+			if (i+1<argc) {
+				v_adj=strtol(argv[++i], NULL, 10);
 			} else {
 				usage(argv[0]);
 			}
@@ -519,7 +532,7 @@
 				line[lines]=argv[i];
 			}
 			if (lines) {
-				if ((im=render_text(font_file, line, lines, tape_width)) == NULL) {
+				if ((im=render_text(font_file, line, lines, tape_width, v_adj)) == NULL) {
 					printf(_("could not render text\n"));
 					return 1;
 				}
neo実験君こと次期メインマシン
Intel Core i5-8400 2.80GHz
xenialpup64 7.5+lang_pack_ja-xenial64e
返信する