C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

PDFファイルからテキストを抽出する方法について /初心者 (24/06/22(Sat) 16:11) #103205
Re[1]: PDFファイルからテキストを抽出する方法について /KOZ (24/06/22(Sat) 19:54) #103206
  └ Re[2]: PDFファイルからテキストを抽出する方法について /初心者 (24/06/24(Mon) 11:30) #103207
    ├ Re[3]: PDFファイルからテキストを抽出する方法について /kiku (24/06/24(Mon) 17:03) #103208
    │└ Re[4]: PDFファイルからテキストを抽出する方法について /KOZ (24/06/24(Mon) 17:31) #103210
    ├ Re[3]: PDFファイルからテキストを抽出する方法について /KOZ (24/06/24(Mon) 17:30) #103209
    └ Re[3]: PDFファイルからテキストを抽出する方法について /魔界の仮面弁士 (24/06/25(Tue) 14:33) #103211
      └ Re[4]: PDFファイルからテキストを抽出する方法について /初心者 (24/06/26(Wed) 16:33) #103212
        └ Re[5]: PDFファイルからテキストを抽出する方法について /KOZ (24/06/27(Thu) 02:41) #103213
          └ Re[6]: PDFファイルからテキストを抽出する方法について /初心者 (24/06/27(Thu) 11:38) #103214 解決済み


親記事 / ▼[ 103206 ]
■103205 / 親階層)  PDFファイルからテキストを抽出する方法について
□投稿者/ 初心者 (10回)-(2024/06/22(Sat) 16:11:48)

分類:[.NET 全般] 

itextsharpを使用して、PDFファイルからテキストを抽出したいのですが、
ライセンスの問題から、itextSharp4.1.6(ちょっと古すぎますか?)を考えています。
itextSharp4.1.6後のコードは、ありましたが、
4.1.6では、以下の行でエラーとなります。
Imports iTextSharp.text.pdf.parser ←この行でエラーとなります。

そもそも、4.1.6では、テキストの抽出は不可能なのでしょうか?
使用環境は、Visual studio2022、VB.Net、Win10
ページの取得までは達しましたが、先のテキスト抽出の助言が頂きたいと思っています.
もう一歩の所のため、宜しくお願いいたします

Imports iTextSharp.text
Imports iTextSharp.text.pdf
'Imports iTextSharp.text.pdf.parser  ←エラーのためコメントアウト

Dim pdfTxt As StringBuilder = New StringBuilder
Dim pageTxt As String
Dim row() As String
Dim pdfRd As PdfReader = New PdfReader("C:\PDF_sample.pdf")

Dim parser = New PdfContentParser(New PRTokeniser(pdfRd.GetPageContent(2)))
For page As Integer = 1 To pdfRd.NumberOfPages

    
'pageTxt = PdfTextExtractor.GetTextFromPage(pdfRd, page, New LocationTextExtractionStrategy) ←エラーのためコメントアウト
'row = pageTxt.Split(vbCrLf) 'またはpageTxt.Split(Chr(10))  ←エラーのためコメントアウト
'For i As Integer = 0 To row.Length - 1            ←エラーのためコメントアウト
' pdfTxt.Append(row(i))                   ←エラーのためコメントアウト
'Next
Next
pdfRd.Close()
  Console.WriteLine(pdfTxt.ToString)
MessageBox.Show("テキスト出力完了")
[ □ Tree ] 返信 編集キー/

▲[ 103205 ] / ▼[ 103207 ]
■103206 / 1階層)  Re[1]: PDFファイルからテキストを抽出する方法について
□投稿者/ KOZ (466回)-(2024/06/22(Sat) 19:54:24)
No103205 (初心者 さん) に返信
> ライセンスの問題から、itextSharp4.1.6(ちょっと古すぎますか?)を考えています。

どうもこのバージョンはテキストに対する処理が充実してないようで、
stack overflow にあったコードもちゃんと動かないようです。

https://stackoverflow.com/questions/55391515/itextsharp-4-1-6-extract-pdf-content-as-text

PdfPig を使ったらどうでしょうか?

https://www.nuget.org/packages/PdfPig

Imports UglyToad.PdfPig

Module Module1

    Sub Main()
        Dim pdfPath As String = "C:\temp\test.pdf"
        Using document = PdfDocument.Open(pdfPath)
            For Each page In document.GetPages()
                Console.WriteLine(page.Text)
            Next
        End Using
        Console.ReadKey()
    End Sub

