PDFの透明テキスト抽出における順序保持の課題と解決策

はじめに PDFファイルから透明テキストレイヤーを抽出する際、「テキストの順序が元のPDFと異なってしまう」という問題に直面しました。本記事では、この問題の原因と、JavaScriptとPythonそれぞれでの解決策について解説します。誤っている点もあるかもしれませんが、参考になりましたら幸いです。 PDFの透明テキストとは PDFの透明テキストレイヤーは、PDFファイル内に埋め込まれた検索可能なテキスト情報です。OCR処理されたPDFや、デジタル生成されたPDFには、この透明テキストレイヤーが含まれており、以下のような機能を実現しています: テキスト検索 コピー&ペースト スクリーンリーダーによる読み上げ 機械翻訳 問題:テキストの順序が乱れる理由 PDFの内部構造 PDFファイルは、テキストを「コンテンツストリーム」という形式で保存しています。このストリームには、テキストとその位置情報が含まれていますが、必ずしも読む順序で格納されているわけではありません。 例 [ [ [ : 位 位 位 P 置 置 置 D : : : F コ x x x ン = = = テ 1 3 1 ン 0 0 0 ツ 0 0 0 ス , , , ト リ y y y ー = = = ム 2 4 3 の 0 0 0 概 0 0 0 念 , , , 図 テ テ テ キ キ キ ス ス ス ト ト ト = = = " " " 見 脚 本 出 注 文 し " " " ] ] ] 一般的な抽出方法の問題点 多くのPDF処理ライブラリは、以下のような手順でテキストを抽出します: ...

2025年9月10日 · 21 分 · Nakamura

校異源氏物語テキストDBのTEI/XMLからPDFを作成する

概要 校異源氏物語テキストDBは、『校異源氏物語』のテキストデータを公開するデータベースです。 https://kouigenjimonogatari.github.io/ 今回、本DBに以下のようなPDFファイルを追加しました。 https://kouigenjimonogatari.github.io/output/01/main.pdf 本記事は、上記のようなPDFファイルを、XSLTとTeXを使って作成します。 リポジトリのクローン 以下のように、リポジトリをクローンします。 g i t c l o n e - d e p t h 1 h t t p s : / / g i t h u b . c o m / k o u i g e n j i m o n o g a t a r i / k o u i g e n j i m o n o g a t a r i . g i t h u b . i o そして以下のコマンドにより、xslt3をインストールします。 ...

2025年1月14日 · 8 分 · Nakamura

Google Cloud Vision APIを用いて、単一ページから構成される透明テキスト付きPDFを作成する

概要 PDFを対象に、Google Cloud Vision APIを使って、透明テキスト付きPDFを作成する機会がありましたので、備忘録です。 以下、simpleで検索した例です。 背景 今回は単一ページから構成されるPDFを対象とします。 手順 画像の作成 OCRの対象とする画像を作成します。 デフォルトの設定だとボヤけた画像ができてしまったので、解像度を2倍に設定し、また後述するプロセスで、解像度を考慮した位置合わせを実施しています。 以下をインストールします。 P P y i M l u l P o D w F i f i f i # i o # p p # # z # m p i i m r m r m n u d a o a i m m p o p o p 入 p t 入 f g ペ p o 解 t x g g o m o m o 力 u p 力 _ e ー i m 像 . r r r P t u P d ジ x 度 = = = s t P t t t D _ t D o = を = を a I q F p _ F c 画 = 上 f p I v f L j d i フ d p フ u p 像 2 げ i a m e i s m o ァ f d ァ m d と p . る t g a ( t i o イ _ f イ e f し a 0 た z e g " z m n i ル p _ ル n _ て g め . . e . p m と a p を t d レ e に M g . o p 出 t a 開 o ン . ズ a e i # r o 力 h t き = c ダ g ー t t p m t r P h 、 u リ e ム r _ e a P t D = 単 f m ン t 設 i p n g y I F = 一 i e グ _ 定 x i ( e M m t フ " ペ t n し p ( x i . u a q ァ . " ー z t 、 i z m o p P g d イ / . ジ . [ O x o a . n D e m ル i / を o 0 C m o p B g F n o 読 p ] R a m ( y " p u み e で p , m t ) u t 込 n テ ( a e t p み ( # キ ) z t s . u i ス o r I p t n 最 ト o i O d . p 初 を # m x ( f p u の 抽 ) = p " d t ペ 出 解 m i f _ ー 像 a x " p ジ 度 t . # d を 3 ) t f 選 0 o 単 _ 択 0 b 一 p y ペ a D t ー t P e ジ h I s の ) で ( P レ " D ン p F ダ n フ リ g ァ ン " イ グ ) ル ) ) Google Cloud Vision API 出力された画像を対象に、Google Cloud Vision APIを適用します。 ...

