Przeszukiwanie plików pdf i txt

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”

wyszukiwanieslow_1Następnie dodajemy przycisk który będzie aktywował nasz dialog i zmienną która będzie przechowywać ścieżkę do naszego folderu.

wyszukiwanieslow_2Dodamy 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:

wyszukiwanieslow_3Teraz 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”

wyszukiwanieslow_4Cały kod do testowania:

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:

wyszukiwanieslow_5Dobra 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

 

 

Permalink do tego artykułu: https://visualmonsters.cba.pl/przeszukiwanie-plikow-pdf-i-txt/

1 komentarz

  1. hej, pojawia się następujący komunikat: java.io.IOException w funkcji parseUsingPDFBox w linijce = Return stripper.getText(doc)

Dodaj komentarz

Twój adres email nie będzie publikowany.