End Module

[ 親 103205 / □ Tree ] 返信 編集キー/

▲[ 103206 ] / ▼[ 103208 ] ▼[ 103209 ] ▼[ 103211 ]
■103207 / 2階層)  Re[2]: PDFファイルからテキストを抽出する方法について
□投稿者/ 初心者 (11回)-(2024/06/24(Mon) 11:30:42)
No103206 (KOZ さん) に返信
KOZさん、返信ありがとうございます。
ご提案して頂いた、PdfPigを使用するために、ライブラリーのインストールをしたところ
いつもそうなのですが、上手くいかないのです。

以下にエラーメッセージ内容を示します。
【エラーメッセージ】
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー ソース 'https://packagesource' の追加の試行時に例外 'System.AggregateException' がスローされました。
すべてのオンライン パッケージ ソースが利用できることを確認してください。
1 つ以上のエラーが発生しました。
ソース https://packagesource のサービス インデックスを読み込めません。
この要求の送信中にエラーが発生しました。
リモート名を解決できませんでした。: 'packagesource'

 操作は、  ※プロジェクト名は、pdfpigtestです
・[ツール]→[NuGetパッケージマネージャー]→[ソリューションのNuGetパッケージの管理]
・検索でpdfpigとし、先頭のバージョン0.1.8を選択し、右側のプロジェクトとpdfpigtestにチェックを入れ、インストールを選択

また、PMのコンソールから「NuGet\Install-Package PdfPig -Version 0.1.8」と入力しても同様でした。
原因、意味が分からず困惑しています。

基本的なことでつまずいています、ご教示宜しくお願いします。
[ 親 103205 / □ Tree ] 返信 編集キー/

▲[ 103207 ] / ▼[ 103210 ]
■103208 / 3階層)  Re[3]: PDFファイルからテキストを抽出する方法について
□投稿者/ kiku (428回)-(2024/06/24(Mon) 17:03:49)
No103207 (初心者 さん) に返信
> ■No103206 (KOZ さん) に返信
>  操作は、  ※プロジェクト名は、pdfpigtestです
> ・[ツール]→[NuGetパッケージマネージャー]→[ソリューションのNuGetパッケージの管理]
> ・検索でpdfpigとし、先頭のバージョン0.1.8を選択し、右側のプロジェクトとpdfpigtestにチェックを入れ、インストールを選択

下記環境で試してみましたがエラーなく動作することを確認しました。
 VisualStudio2022
 C#
 .NetFrameWork4.8.1
 WinForm
新規にプロジェクトを作成してNugetしてもエラーが発生しますか?

[ 親 103205 / □ Tree ] 返信 編集キー/

▲[ 103208 ] / 返信無し
■103210 / 4階層)  Re[4]: PDFファイルからテキストを抽出する方法について
□投稿者/ KOZ (468回)-(2024/06/24(Mon) 17:31:22)
2024/06/24(Mon) 17:32:49 編集(投稿者)

投稿がかぶってしまいました。m(_ _;)m
[ 親 103205 / □ Tree ] 返信 編集キー/

▲[ 103207 ] / 返信無し
■103209 / 3階層)  Re[3]: PDFファイルからテキストを抽出する方法について
□投稿者/ KOZ (467回)-(2024/06/24(Mon) 17:30:37)
No103207 (初心者 さん) に返信
> ご提案して頂いた、PdfPigを使用するために、ライブラリーのインストールをしたところ
> いつもそうなのですが、上手くいかないのです。

nuget がうまくいかないというのは別件ですので追及したいなら別にスレッドを立ててください。
私には「設定をリセットしてみたらどう?」としか言えません。

そもそも iTextSharp はどうやってとってきたんですか?
nuget で iTextSharp-LGPL を取得したのではないんでしょうか?

どうしてもうまくいかないなら、ソースリポジトリからソースをダウンロードしてビルドするという手は残されています。




[ 親 103205 / □ Tree ] 返信 編集キー/

