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)