2024年11月2日 · 9 分 · Nakamura

File Information Tool Set (FITS)を試す

概要 Archivematicaの調査にあたり、File Information Tool Set (FITS)の挙動について確認したい点があり、Dockerを使って試してみましたので、その備忘録です。 https://github.com/harvard-lts/fits インストール 以下にDockerを用いたインストール方法が記載されています。 https://github.com/harvard-lts/fits?tab=readme-ov-file#docker-installation ただ、マニュアルに記載のある以下のページにアクセスしても、Dockerfileが含まれる最新のリリース(1.6.0)はダウンロードできませんでした。 https://projects.iq.harvard.edu/fits/downloads 代わりに、GitHubの以下のリリースページで、最新版のzipファイルをダウンロードできました。 https://github.com/harvard-lts/fits/releases/tag/1.6.0 あとは、READMEの記載の通りに展開、およびビルドを行いました。 ただし、M1 Macの場合、手順通りに実行したところ、以下のエラーが発生しました。 % 2 j l l 0 a i i o d 2 v b b p o 4 a m m t c - . e e / k 0 l d d f e 1 a i i i r - n a a t 2 g i i s r 6 . n n / u U f f t n 1 n o o o 1 s . . o : a s s l - 4 t o o s r 1 i : : / m : s m 1 f c c e 0 i a a d e n n i - d n n a ` L o o i p E i t t n w R n f d R k o o o ` O E p p / : R r e e l / r n n i w - o n o r s s u r M : h h x k e a a / d U r r l f i n e e i i a a d d b t I b m s n l o o e f e b b d - o j j i i : t e e a 9 o c c i f 5 t t n i l f t - o f f o s a i i . . E d l l s s r e e o h r l : : . o i 0 r b N N : r o o l a c o r s s a a y u u n d c c n i ' h h o n m t g e f f d i i o n i l l p a a e e e t i n i n o o v f r r s e o h ' d d a l : i i r i r r e b e e d r c c a t t o r o o b y r r j y y e f c o t r f t i h l i e s : o N p o e r s a u t c i h n g f i s l y e s t o e r m d f i o r r e c t t o o o r l y : M e d i a I n f o . o s t y p e = [ L i n u x ] j v m M o d e l = [ 6 4 ] n a t i v e L i b P a t h = [ / o p t / f i t s / t o o l s / m e d i a i n f o / l i n u x ] N o n a t i v e M e d i a I n f o l i b r a r y f o r t h i s O S これに対して、ChatGPT 4に確認した結果、Dockerfileに以下の追記を行う指示がありました。 ...

2024年1月26日 · 28 分 · Nakamura

IIIFマニフェストファイルからPDFファイルを作成する

概要 IIIFマニフェストファイルからPDFファイルを作成する機会がありました。このソリューションとして、以下のリポジトリが見つかりましたが、うまく動かすことができませんでした。 https://github.com/jbaiter/pdiiif そこで、上記リポジトリはJavaScriptを使用していますが、今回はPythonを用いた変換ツールを作成しました。 使い方 以下のノートブックからお試しいただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/iiif2pdf.ipynb 初回インストール時に、img2pdfをインストールしますが、PILのバージョンの関係で、「RESTART RUNTIME」ボタンが表示されますので、クリックの上、再度同じセルを実行してください。 オプションとして、「IIIFマニフェストURLの指定」「画像が格納されているフォルダのパスの指定」「ローカルに存在するIIIFマニフェストファイルのパスの指定」の3種類を用意しています。 注意点として、2023年5月末時点では、IIIF Presentation API v2にのみ対応しています。v3へは今後の対応を検討しています。 まとめ IIIFからのPDFファイルの作成にあたり、参考になりましたら幸いです。