▲[ 103207 ] / ▼[ 103212 ]
■103211 / 3階層)  Re[3]: PDFファイルからテキストを抽出する方法について
□投稿者/ 魔界の仮面弁士 (3783回)-(2024/06/25(Tue) 14:33:39)
No103207 (初心者 さん) に返信
> ソース 'https://packagesource' の追加の試行時に例外 'System.AggregateException' がスローされました。
> ソース https://packagesource のサービス インデックスを読み込めません。
> リモート名を解決できませんでした。: 'packagesource'

リモート名が「packagesource」になっているのが不自然ですね。

[ツール]-[オプション] を開いたときに
NuGet パッケージ マネージャー > パッケージ ソース
の中に、その URL が入っていませんか?


新規パッケージソースを追加しようとしたときに、そんな URL が仮設定されていたはず…。
[ 親 103205 / □ Tree ] 返信 編集キー/

▲[ 103211 ] / ▼[ 103213 ]
■103212 / 4階層)  Re[4]: PDFファイルからテキストを抽出する方法について
□投稿者/ 初心者 (12回)-(2024/06/26(Wed) 16:33:35)
No103211 (魔界の仮面弁士 さん) に返信
> ■No103207 (初心者 さん) に返信
KOZさん、kikuさん、魔界の仮面弁士さんアドバイスありがとうございます。
会社や自宅の環境が異なることで、色々試している間に原因が迷宮状態になっていました。
> リモート名が「packagesource」になっているのが不自然ですね。
パッケージ管理の値を「Packges.config」に変更しましたら、動き出しました。
何だったんだ!って感じです。ご指摘を頂いたとおり、トピックが異なるため
動作すれば良しとしこの件については、おしまいとします。

さて、本題ですが、KOZ さんの
>PdfPig を使ったらどうでしょうか?
結論は、テキストの抽出が出来ました!。動き出すとすんなり展開するものですね。やった!
ただ、空白が削除されたイメージなので、希望とするなら、空白を詰めない、文書の様な取得は
可能でしょうか?
まだまだ、スタートラインの状態ですが、itextSharp4.1.6も気になる存在です。
そこで、Pdfのページの分割、抽出や、しおり作成において、環境(できればVB.NET)が整っている
フリーパッケージは、何が推奨でしょうか?


[ 親 103205 / □ Tree ] 返信 編集キー/

▲[ 103212 ] / ▼[ 103214 ]
■103213 / 5階層)  Re[5]: PDFファイルからテキストを抽出する方法について
□投稿者/ KOZ (469回)-(2024/06/27(Thu) 02:41:15)
No103212 (初心者 さん) に返信
> ただ、空白が削除されたイメージなので、希望とするなら、空白を詰めない、文書の様な取得は
> 可能でしょうか?

秀丸エディタ + PDFPrinter で作成した PDF を見ると、テキストはワード単位に管理されていて、
空白の情報は保存されていないようです。

Imports UglyToad.PdfPig
Imports UglyToad.PdfPig.Content

Module Module1

    Sub Main()
        Dim pdfPath As String = "C:\temp\test.pdf"
        Using document = PdfDocument.Open(pdfPath)
            For Each page As Page In document.GetPages()
                For Each word As Word In page.GetWords()
                    Console.WriteLine($"{word.BoundingBox} {word.Text}")
                Next
            Next
        End Using
        Console.ReadKey()
    End Sub

End Module

こんな感じで位置、サイズ、ワードが取得できるので、そこから組み立てるしかなさそうです。

> そこで、Pdfのページの分割、抽出や、しおり作成において、環境(できればVB.NET)が整っている
> フリーパッケージは、何が推奨でしょうか?

これも別件。

[ 親 103205 / □ Tree ] 返信 編集キー/

▲[ 103213 ] / 返信無し
■103214 / 6階層)  Re[6]: PDFファイルからテキストを抽出する方法について
□投稿者/ 初心者 (13回)-(2024/06/27(Thu) 11:38:06)
No103213 (KOZ さん) に返信
KOZさん、コードありがとうございます。
確認の結果、同一行の文字列でも、空白があると、別レコードとなりますし、
y座標は同じと思いきや、微妙に違いがあります。
ウ〜、一寸時間や力量を考えると難しいと判断しました。(残念)
今回の件でPDFの中身が一寸分かりかけて大変勉強になりました。
まだ諦めてませんが、ここで一旦解決とします。
派生した別件の質問がありますので、別トピックで質問させていただきますので
宜しくお願い致します。
解決済み
[ 親 103205 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -