C# (dotnetcore) スキャンしてOCR処理したPDFをiText7(AGPL)を利用して読み込んでみる
注意
iText7はAGPLライセンスです。利用する場合、利用者に対して、全ソースコードを公開する必要があります。
公開サイト等で利用する場合は、商用ライセンスの購入をお勧めします。
やりたいこと
- PDF名でディレクトリの存在チェック
- 存在しない場合、ディレクトリを作成する
- PDFを1ページずつ読み込み、以下の処理を繰り返す
- ページにある文字列を抽出
- ページ番号でファイルを作成
- 抽出した文字列をファイルに書き出す
もっと先でやりたいこと
- PDFをページ毎に分けて作成
- ページ毎に文字列を抽出
- 全文検索
- 検索結果のページを確認できる仕組み
NuGetで2つのパッケージをインストールしよう
ソース
using System.IO; using iText.Kernel.Pdf; using iText.Kernel.Pdf.Canvas.Parser; namespace pdfExample { class Program { static void Main(string[] args) { // ディレクトリの存在チェック if (!Directory.Exists(@"/Users/mitsugi/Desktop/u")) { //存在しない場合、ディレクトリを作成 Directory.CreateDirectory(@"/Users/mitsugi/Desktop/u"); } //PDFファイルを読み込む using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(@"/Users/mitsugi/Desktop/u.pdf"))) { //PDFのページ分繰り返す for (int page = 1; page <= pdfDoc.GetNumberOfPages(); page++) { //PDFから文字列を抽出 string s = PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(page)); //ページ番号.txtのファイルを作成 using(var sw = new StreamWriter(@"/Users/mitsugi/Desktop/u/" + page.ToString() + ".txt")) { //PDFの文字列を書き込む sw.WriteLine(s); } } } } } }
実行
PDFのページ毎の内容が出力される
OCR結果なので、あまりよくないですね・・・
ちなみに縦書きのPDFをOCRしたものもうまく読み込めませんでした・・・
PDF購入した電子書籍の場合バッチリ出力されます。
SimpleTextExtractionStrategyを利用すると縦書き書籍がうまく読めた
文字列抽出を以下のように修正
//PDFから文字列を抽出 string s = PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(page), new SimpleTextExtractionStrategy());
すると縦書き書籍がうまいこと読み込めました。
パッケージのリンク
NuGet Gallery | itext7.font-asian 7.1.12