0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

odooのPDF帳票で「奈良県葛城市」を出力する

Last updated at Posted at 2023-11-11

地名や人名の異体字

東京都葛飾区の「葛」と奈良県葛城市の「葛」とでは、字形が異なっているそうです。行政実務や冠婚葬祭の案内状などでは、これらを正確に表したいところですが、コンピュータの一般的なフォントでは、これらを区別できませんでした。

東京都葛飾区の「葛」と奈良県葛城市の「葛」
image.png

行政実務における人名の記載を主な目的とし、これらの字形の差異を区別しているのが、IPAmj明朝フォントです。

odooの帳票出力エンジンと問題点

odooでは、QWeb Reportsを使ってHTML帳票やPDF帳票を出力できます。標準でOdoo Unicode Support NotoフォントがCSSによりfont-familyとして指定されていますので、漢字やかなの出力も可能です。
しかし、異体字(IVS)を含むと、PDF帳票で縮退文字+空白文字に文字化けして出力されてしまいます。
これは、odoo内部でwkhtmltopdfを使ってhtmlからpdfに変換しており、このwkhtmltopdfがIVSに対応していないことが理由であると考えられます。

OCAのreporting-engine - Py3o Reporting Engine

OCA(Odoo Community Association)の有志によって、 OCA/reporting-engine が公開されており、その中に、LibreOfficeをベースとしたレポートエンジンである Py3o Reporting Engine(report_py3o) が含まれています。
LibreOffice自体は、IVSに対応していますので、IPAmj明朝フォントを使って異体字でも正常にpdf帳票として出力できます。

インストール - Py3o Reporte Engine(report_py3o)

report_py3oのインストールを参考に次のアプリやモジュール等をインストールします。

LibreOffice アプリケーション

sudo apt-get -y install --no-install-recommends libreoffice

py3o.template と py3o.formats ライブラリ

sudo pip3 --disable-pip-version-check --no-cache-dir install --upgrade py3o.template py3o.formats

report_py3o モジュール

cd /opt/odoo
git clone --branch=16.0 --depth=1 https://github.com/OCA/reporting-engine.git oca/reporting-engine

oca/reporting-engine のパスを odoo.conf に追記します。

/etc/odoo/odoo.conf
[options]
:
addons_path = /opt/odoo/odoo/odoo/addons,/opt/odoo/odoo/addons,/opt/odoo/oca/reporting-engine
:

IPAmj明朝フォント

# ローカルにインストール
mkdir -p ~/.local/share/fonts

# IPAmj明朝フォント
curl -o ipamjm00601.zip -sSL https://dforest.watch.impress.co.jp/library/i/ipamjfont/10750/ipamjm00601.zip
unzip ipamjm00601.zip -d ~/.local/share/fonts/ipamjm0601

# キャッシュ
fc-cache -vf
fc-list | grep ipa

IPAmj明朝フォントのインストール先
LibreOfficeからフォントを検索・取得できるように ~/.local/share/fonts/ 内にインストールします。

有効化 - Py3o Reporte Engine(report_py3o)

odooサーバーを起動(再起動)し、 AppsPy3o Reporte Engine(report_py3o) モジュールを 有効化(ACTIVATE) します。

image.png

Py3o帳票テンプレートのサンプル

Sample py3o report templates プロジェクトで、 Py3o Reporte Engine を使った Py3o帳票テンプレート のサンプルが公開されています。
ここでは、その中の Sale Report Py3o(sale_report_py3o) モジュールを 有効化(ACTIVATE) して、帳票の出力を確認してみます。

サンプルモジュールと依存モジュールのインストール

Sale Report Py3o(sale_report_py3o) モジュールは、いくつかの外部モジュールに依存していますので、それらも一緒にインストールします。

cd /opt/odoo/oca
export ODOO_VERSION="16.0"

git clone --branch=${ODOO_VERSION} --depth=1 https://github.com/akretion/odoo-py3o-report-templates

git clone --branch=${ODOO_VERSION} --depth=1 https://github.com/akretion/odoo-usability
git clone --branch=${ODOO_VERSION} --depth=1 https://github.com/OCA/bank-payment
git clone --branch=${ODOO_VERSION} --depth=1 https://github.com/OCA/sale-workflow
git clone --branch=${ODOO_VERSION} --depth=1 https://github.com/OCA/server-tools

