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”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
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ć.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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:
1 2 3 |
Imports System.IO Imports org.apache.pdfbox.pdmodel Imports org.apache.pdfbox.util |
Cały kod wygląda tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
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)