C#でPDFをText化してみる
なんでこんな事をわざわざしたいと思ったと言えば、株式の売買額を整理する時にどうしても面倒だったからです。
しょうがないのでコーディングしようとしたものの、上位でヒットするものは有償や一部無償のみ・・・
候補は以下
・Adobe :メソッドの呼び出しでエラー発生(実は有償だった)
・PdfSharp:抜き取れるけどエンコードが出来ない(涙)
結局、PDFBoxに辿りつきました。
PdfSharpも頑張ったらなんとかなりそうでしたが、実績を作った人が外人だったので英字しかサポートなし。
漢字用にエンコード出来れば真面目に落とせるかもしれません。
ソースはコメントアウトで残しています。
本体
private void btn_clear_Click(object sender, EventArgs e)
{
ListBox1.Items.Clear();
}
private void btn_cangesubmit_Click(object sender, EventArgs e)
{
foreach (var item in ListBox1.Items)
{
pdf2txt(new FileInfo(@item.ToString()), new FileInfo(@item.ToString().ToLower().Replace(".pdf", ".txt")));
}
}
public static void pdf2txt(FileInfo pdffile, FileInfo txtfile)
{
PDDocument doc = PDDocument.load(pdffile.FullName);
PDFTextStripper pdfStripper = new PDFTextStripper();
string text = pdfStripper.getText(doc);
StreamWriter swPdfChange = new StreamWriter(txtfile.FullName, false, Encoding.GetEncoding("utf-8"));
swPdfChange.Write(text);
swPdfChange.Close();
}
リストボックス周辺のコード
//ListBox1のDragEnterイベントハンドラ
private void ListBox1_DragEnter(object sender,
System.Windows.Forms.DragEventArgs e)
{
//コントロール内にドラッグされたとき実行される
if (e.Data.GetDataPresent(DataFormats.FileDrop))
//ドラッグされたデータ形式を調べ、ファイルのときはコピーとする
e.Effect = DragDropEffects.Copy;
else
//ファイル以外は受け付けない
e.Effect = DragDropEffects.None;
}
//ListBox1のDragDropイベントハンドラ
private void ListBox1_DragDrop(object sender,
System.Windows.Forms.DragEventArgs e)
{
//コントロール内にドロップされたとき実行される
//ドロップされたすべてのファイル名を取得する
string[] fileName =
(string[])e.Data.GetData(DataFormats.FileDrop, false);
foreach (var list_item in fileName) {
if (Path.GetExtension(list_item).ToLower().Equals(".pdf"))
{
//ListBoxに追加する
ListBox1.Items.Add(list_item);
}
}
}
//ListBox1でマウスボタンが押された時
private void ListBox1_MouseDown(object sender, MouseEventArgs e)
{
//マウスの左ボタンだけが押されている時のみドラッグできるようにする
if (e.Button == MouseButtons.Left)
{
//ドラッグの準備
ListBox lbx = (ListBox)sender;
//ドラッグするアイテムのインデックスを取得する
int itemIndex = lbx.IndexFromPoint(e.X, e.Y);
if (itemIndex < 0) return;
//ドラッグするアイテムの内容を取得する
string itemText = (string)lbx.Items[itemIndex];
//ドラッグ&ドロップ処理を開始する
DragDropEffects dde =
lbx.DoDragDrop(itemText, DragDropEffects.All);
//ドロップ効果がMoveの時はもとのアイテムを削除する
if (dde == DragDropEffects.Move)
lbx.Items.RemoveAt(itemIndex);
}
}
※パッケージ類は削除しているので別途、Nugetで落としてください。
感想
JavaとかPythonは無償がけっこう引っかかるのにC#とは何故か有償ばっかり引っかかりやすい様に検索上位に出てくるのが何かやらしい。
ドキュメント系の商売ってニッチーだからなのかも。
でもPDF系とか10年前は普通に高額ライセンス買わないと処理出来なかったのにフリーが結構出てますね・・・
今更だけどNoteって開発系の記事作成には向いて無いかも。。。
最終形態