PDFDocumentSource を使用すると、C1.Win.C1Document 名前空間のメンバである C1TextSearchManager クラスを使用して、検索条件とのマッチングおよびファイルに格納されているすべての単語の検査によるテキスト検索を PDF ファイルに実装できます。このクラスは、検索されるテキストの最初の一致を検索する FindStart、次の一致を検索する FindNext、前の一致を検索する FindPrevious など、さまざまなメソッドを提供します。C1FindTextParams(string text, bool wholeWord, bool matchCase) メソッドを使用して、C1FindTextParams クラスの新しいインスタンスを次のパラメータで初期化できます。
次の図は、PDF ファイルで検索された単語と、検索結果となる一致のリストを示します。
このサンプルコードでは、FindStart メソッドを C1TextSearchManager で使用して、検索テキストがある場所を検索します。
名前 | テキスト | 幅 |
---|---|---|
chnum | # | 50 |
chpage | ページ | 60 |
chbounds | 発見位置 | 100 |
chPosInNearText | 近いテキスト内の位置 | 60 |
chNearText | 近いテキスト | 350 |
C# |
コードのコピー
|
---|---|
using C1.Win.C1Document;
|
C# |
コードのコピー
|
---|---|
// 検索で使用されるC1TextSearchManagerのインスタンス C1TextSearchManager tsm; // 現在、ロード中のドキュメントの名前 private string loadedFile = null; |
C# |
コードのコピー
|
---|---|
// サンプルファイル tbFile.Text = Path.GetFullPath(@"..\..\DefaultDocument.pdf"); // C1TextSearchManagerを作成し、初期化します tsm = new C1TextSearchManager(c1PdfDocumentSource1); tsm.FoundPositionsChanged += tsm_FoundPositionsChanged; |
C# |
コードのコピー
|
---|---|
private void btnFile_Click(object sender, EventArgs e) { // ユーザーが検索するPDFファイルを選択できるようにします。 if (openFileDialog1.ShowDialog(this) == DialogResult.OK) tbFile.Text = openFileDialog1.FileName; } |
C# |
コードのコピー
|
---|---|
private void btnFind_Click(object sender, EventArgs e) { // 指定されたPDFファイルをc1PdfDocumentSource1にロードして、検索を実行します。 try { c1PdfDocumentSource1.LoadFromFile(tbFile.Text); loadedFile = tbFile.Text; } catch (Exception ex) { MessageBox.Show(this, ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // 以前に見つかった位置があれば、それをクリアします。 lvFoundPositions.Items.Clear(); // C1FindTextParamsをユーザが提供する値で初期化します。 C1FindTextParams ftp = new C1FindTextParams(tbFind.Text, true, false); // 検索を実行します(FindStartAsyncも利用できます)。 tsm.FindStart(0, true, ftp); } |
C# |
コードのコピー
|
---|---|
// C1TextSearchManagerのFoundPositionsコレクションが変更されたとき(つまり、 // 検索テキストの新しいインスタンスが見つかったとき)に呼び出されます。 // これを使用して、UI内で見つかった位置のリストを更新します。 private void tsm_FoundPositionsChanged(object sender, EventArgs e) { int n = tsm.FoundPositions.Count; for (int i = lvFoundPositions.Items.Count; i < n; i++) { C1FoundPosition fp = tsm.FoundPositions[i]; var bounds = fp.GetBounds(); ListViewItem lvi = new ListViewItem(new string[] { (i + 1).ToString(), fp.GetPage().PageNo.ToString(), string.Format("{0}, {1}, {2}, {3}", (int)Math.Round(bounds.Left), (int)Math.Round(bounds.Top), (int)Math.Round(bounds.Width), (int)Math.Round(bounds.Height)), fp.PositionInNearText.ToString(), fp.NearText, }); lvFoundPositions.Items.Add(lvi); } } |