developer's diary

最近はc#のエントリが多いです

C# (dotnetcore) スキャンしてOCR処理したPDFをiText7(AGPL)を利用して読み込んでみる

注意

iText7はAGPLライセンスです。利用する場合、利用者に対して、全ソースコードを公開する必要があります。

公開サイト等で利用する場合は、商用ライセンスの購入をお勧めします。

やりたいこと

  1. PDF名でディレクトリの存在チェック
    1. 存在しない場合、ディレクトリを作成する
  2. PDFを1ページずつ読み込み、以下の処理を繰り返す
    1. ページにある文字列を抽出
    2. ページ番号でファイルを作成
    3. 抽出した文字列をファイルに書き出す

もっと先でやりたいこと

  • PDFをページ毎に分けて作成
  • ページ毎に文字列を抽出
  • 全文検索
  • 検索結果のページを確認できる仕組み

NuGetで2つのパッケージをインストールしよう

f:id:mitsugi-bb:20200903225117p:plain
itext7とitext7.font-asianをインストールした様子

ソース

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のページ毎の内容が出力される

f:id:mitsugi-bb:20200903230234p:plain
PDFの読み込み結果

f:id:mitsugi-bb:20200903230443p:plain
だいぶ文字崩れてますが・・・

OCR結果なので、あまりよくないですね・・・

ちなみに縦書きのPDFをOCRしたものもうまく読み込めませんでした・・・

PDF購入した電子書籍の場合バッチリ出力されます。

f:id:mitsugi-bb:20200903230824p:plain
独習C#のPDFをスキャンしてテキスト化してみた例

SimpleTextExtractionStrategyを利用すると縦書き書籍がうまく読めた

文字列抽出を以下のように修正

//PDFから文字列を抽出
string s = PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(page), new SimpleTextExtractionStrategy());

すると縦書き書籍がうまいこと読み込めました。

f:id:mitsugi-bb:20200903235551p:plain
縦書き書籍を読み込んでみた

パッケージのリンク

NuGet Gallery | itext7 7.1.12

NuGet Gallery | itext7.font-asian 7.1.12

OCRした書籍や電子書籍の紹介

パラダイムの魔力

パラダイムの魔力

独習C# 新版

独習C# 新版