• ホーム
  • C#
  • C#でWindows10のOCRを使ってPDFの文字認識をしてみた(WPF)

C#でWindows10のOCRを使ってPDFの文字認識をしてみた(WPF)

C#のWPF(デスクトップ)アプリで、Windows10のOCR機能を使ってPDFファイルをOCRしてみました。

目次

  1. サンプルPDFファイル
  2. アプリ
    1. XAML
    2. コード
  3. OCRの結果

サンプルPDFファイル

機械彫刻用標準書体M、BIZ UDP ゴシック、游ゴシック、游明朝、Consolasの各フォントでの読み取りを比べてみます。

ページサイズはA4、文字サイズは10ポイントです。

Wordで作成して、WordのPDF出力機能でPDF出力したデータです。

サンプル

PDFを読み込むときの解像度を何パターンか試してみました。

アプリ

XAML

<Window x:Class="pdf_ocr_test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:pdf_ocr_test"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
    <Grid>
        <TextBox Name="txtMain" Margin="10" TextWrapping="Wrap" />
    </Grid>
</Window>

WindowにTextBoxを貼っただけのものです。

コード

using System;
using System.Collections.Generic;
using System.IO;
using System.Windows;
using System.Windows.Media.Imaging;

namespace pdf_ocr_test
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Windows.Data.Pdf.PdfDocument pdfDocument;
            List<BitmapSource> pdfPages = new List<BitmapSource>();

            // PDFファイルの読み込み
            var file = await Windows.Storage.StorageFile.GetFileFromPathAsync(System.IO.Path.GetFullPath("test.pdf"));
            pdfDocument = await Windows.Data.Pdf.PdfDocument.LoadFromFileAsync(file);
            if (pdfDocument != null)
            {
                for (uint i = 0; i < pdfDocument.PageCount; i++)
                {
                    using (Windows.Data.Pdf.PdfPage page = pdfDocument.GetPage(i))
                    {
                        using (var stream = new Windows.Storage.Streams.InMemoryRandomAccessStream())
                        {
                            var renderOptions = new Windows.Data.Pdf.PdfPageRenderOptions();
                            renderOptions.DestinationWidth = (uint)Math.Round(page.Dimensions.ArtBox.Width / 96.0 * 300.0);
                            await page.RenderToStreamAsync(stream, renderOptions);
                            WriteableBitmap bitmap = new WriteableBitmap(BitmapFrame.Create(stream.AsStream()));
                            pdfPages.Add(bitmap);
                        }
                    }
                }
            }

            // OCRの実行
            foreach (var p in pdfPages)
            {
                PngBitmapEncoder encoder = new PngBitmapEncoder();
                encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(p));
                MemoryStream temp_stream = new MemoryStream();
                encoder.Save(temp_stream);

                var converted_stream = WindowsRuntimeStreamExtensions.AsRandomAccessStream(temp_stream);

                var decorder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(converted_stream);
                Windows.Graphics.Imaging.SoftwareBitmap bitmap = await decorder.GetSoftwareBitmapAsync();
                converted_stream.Dispose();
                temp_stream.Close();

                var engine = Windows.Media.Ocr.OcrEngine.TryCreateFromLanguage(new Windows.Globalization.Language("ja-JP"));
                var result = await engine.RecognizeAsync(bitmap);

                foreach (var r in result.Lines)
                {
                    txtMain.Text = txtMain.Text + "\r\n" + r.Text;
                }
            }
        }
    }
}

PDFファイルの読み込みについては「C#でPDFを表示する」という投稿を、画像のOCRについては「C#でWindows10のOCRを使って文字認識する」という投稿を参照してください。

OCRの結果

OCRエンジンはWindows10の日本語のエンジンです。

まず、96dpiです。

Consolasが読み取れていません。他の書体についても、ちょっと厳しいですね。レイアウトも崩れてます。

