JavaからProcess起動で Python 実行して PDF を作らせる。

Java プロセス起動実行として、既に作成した
yipuran-core/ScriptExecutor.java at master · yipuran/yipuran-core · GitHub
を使います。
用意する Python スクリプト make_pdf.py と、テンプレートになるPDF と 出力先を指定します。
印字するデータとして、 Supplier<Collection<String>> inputSupplier
String 文字列データのコレクション⇒ 実行スクリプトが標準入力で受信できるデータを渡します。

int sts = ScriptExecutor.run(()->"python  /var/make_pdf.py  /var/template.pdf  /var/out.pdf"
, ()->Arrays.asList("あ", "\n", "ABC", "\n\n")
, e->{
	logger.debug("### stdout ###\n" + e);
},(e, x)->{
	logger.debug("### stderr ###\n" + e);
	logger.warn(x.getMessage(), x);
});

Python コード make_pdf.py

# -*- coding: utf-8 -*-
import sys
import io
from pdfrw import PdfReader
from pdfrw.buildxobj import pagexobj
from pdfrw.toreportlab import makerl
from reportlab.pdfgen import canvas
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase import pdfmetrics
from PIL import Image
import codecs


# PDF作成メソッド
def create(template, resultfile, list):
    # テンプレート読込
    page = PdfReader(template, decompress=False).pages
    pp = pagexobj(page[0])
    # フォント指定
    fontname_g = "HeiseiKakuGo-W5"
    pdfmetrics.registerFont(UnicodeCIDFont(fontname_g))
    # 出力先指定
    cc = canvas.Canvas(resultfile)
    # フォント→ページセット
    cc.setFont(fontname_g, 16)
    cc.doForm(makerl(cc, pp))

    y_pos = 600
    for e in list:
        print("type = %s" % type(e))
        print(ascii(e))
        cc.drawString(100, y_pos, e)
        y_pos += 20

    cc.showPage()
    cc.save()
    return

#########################
if __name__ == '__main__':
    argv = sys.argv
    argvlen = len(argv)
    if argvlen != 3:
        sys.stderr.write('Error: argument [1]=template file  [2]=out file  required!')
        exit(1)
    else:
        inlist = []
        try:
            while True:
                inp = input('')
                if inp == '': break
                inlist.append(inp)
        except EOFError:
            pass
        print("=======================")
        print("template = %s" % argv[1])
        print("out = %s" % argv[2])
        # PDF作成実行
        create(argv[1], argv[2], inlist)

        print("writed !")
        exit(0)

Java の方で、単純に印字したうデータをリストコレクション(順序づけされたデータ)で渡して、
Python がそのまま順序でデータ受けて読み込んだPDF に上書きしていくだけだ。

Linux 環境で実行 問題なく動作する
Winows環境:コマンドプロンプトから実行 問題なく動作する
Winows環境:Eclipse の中で実行 失敗する

開発中、コードを書いている最中はよく、開発IDEを Eclipse を使っていて、Eclipse 上の
プログラム実行で起動するのは、頻繁に行うことであろう。

ここで、Eclipse から起動で失敗するのは、Eclipse 環境だけが、標準入出力環境を調整できず、
JavaからPython に渡すデータに2バイト文字が存在すると、意図しない文字コードで入出力が
行われて失敗する。
列)”あ" という文字は

>>> print(ascii('あ'))
'\u3042'

のはずであるが、、、
Eclipse から起動した Java から 上記のように Python が受け取るコードは、

'\u7e3a\udc82'

になってしまう。
これは、Python の PDF 作成の reportlab で、出力を実行する時、
reportlab.pdfgen.Canvas の drawString 等の実行で、
UnicodeEncodeError: 'utf-16-be' codec can't encode character
を引き起こしてしまう。
Eclipse から起動した時の為にどうしたらいいのか。。。

ーー
改善する→「JavaからProcess起動で Python 実行して PDF を作らせる。」 - Oboe吹きプログラマの黙示録