C#でWindows10のOCRを使ってPDFの文字認識をしてみた(WPF)
C#のWPF(デスクトップ)アプリで、Windows10のOCR機能を使ってPDFファイルを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ゴシックの読み取りが成績が良さそうです。さすがはユニバーサルデザインといったところでしょうか。
公開日
広告
C#カテゴリの投稿
- C#でMVVMって何でしょう
- C#でPDFを表示する(WPF)
- C#でWindows10のOCRを使ってPDFの文字認識をしてみた(WPF)
- C#でWindows10のOCRを使って文字認識する(WPF)
- C#でアプリのログを記録してみる
- C#でアプリの設定を保存する
- C#でインスタンスをプログラムで作ってみた(Activator.CreateInstance編)
- C#でインスタンスをプログラムで作ってみた(Type.InvokeMember編)
- C#でインスタンス間のデータの受け渡しをしてみた
- C#でウェブサイトのソースを取得してみた
- C#でエラーの処理をする
- C#でクラスのフィールド宣言とコンストラクターでの初期化はどっちが優先する?
- C#でスタックを使って逆ポーランド記法の計算をしてみた
- C#で数式を中置記法から後置記法(逆ポーランド記法)に変換してみた(三角関数編)
- C#で選択(switch-case編)
- C#のWPFでデータバインディング
- C#のXAMLでメニューとステータスバーのレイアウトをしてみた
- C#のアプリの情報を表示してみた
- C#のクラスとインスタンスとオブジェクト
- C#の反復処理(foreach編)
- C#の命名規則
- C#へのMicrosoft.TeamFoundation.Controlsの参照の追加について