2023年5月26日 · 1 分 · Nakamura

TEI Critical Apparatus Toolboxを用いてTEI XMLをLaTeXに変換してみる

概要 TEI Critical Apparatus Toolboxは、a tool for people preparing a natively digital TEI critical editionです。日本語訳の一例は以下です。 ネイティブ デジタル TEI クリティカル エディションを準備する人々のためのツール http://teicat.huma-num.fr/index.php 校異情報を可視化する機能を提供する他、複数の便利な機能を提供しています。 その中で、「TEI から LaTeX および PDF への変換」機能があることを教えていただいたので試してみます。 Print an edition 以下にアクセスします。 http://teicat.huma-num.fr/print.php this dummy edition fileという文字列のリンクをクリックして、以下のサンプルデータをダウンロードします。 http://teicat.huma-num.fr/print-feature-test-file.xml 上記のファイルを本ツールにアップロードします。変換に関する様々なオプションが用意されていますが、デフォルト設定のまま、画面下部の「送信」ボタンをクリックします。 すると、zipファイルがダウンロードされます。myEditionというフォルダが展開され、.log、.pdf、.texの3つのファイルが格納されていることが確認できます。 PDFの例は以下です。 TEXの例は以下です。 注意 2023年4月時点において、上記の機能は日本語を含むxmlファイルではうまく出力できませんでした。この点の改善についても今後検討してみたいと思います。 まとめ TEI/XMLファイルの変換ツール、フローを検討する上で、参考になりましたら幸いです。

2023年4月19日 · 1 分 · Nakamura

TEI/XMLファイルを縦書きPDFに変換する方法の1例

概要 TEI/XMLファイルを縦書きPDFに変換する方法について、その1例を備忘録として残します。 以下のノートブックで、「校異源氏物語」を対象としたプログラムをお試しいただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/TEI_XMLファイルを縦書きPDFに変換する.ipynb 変換の流れ 今回は、Quartoを使用しています。 https://quarto.org/ インストールの方法は以下を参考にしてください。 https://quarto.org/docs/get-started/ TEI/XML -> qmd まずTEI/XMLファイルの内容をqmdファイルに変換します。以下は、変換スクリプトのサンプルです。 f s e i i t a e t f o o t t a f { " w r o l m d i u l e o p s e i u o t " i o u e p t t e x r a . x t t r e " t m p m o = l h m t t m t l h m x h e r e o e e i i h a e o a d t f b = n t o r n = f f k = : r t o . o . s t s = t i = e : : c s p w 4 B s o . = s " n e e d f " x t e r e s p s " . t . t f i " { " : r r n i i a = a o s = e n e n e " r " t { e i ( t m u t u o l a x a x d s " i a f p o e p t s h p u s e m t m t a ( - t u e ( p ( o i o . . p o m e e t o - l t r ) a t r f u s f . u e + + a s - e h e } t e t u p p i f p n = = = = / . } o n h x l . l n i . t = = { p " r c , t B S f i d n f s " e i a } e ) e o i t ( d i : " \ " . d t " - " a u n e " ( n p n s t } h d w u p d x t " d b " e e . . o " t ( C t i a ( " g x q d c ) i o h ( t u " : " t m i : f p i o l t b : d r a u e l s e h o + " n / s l n d . " o d a c S ( r p ) r y " m o f o f e a . " " e n : u i n t t ) ) ( t p l ( h e . . \ o e e t . x t f n p n , e b t e i " a t ' x a x n t / r t s t d h k ' = e ( ) o ) T n " , u , r a p i u m " e g " e e ) x e x , ( . i n m f f s j l r i i t i " e l n _ m ) c e d o o u ) C k n r ) h = o s [ i T g i 0 l r a v ] d u t e r e a = e ) r T n i r ( / u ) t e o ) o l s / g e n j i - d o c - s t y l e . d o c x 以下がqmdファイルの例です。 ...

2022年10月3日 · 7 分 · Nakamura