PDF - テキストオブジェクト - Excelセル結合のワナ
はじめに
Excel を PDF 化した場合、PDF 内のテキストオブジェクト(文字列オブジェクト)は、行単位のデータとして格納されます。
[A1セルの文字列 + B1セルの文字列 + ...]
[A2セルの文字列 + B2セルの文字列 + ...]
:
このような基本動作を阻む「Excelセル結合のワナ」について記載しようと思います。
参考情報
下記情報を参考にさせて頂きました。
利用ツール
iText7-RUPS-7.2.5.zip をダウンロード/解凍、Java Runtime を別途導入した後、itext-rups-7.2.5.jar を起動します。
テスト環境
ここに記載した情報は、Windows 11 24H2 で確認しています。
Excelセル結合のワナ
数年前、C# で PDF からの文字抽出ソフトを利用して、収集した PDF に対して文字抽出の確認時、期待する文字列が取得できないケースに遭遇しました。
本来の期待値
2025 年 1 月 25 日
実際の取得値
年 月 日
[他データ 数行]
2025
1
25
PDF 内の情報から、Excel から「Microsoft Print To PDF」で PDF 化したものだと確認できました。
原本 Excel が手元にありませんでしたが、対象 PDF を Excel で再現して、セル結合が起因とわかりました。
Excel を PDF 化して、PDF からの文字抽出ソフトで文字抽出を行うと、下記結果が得られます。
見積作成日 年 月 日
見積有効期限 年 月 日
上記2行 E-F、H-I、K-L 列はセル結合
2025
1
25
2025
2
25
Adobe Acorbat で該当 PDF を表示して、コピペ選択をすると、セル結合を避けて選択されることも確認しました。
確認調査
状況証拠を押さえましたが、確認調査として、PDF ストリームを見てみることにします。
テキストオブジェクト
PDF に格納されているテキストオブジェクトは、ストリームで確認すると、BT
~ET
として展開されます。
BT
テキストレンダリングモード Tr
フォント情報 Tf
テキスト空間変換行列 Tm
テキスト Tj
ET
セル結合なし
ストリーム確認を単純にしたいので、コンパクトな下記 Excel を用意します。
Excel から PDF出力して、PDF を itext/rups でストリーム確認してみます。
最初の BT
~ET
が、Excel 1行目に対応するテキストオブジェクトで、文字データは下記のようになります。
<0024> → A
<0025> → B
<0026> → C
続いて2個目のテキストオブジェクト(テキスト空間変換行列が異なり、同一テキストデータの Excel 2行目)が確認できます。
以上から、Excel を PDF 化した場合、基本的には、行単位のテキストオブジェクトが生成されることがわかりました。
対象 PDF に対して、PDF からの文字抽出ソフトで文字抽出を行うと、下記結果が得られます。
A B C
A B C
セル結合あり
A1 と B1 をセル結合した状態にします。
Excel から PDF 出力して、PDF を itext/rups でストリーム確認してみます。
1個目のテキストオブジェクトは、セル結合を除いた1行目データです。
2個目のテキストオブジェクトは、セル結合なしと同一です。
3個目のテキストオブジェクトは、セル結合されている A1-B1 セルだと確認できます。
Excel から PDF を作成すると、まず、 セル結合を除いて、すべての行データをテキストオブジェクトにした後、セル結合されているセルひとつずつを、テキストオブジェクトにしているようです。
対象 PDF に対して、PDF からの文字抽出ソフトで文字抽出を行うと、下記結果が得られます。
C
A B C
AB
以上で、Excel セル結合によるテキストオブジェクトに対する影響を、PDF ストリームで確認できました。
::: note
後述「おまけ」の結果では、セル結合されていない同一行の複数テキストオブジェクトが1行にまとめて文字抽出されています。
しかし、「Excelセル結合のワナ」記載例を見るとわかるように、2025
1
25
と連続している同一行のセル結合単位の複数テキストオブジェクトが、1行にまとめて文字抽出されていません。
このため、テキストオブジェクトを座標情報で並び替えるだけでは解決しませんね。
:::
おまけ
「セル結合なし」で利用した Excel に対して、B1 セルのフォント種類とサイズを変更して、フォント変更に対する影響も一応確認することとします。
Excel から PDF 出力して、PDF を itext/rups でストリーム確認してみます。
テキストオブジェクトは下記4個が出力されていました。
- A1セルの文字列
- B1セルの文字列
- C1セルの文字列
- 2行目(A2 + B2 + C2)の文字列
対象 PDF に対して、PDF からの文字抽出ソフトで文字抽出を行うと、下記結果が得られます。
A B C
A B C
フォント変更でテキストオブジェクトが分離されていても、同一行のテキストオブジェクトが連続していれば、1行のデータとして処理してくれるようです。
まとめ
「PDFファイルは印刷した結果のみを保証するもの」という前提なので、期待する文字抽出を得たいなら、PDF からの文字抽出ソフト側で対処すべきということになります。
「Excelセル結合のワナ」については、PDF からの文字抽出ソフトに、テキストオブジェクトを座標情報で並び替える機能と、セル結合テキストオブジェクトでも連続していれば1行にまとめる機能が必要となります。
また、意図している文字列が取得できないパターンとしては、下記ケースがあげられていたので、用途にあわせて確認が必要です。
- ページ内が段組み、コラム、表、図などのブロックで分割・構成されているとき、ブロックとして適切に認識することができない
出典
本記事は、2025/01/23 Qiita 投稿記事の転載です。
Discussion