槭 影 刻 用 標 準 書 体 M
0123456789 01 23456789
abCdefqhijklmnODQ 「 stuvwxyz 0 b 0 d e f 0 h i ー k ー m n 0 0 0 「 S t u V W X V Z
ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDE FGH ー JKLMNOPQRSTUVWXYZ
0123456789
游 ゴ シ ッ ク
千 早 ぶ る 神 代 も き か す 龍 田 川 か ら く れ な ゐ に 水 く く る と は
イ ロ ハ 二 ホ へ ト イ 盟 ゴ へ ト
ABCDEFGHI 」 KLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz
0123456789
BIZ UDP ゴ シ ッ ク
千 早 ぶ る 神 代 も き か す 龍 田 川 か ら く れ な ゐ に 水 く く る と は
イ ロ ハ ニ ホ へ ト ” ニ ト
ABCDEFGHIJKLMNOPQRSTLIVWXYZ
abcdefghijklmnopqrstuvwxyz
912 ヨ 456789
〔 5 01
千 旱 る 神 代 も き か ず 能 田 川 か ら く れ な ゐ に 水 く く る と は
ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDE FGH ー J KLMNOPQRSTUVWXYZ
V W 歹 Z
k I m Ⅱ 0 p q ー 5
abcdefghljklmnopqrstuvwxyz ま b c d e f g ト ー j
0 ー 23456789
游 明 朝
千 早 ぶ る 神 代 も き か 龍 田 川 か ら く れ な ゐ に 水 く く る と は
A 8C D E FG H リ K LM N 0 PQRSTUVWXYZ A 8 C D E F G H | 」 K L M N 0 P Q R S T U V W X Y Z
abcdefghijklmnopqrstuvwxyz 3 b c d e f g h i j k ー m n 0 p q 「 s t u v w x y z

続いて、200dpiです。

Consolasが読み取れましたし、レイアウトもほぼほぼ合っているようです。全角英字と半角カタカナは厳しいですね。