sudo pip3 --disable-pip-version-check --no-cache-dir install --upgrade astor

プロジェクト(モジュール)のパスを odoo.conf に追記します。

/etc/odoo/odoo.conf
[options]
:
addons_path = /opt/odoo/odoo/odoo/addons,/opt/odoo/odoo/addons,/opt/odoo/oca/reporting-engine
    ,/opt/odoo/oca/odoo-py3o-report-templates
    ,/opt/odoo/oca/odoo-usability
    ,/opt/odoo/oca/bank-payment
    ,/opt/odoo/oca/sale-workflow
    ,/opt/odoo/oca/server-tools
:

有効化 - Salesアプリ と Sale Report Py3oモジュール

odooサーバーを起動(再起動)し、 AppsSales アプリと Sale Report Py3o(sale_report_py3o) モジュールとを 有効化(ACTIVATE) します。

Salesアプリの帳票出力

Sales アプリでデータの S000003 を開き、 Print で、 Quotation / Order を選択すると ODT形式の Quotation - S00003.odt が出力されます(ダウンロード)。

image.png

Sales帳票のPDF帳票化(IPAmj明朝フォントの埋め込み)

Quotation / Order 帳票の一部のデータ項目を IPAmj明朝フォント に変更し、帳票をPDF形式で出力してみます。尚、出力されたPDF形式ファイルには、 IPAmj明朝フォントが埋め込まれます。

ODTテンプレートの編集

Quotation / Order 帳票のODTテンプレートは、次のファイルです。

odoo-py3o-report-templates/sale_report_py3o/sale_order.odt

このファイルを LibreOffice で開き、例えば、 「Invoice Address」データ項目 ([partner_invoice_id])のフォントを IPAmj明朝 に変更し、ファイルを保存します。
image.png

アジア諸言語用フォントの変更

サンプルのテンプレートファイルは、言語が フランス語 で作成されており、アジア諸言語用フォントに Noto Sans CJK SC Regular が指定されています。
西洋諸言語用フォントアジア諸言語用フォント との両方に IPAmj明朝 フォントを指定してください。

image.png

PDF形式への切り替え

odoo-py3o-report-templates/sale_report_py3o/report.xml ファイルで、 レポートの出力形式(py3o_filetype)odt から pdf に変更し、モジュールをアップグレードすると、 PrintQuotation / Order で、PDF形式の Quotation - xxxxxx.pdf が出力されます。

変更: <field name="py3o_filetype">pdf</field>

sale_report_py3o/report.xml
<?xml version="1.0" encoding="utf-8"?>
<odoo>

...

<record id="sale.action_report_saleorder" model="ir.actions.report">
    <field name="report_type">py3o</field>
    <!--
    <field name="py3o_filetype">odt</field>
    -->
    <field name="py3o_filetype">pdf</field>
    <field name="module">sale_report_py3o</field>
    <field name="py3o_template_fallback">sale_order.odt</field>
    <!--
    <field name="py3o_server_id" ref="local_py3o_server"/>
    <field name="py3o_filetype">pdf</field>
    <field name="print_report_name">object.name + '-' + object.date_order.strftime('%Y-%m-%d') + '-' + object.commercial_partner_id.name.replace(' ', '_') + '.pdf'</field>
    -->

</record>

...

</odoo>

異体字を含む地名の登録とPDF帳票出力

Sales アプリを開き、Salesデータの住所を 奈良県葛城市 として登録します。
「葛󠄂」 の文字は、MJ022335 のページを開き、 コピーフィールド から文字をコピーしてペーストします。

image.png

【出力結果】
PrintQuotation / Order で、PDF形式の Quotation - xxxxxx.pdf が出力されます。

image.png

IPAmjMincho(埋め込みサブセット)
Acrobat Reader 等のPDFビューワーで開き、文書のプロパティを確認すると、 IPAmjMincho フォントが埋め込まれている ことがわかります。
フォントが埋め込まれているため、 IPAmj明朝フォントインストールされていないデバイス でこのPDFファイルを開いても、この字形で正しく表示出力されます。
image.png

おわりに

odooサーバーに Py3o Reporte Engine をインストールし、異体字を含む 「奈良県葛城市」 のデータをPDF帳票として出力しました。
また、出力されたPDFファイルには、 IPAmj明朝フォント が埋め込まれていることを確認しました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?