Ostatnio dostałem maila od Pana któremu czasem pomagam:
„Witam
Aplikacja napisana sprawdziła się w 97% 🙂 (potrzeba jeszcze troszkę potestować).
Boryka się jeszcze z jednym problemem, a mianowicie w aplikacji wykorzystuję przeglądanie plików w formacie pdf (tekst), czy istnieje możliwość przeszukania kilkunastu plików w tym formacie pod kontem wystąpienia jakiejś frazy tekstowej?
Przeryłem internet i nie znalazłem nic co by mi w tym pomogło.
Z góry dziękuję z podpowiedz.”
Nie będzie to aż tak łatwe ale jakoś pokażę jak to zrobić. Zaczniemy od prostej części czyli znajdziemy wszystkie pliki PDF w wybranym folderze. Aby tego dokonać przeciągamy z toolboxa element o nazwie „FolderBrowserDialog”
Następnie dodajemy przycisk który będzie aktywował nasz dialog i zmienną która będzie przechowywać ścieżkę do naszego folderu.
Dodamy obok przycisku „label” który będzie wyświetlać adres wybranego folderu, dodajemy również funkcjonalność naszego przycisku. Wszystko wygląda tak jak na obrazku wraz z odpaleniem i wybraniem folderu:
Teraz dodamy sobie „ListBox” aby można było wyświetlić wszystkie pliki „pdf” i „txt”. Aby to zrobić stworzymy sobie listę list. Poco na listalist zapytacie. Otóż ułatwi nam to zadanie. Jak zobaczycie nasz listalist będzie składała się z listy w której będziemy przechowywać wszystkie ścieżki do plików „txt” i z listy ścieżek do plików „pdf” co ułatwi nam w późniejszym etapie ich przeszukiwanie gdyż pliki „txt” będziemy mogli bez problemu przeszukać a pliki „pdf” będziemy musieli najpierw przekonwertować na „txt”
Public Class Form1 Dim sciezkaFolderu As String Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim result As DialogResult = FolderBrowserDialog1.ShowDialog() If (result = DialogResult.OK) Then With FolderBrowserDialog1 sciezkaFolderu = .SelectedPath End With End If Label1.Text = sciezkaFolderu WylistujPlikiPdf(sciezkaFolderu) End Sub Dim ListaPlikow As New List(Of List(Of String)) Private Sub WylistujPlikiPdf(ByVal Sciezka As String) ListBox1.Items.Clear() Dim extension As New List(Of String) extension.add("*.pdf") extension.Add("*.txt") If System.IO.Directory.Exists(Sciezka) Then For i As Integer = 0 To extension.Count - 1 Dim Nowa_Lista As New List(Of String) For Each file In My.Computer.FileSystem.GetFiles(Sciezka, FileIO.SearchOption.SearchTopLevelOnly, extension(i)) ListBox1.Items.Add(My.Computer.FileSystem.GetName(file)) Nowa_Lista.Add(file) Next ListaPlikow.Add(Nowa_Lista) Next Else MsgBox("Ścieżka do folderu nie istnieje.") End If End Sub End Class
Zaczniemy teraz od prostszej czyli przeszukiwanie plików „txt” aby tego dokonać musimy dodać sobie „Textbox” w którym umieścimy szukaną frazę i jakiś przycisk do zainicjowania metody:
Dobra najpierw zajmiemy się tymi plikami „txt”. Lista plików „txt” znajduje się w „ListaPlikow(1)” aby znaleźć szukaną frazę będziemy musieli otworzyć każdy z tych plików i je przeszukać.
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click If Not TextBox1.Text = "" Then ListBox1.Items.Clear() przeszukajPlikiTxT(ListaPlikow(1)) Else MsgBox("Nie wpisałeś szukanej frazy!") End If End Sub Private Sub przeszukajPlikiTxT(ByRef ListaPlikowTxt As List(Of String)) If ListaPlikowTxt.Count > 0 Then For i As Integer = 0 To ListaPlikowTxt.Count - 1 Dim tekst As String If System.IO.File.Exists(ListaPlikowTxt(i)) Then tekst = File.ReadAllText(ListaPlikowTxt(i)) Dim slowa As String() slowa = tekst.Split(" ") For j = 0 To slowa.Length() - 1 If slowa(j).ToString.ToUpper = TextBox1.Text.ToUpper Then ListBox1.Items.Add(My.Computer.FileSystem.GetName(ListaPlikowTxt(i))) Exit For End If Next End If Next End If End Sub
Efekt można podziwiać na filmie poniżej.
Teraz zajmiemy się plikami PDF. aby tego dokonać należy pobrać paczkę ze strony: http://www.squarepdf.net/how-to-convert-pdf-to-text-in-net-vb
i zastosować się do podanych instrukcji:
Dodać Referencje:
- IKVM.OpenJDK.Core.dll
- IKVM.OpenJDK.SwingAWT.dll
- pdfbox-1.8.9.dll
In addition to these libraries, it is necessary to copy the following files to the application directory:
(Konieczne jest również skopiowanie tych plików do folderu programu.)
- commons-logging.dll
- fontbox-1.8.9.dll
- IKVM.OpenJDK.Text.dll
- IKVM.OpenJDK.Util.dll
- IKVM.Runtime.dll
Wszystkie te kroki pokazuje film poniżej który ułatwi wam zadanie trzeba tutaj podkreślić, że w dziale publikuj gdzie dołączamy jeśli pliki nie mają statusu include to należy takowy im dodać.
Kiedy już dodamy wszystkie te pliki należy zaimportować potrzebne elementy:
Imports System.IO Imports org.apache.pdfbox.pdmodel Imports org.apache.pdfbox.util
Cały kod wygląda tak:
Imports System.IO Imports org.apache.pdfbox.pdmodel Imports org.apache.pdfbox.util Public Class Form1 Dim sciezkaFolderu As String Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim result As DialogResult = FolderBrowserDialog1.ShowDialog() If (result = DialogResult.OK) Then With FolderBrowserDialog1 sciezkaFolderu = .SelectedPath End With End If Label1.Text = sciezkaFolderu WylistujPlikiPdf(sciezkaFolderu) End Sub Dim ListaPlikow As New List(Of List(Of String)) Private Sub WylistujPlikiPdf(ByVal Sciezka As String) ListBox1.Items.Clear() Dim extension As New List(Of String) extension.Add("*.pdf") extension.Add("*.txt") If System.IO.Directory.Exists(Sciezka) Then For i As Integer = 0 To extension.Count - 1 Dim Nowa_Lista As New List(Of String) For Each file In My.Computer.FileSystem.GetFiles(Sciezka, FileIO.SearchOption.SearchTopLevelOnly, extension(i)) ListBox1.Items.Add(My.Computer.FileSystem.GetName(file)) Nowa_Lista.Add(file) Next ListaPlikow.Add(Nowa_Lista) Next Else MsgBox("Ścieżka do folderu nie istnieje.") End If End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click If Not TextBox1.Text = "" Then ListBox1.Items.Clear() przeszukajPlikiTxT(ListaPlikow(1)) przeszukajPlikiPdf(ListaPlikow(0)) Else MsgBox("Nie wpisałeś szukanej frazy!") End If End Sub Private Sub przeszukajPlikiTxT(ByRef ListaPlikowTxt As List(Of String)) If ListaPlikowTxt.Count > 0 Then For i As Integer = 0 To ListaPlikowTxt.Count - 1 Dim tekst As String If System.IO.File.Exists(ListaPlikowTxt(i)) Then tekst = File.ReadAllText(ListaPlikowTxt(i)) Dim slowa As String() slowa = tekst.Split(" ") For j = 0 To slowa.Length() - 1 If slowa(j).ToString.ToUpper = TextBox1.Text.ToUpper Then ListBox1.Items.Add(My.Computer.FileSystem.GetName(ListaPlikowTxt(i))) Exit For End If Next End If Next End If End Sub Private Sub przeszukajPlikiPdf(ByRef ListaPlikowPdf As List(Of String)) If ListaPlikowPdf.Count > 0 Then For i As Integer = 0 To ListaPlikowPdf.Count - 1 Dim tekst As String If System.IO.File.Exists(ListaPlikowPdf(i)) Then tekst = parseUsingPDFBox(ListaPlikowPdf(i)) If tekst.Contains(TextBox1.Text) Then ListBox1.Items.Add(My.Computer.FileSystem.GetName(ListaPlikowPdf(i))) End If End If Next End If End Sub Private Shared Function parseUsingPDFBox(ByVal input As String) As String Dim doc As PDDocument = Nothing Try doc = PDDocument.load(input) Dim stripper As New PDFTextStripper() Return stripper.getText(doc) Finally If doc IsNot Nothing Then doc.close() End If End Try End Function End Class
Jego efektywność możemy podziwiać na filmie poniżej:
Cały projekt do pobrania: WyszukiwanieSlow
Mam nadzieję, że tutorial był pomocny. Piszcie do mnie maile ze swoimi problemami a spróbuje pomóc je wam rozwiązać. Pozdrawiam
1 komentarz
hej, pojawia się następujący komunikat: java.io.IOException w funkcji parseUsingPDFBox w linijce = Return stripper.getText(doc)