自由記述の文章を PDF 化する方法【プログラム・テクニカル】|Flutter
Bing AI と ChatGPT と phind に尋ねると、Flutter で PDF 文書を構築するには「pdf」パッケージを使うように勧められる。
凄い、そこまで言うか Bing AI さん…他にも「syncfusion_flutter_pdf」など好評なパッケージは存在するのだが、こちらは”有償”なので、素直に勧められた無償の「pdf」パッケージを使う。
[AD] ドラゴンクエストモンスターズ 3 魔族の王子とエルフの旅|ニンテンドースイッチ(メルカリ)
テクニカルな情報が少ない
…しかし、Flutter における PDF 化に関する情報は、少ない。
以下は「pdf」パッケージの導入では大変に参考となったサイト等なのだが、残念ながら、メモ帳『Documentally(iOS / Android)』アプリで自由記述の文章を PDF 化するにあたっては、痒いところに手が届かなかった。
[AD] ドラゴンクエストモンスターズ 3 魔族の王子とエルフの旅|ニンテンドースイッチ(メルカリ)
ページの分割が悩ましい
「pdf」パッケージには「Page」という概念があり、そのまま PDF 文書のページを指すのだが、難儀なことに、1 ページに収める文章の量をきちんと計算して決めなければならない。
一見、「MultiPage」があれば、万事が解決するように思える仕様なのだが、これが罠だった。「pdf」パッケージは、例えば以下のように構成される(実装する)。
Page
└ Widget(Text など)
└ Widget(Image など)
└ Widget(Paragraph など)
このとき、最後の Widget が 1 ページ内に収まらなかったら、エラーになる。Widget の数やその内容量を正しく計算しないとならない。
これが「MultiPage」の場合、最後の Widget が 1 ページ内に収まらなかったら、その最後の Widget を 2 ページ目に配置してくれる。
確かにこれは便利。うむ、これで問題ないように思えるが…?
この構成で、この Text に含めた文章が、1 ページに収まらない非常に非常に長い文章だった場合、エラーになる。何故なら、1 ページに収まらないから。単純明快。
「MultiPage」は、溢れた Widget を 2 ページ目に自動で配置してくれる機能であって、文章そのものの量は見ていない。Widget の中に含める文章の量は、実装者が計算しなければならない、、、これは難易度が高い。
日本語の文章を切る難しさ
どう対応するか…パッとすぐに思いつくのが「文章を切る」だ。AI たちの見解も同じ(で何故かホッと安心する)。
「特定の単語や文字列」で、文章を分割。さて、どうやって?
改行で切る
句読点で切る
日本語では空白を使うことは殆どないので、この二択になると思う。
しかし、これでは問題がある。改行の全くない文章で、1 ページを超えてしまったら対応できないし、句読点がない文章であっても成立しない。殆どの場合、句読点はあるだろうが、腑に落ちない結果になる。
長い文章を、実装上はこのように構成しなければならないのだが、例えば、以下の文章があったとする。
この改行がない文章を「。」で分割して再構築した場合、PDF 文書上では、以下になってしまう。
つまり、書き手(ユーザ)が意図しない箇所で、改行を入れなければならなくなる。
ライティングのプロであれば、いや、そうでなくても、改行によって、読み手の印象が大きく変わってしまう恐れがあるこのことは、許し難いのではないだろうか?
少なくとも、メモ帳『Documentally(iOS / Android)』アプリで PDF 化を実現するにあたっては、これは絶対に許容できないことだった。
[AD] ドラゴンクエストモンスターズ 3 魔族の王子とエルフの旅|ニンテンドースイッチ(メルカリ)
OOM も回避した実現方法は泥臭かった
Flutter の PDF 化に関するテクニカルな情報は、本当に少ないのだが、皆、どうやって解決したのだろうか。文章の PDF 化がそもそも需要ないのか…?
改行もダメ、句読点もダメ…そうなると、もう、非常に泥臭い解決策になってしまった。
ここから先は
この記事が気に入ったらサポートをしてみませんか?