機 械 彫 刻 用 標 準 書 体 M
0123456789 0123456789
abcdefghijklmnopqrstuvwxyz 0 b c d e f g h i j k [ m n 0 p q 「 s t u v w x y z
ABCDEFGHIJKLMNOPQRSTUVWXYZ A B C D E F G H ー J K L M N 0 P Q R S T U V W X Y Z
イ ロ ハ ニ ホ へ ト イ ロ ハ ニ ホ , 、 、 ト
千 早 ぶ る 神 代 も き か す 龍 田 川 か ら く れ な ゐ に 水 く く る と は
BIZ UDP ゴ シ ッ ク
0123456789
abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ
イ ロ ハ ニ ホ へ ト イ ロ に ホ へ ト
千 早 ぶ る 神 代 も き か す 龍 田 川 か ら く れ な ゐ に 水 く く る と は
游 コ シ ッ ク
0123456789
abcdefghijklmnopqrstuvwxyz a b c d e f g h i j k ー m n 0 p q r s t u v w x y z
ABCDEFGH IJ KLM NOPQRSTUVWXYZ A B C D E F G H ー 」 K L M N O P Q R S T U V W X Y Z
イ ロ ハ ニ ホ へ ト イ ロ ハ ニ ホ へ ト
千 早 ぶ る 神 代 も き か ず 龍 田 川 か ら く れ な ゐ に 水 く く る と は
游 明 朝
0123456789
abcdefghijklmnopqr ・ stuvwxyz a b c d e f g h i j k ー m n 0 p q r s t u v w x y z
ABCDEFGHIJKLMNOPQRSTUVWXYZ AB CDE F GH I J KLMNOPQRS TUVWXYZ
イ ロ ハ ニ ホ へ ト イ 山 、 ニ ホ へ ト
千 早 ぶ る 神 代 も き か ず 龍 田 川 か ら く れ な ゐ に 水 く く る と は
Cons01as
e123456789
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ

続いて、300dpiです。200dpiより少し良さそうな感じです。

機 械 彫 刻 用 標 準 書 体 M
0123456789 0123456789
abcdefghijklmnopqrstuvwxyz 0 b c d e f g h i
j k [ m n 0 p q r s 卞 u v w x y z
ABCDEFGHI JKLMN OPQ RSTUVWXYZ A B C D E F G H ー J K L M N O P Q R S T U V W X Y Z
イ ロ ハ ニ ホ へ ト イ ロ ハ ニ ホ へ ト
千 早 ぶ る 神 代 も き か す 龍 田 川 か ら く れ な ゐ に フ K く く る と は
BIZ UDP ゴ シ ッ ク
0123456789
abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ
イ ロ ハ ニ ホ へ ト イ ロ に ホ へ ト
千 早 ぶ る 神 代 も き か ず 龍 田 川 か ら く れ な ゐ に 水 く く る と は
游 ゴ シ ッ ク
0123456789
abcdefghi 」 klmnopqrstuvwxyz a b c d e f g h i j k ー m n 0 p q r s t u \/ w x y z
ABCD EFG H IJ KLM NOPQRSTUVWXYZ A B C D E F G H ー 」 K L M N O P Q R S T U V W X Y Z
イ ロ ハ ニ ホ へ ト イ ロ / 匸 ホ へ ト
千 早 ぶ る 神 代 も き か ず 龍 田 川 か ら く れ な ゐ に 水 く く る と は
游 明 朝
0123456789
abcdefghijklmnopqrstuvwxyz a b c d e f g h i j k 1 m n 0 p q r s t u v w x y z
ABCDEFGHIJKLMNOPQRSTUVWXYZ AB CDE F GH 1 1 KLMNOPQR S TUVWXYZ
イ ロ ノ 、 ニ ホ へ ト イ ロ ハ ニ ホ へ ト
千 早 ぶ る 神 代 も き か ず 龍 田 川 か ら く れ な ゐ に 水 く く る と は
Cons01as
e123456789
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ

そして600dpiです。300dpiと大差ないかな。

機 械 彫 刻 用 標 準 書 体 M
0123456789 0123456789
abcdefghijklmnopqrstuvwxyz 0 b c d e f g h i
j k [ m n 0 p q r s 卞 u v w x y z
ABCDEFGHIJKLMNOPQRSTUVWXYZ A B C D E F G H ー J K L M N O P Q R S T U V W X Y Z
イ ロ ハ ニ ホ へ ト イ ロ ハ ニ ホ へ ト
千 早 ぶ る 神 代 も き か す 龍 田 川 か ら く れ な ゐ に 水 く く る と は
BIZ UDP ゴ シ ッ ク
0123456789
abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ
イ ロ ハ ニ ホ へ ト イ ロ に ホ へ ト
千 早 ぶ る 神 代 も き か ず 龍 田 川 か ら く れ な ゐ に 水 く く る と は
游 ゴ シ ッ ク
0123456789
abcdefghijklmnopqrstuvwxyza b c d e f g h i
ABCDEFG H IJ KLM NOPQRSTUVWXYZ A B C D E F G H ー 」 K L M N O P Q R S T U V W X Y Z
イ ロ ハ ニ ホ へ ト イ ロ ハ ニ ホ へ ト
千 早 ぶ る 神 代 も き か ず 龍 田 川 か ら く れ な ゐ に 水 く く る と は
游 明 朝
0123456789
abcdefghijklmnopqrstuvwxyz a b c d e f g h i j k 1 m n 0 p q r s t u v w x y z
ABCDEFGHIJKLMNOPQRSTUVWXYZ AB CDE F GH I J KLMNO PQR S TUVWXY Z
イ ロ ノ 、 ニ ホ へ ト イ ロ ハ ニ ホ へ ト
千 早 ぶ る 神 代 も き か ず 龍 田 川 か ら く れ な ゐ に 水 く く る と は
j k ー m n O p q r s t u v w x y z
Cons01as
e123456789
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ

全体的にBIZ UDPゴシックの読み取りが成績が良さそうです。さすがはユニバーサルデザインといったところでしょうか。

公開日

広告