Progress Bar или BackgroundWorker для моего приложения PDF-слияния в сети VB - PullRequest
0 голосов
/ 10 октября 2018

У меня есть приложение, которое я написал, и оно почти завершено.Эта часть приложения берет каждый PDF-файл с номером файла и объединяет все PDF-страницы с одинаковым заголовком.Например,

ZTEST01 Титульный лист (1)

ZTEST01 Титульный лист (2)

ZTEST01 Титульный лист (3)

ZTEST01 Жалоба (1)

ZTEST01 Жалоба (2)

ZTEST01 Приложение (1)

ZTEST01 Приложение (2)

ZTEST01 Военная служба (1)

ZTEST01Военные (2)

ZTEST01 Военные (3)

ZTEST01 Вызов (1)

ZTEST01 Вызов (2)

Превращается в:

ZTEST01 Титульный лист

ZTEST01 Жалоба

ZTEST01 Экспонат

ZTEST01 Военный

ZTEST01 Призыв

Оттуда он получает номер файлаи объединяет PDF-файлы с титульным листом и жалобой в:

ZTEST01 Комбинированный Cover-Comp

ZTEST01 Экспонат

ZTEST01 Военный

ZTEST01 Вызов

После того, как я написал приложение, я понял, что, как только все это будет сделано, вы не будете знать, произошло ли что-то или нет, если пользователь физически не проверит выводпапка, в которую они должны войти, чтобы убедиться, что они действительно объединены или нет.

Сначала я попытался с помощью расширенного текстового поля отобразить список объединяемых PDF-файлов, а затем перешел к созданиюиндикатор.

Это следующий код для всего этого:

Imports System.IO
Imports PdfSharp.Pdf
Imports System.IO.Path
Imports PdfSharp.Pdf.IO
Imports System.Runtime.InteropServices
Imports System.Deployment
Imports Bytescout.PDFExtractor
Imports System.Collections
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Threading.Tasks
Imports System
Imports System.Diagnostics
Imports ExcelDataReader
Imports Microsoft
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Core
Imports Microsoft.Office.Interop.Excel
Imports System.Windows.Forms
Imports System.ComponentModel

Public Class Form2
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim folderDlg As New FolderBrowserDialog

        folderDlg.SelectedPath = "G:\Word\Department Folders\Pre-Suit\Drafts-IL\2-IL_AttyReview\"
        folderDlg.ShowNewFolderButton = True
        If (folderDlg.ShowDialog() = DialogResult.OK) Then
            TextBox1.Text = folderDlg.SelectedPath
        Else
            Return
        End If
        Call Xavier()
    End Sub

    Private inputdir As String = Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "unmerged") 

    Public Sub Xavier()
        MergeFiles("Cover Sheet", inputdir)
        MergeFiles("Complaint", inputdir)
        MergeFiles("Exhibit", inputdir)
        MergeFiles("Military", inputdir)
        MergeFiles("Summons", inputdir)
    End Sub

    Public Sub MergeFiles(ByVal name As String, inputdir As String)
        Try
            Dim OutputFile As String
            Dim OutputDir As String = TextBox1.Text
            Dim OutputDocument As PdfDocument



            For Each files As String In Directory.GetFiles(inputdir, "*" & name & "*.pdf")
                OutputFile = "\" & GetFileNameWithoutExtension(files).Substring(0, 7) & " " & name & ".pdf"
                If File.Exists(OutputDir & OutputFile) Then
                    OutputDocument = PdfReader.Open(OutputDir & OutputFile)
                Else
                    OutputDocument = New PdfDocument()
                End If

                Using InputDocument As PdfDocument = PdfReader.Open(files, PdfDocumentOpenMode.Import)
                    For Each page As PdfPage In InputDocument.Pages
                        OutputDocument.AddPage(page)
                    Next


                End Using

                OutputDocument.Save(OutputDir & OutputFile)
                OutputDocument.Dispose()

            Next
            For Each files In Directory.GetFiles(inputdir, "*" & name & "*.pdf")
                File.Delete(files)

            Next


            Dim OutputFile2 As String
            Dim OutputDir2 As String = TextBox1.Text
            Dim OutputDocument2 As PdfDocument
            Dim Array = {"Cover Sheet", "Complaint"}
            For Each Ar In Array
                Dim element = Ar

                For Each files As IO.FileInfo In Get_Files(OutputDir2, IO.SearchOption.TopDirectoryOnly, "pdf", element)

                    OutputFile2 = "\" & GetFileNameWithoutExtension(files.ToString).Substring(0, 7) & " Cover-Comp Combined" & ".pdf"



                    RichTextBox3.AppendText(String.Format("Merged: {0}", GetFileName(files.Name) & " as " & GetFileName(OutputFile2) & vbNewLine))
                    ' Sets the starting point of the selection         
                    RichTextBox3.SelectionStart = Len(RichTextBox3.Text)
                    ' Scrolls to the caret
                    RichTextBox3.ScrollToCaret()
                    ' Select the range 
                    RichTextBox3.Select()



                    If File.Exists(OutputDir2 & OutputFile2) Then
                        OutputDocument2 = PdfReader.Open(OutputDir2 & OutputFile2)
                    Else
                        OutputDocument2 = New PdfDocument()
                    End If

                    Using InputDocument As PdfDocument = PdfReader.Open(files.ToString, PdfDocumentOpenMode.Import)

                        For Each page As PdfPage In InputDocument.Pages

                            OutputDocument2.AddPage(page)

                             For Each fileinput As String In Directory.GetFiles(OutputDir2, "*.pdf")
                            ProgressBar1.Minimum = 0
                            ProgressBar1.Maximum = fileinput.Length
                            ProgressBar1.Value = 0
                            ProgressBar1.Visible = True
                            lblPercent.Visible = True
                            Label2.Visible = True
                            Label2.Text = "%"




                            For Each p In fileinput
                            ProgressBar1.Value = ProgressBar1.Value + 1
                            lbl1.Text = Int(ProgressBar1.Value * 100 / ProgressBar1.Maximum)
                            lbl1.Refresh()

                            Next
                          Next

                        Next
                    End Using

                    OutputDocument2.Save(OutputDir & OutputFile2)
                    OutputDocument2.Dispose()
                    For Each fileinput As String In Directory.GetFiles(OutputDir2, files.Name)
                        File.Delete(fileinput)

                    Next
                    'For i = 1 To Get_Files(OutputDir2, IO.SearchOption.TopDirectoryOnly, "pdf", element).Count
                    '    BackgroundWorker1.RunWorkerAsync()
                    '    lblPercent.Text = i
                    '    BackgroundWorker1.ReportProgress(i)
                    '    System.Threading.Thread.Sleep(200)
                    '    lblPercent.Refresh()
                    ' Next
                Next

            Next


        Catch ex As Exception
            MsgBox(Err.Number & " " & Err.Source & "-->" & Err.Description, , "Error")
            Return
        End Try

    End Sub


    Private Function Get_Files(ByVal directory As String,
                           ByVal recursive As IO.SearchOption,
                           ByVal ext As String,
                           ByVal with_word_in_filename As String) As List(Of IO.FileInfo)
        Return IO.Directory.GetFiles(directory, "*" & If(ext.StartsWith("*"), ext.Substring(1), ext), recursive) _
                           .Where(Function(o) o.ToLower.Contains(with_word_in_filename.ToLower)) _
        .Select(Function(p) New IO.FileInfo(p)).ToList
    End Function
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        If MsgBox("Are you sure you want to exit?", MsgBoxStyle.OkCancel) = MsgBoxResult.Ok Then
            System.Windows.Forms.Application.Exit()
            Directory.Delete(inputdir, True)
        End If
    End Sub
    Private Sub Form2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        Dim msgboxresponse As MsgBoxResult
        If e.CloseReason = CloseReason.UserClosing Then
            msgboxresponse = MsgBox("Are you sure you want to exit?",
                                   MsgBoxStyle.Question + MsgBoxStyle.YesNo, Me.Text)
            If msgboxresponse = MsgBoxResult.Yes Then
                e.Cancel = True
                Directory.Delete(inputdir, True)
                System.Windows.Forms.Application.Exit()
                Me.Dispose()
            Else
                Return
            End If
        End If
    End Sub

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Control.CheckForIllegalCrossThreadCalls = False
    End Sub

    'Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    '    ProgressBar1.Value = e.ProgressPercentage
    'End Sub

    'Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    '    MsgBox("Success")
    'End Sub
End Class

Материал BackgroundWorker, который я пробовал, - это закомментированный материал.Индикатор выполнения, который я там написал , работает , работает ... но проблема в том, что он выполняет прогресс для каждой страницы PDF, которая объединяется, поэтому индикатор выполнения почти мгновенно переходит от 1 до 100% для суммывсего страниц PDF, которые объединяются из этого конкретного каталога.У меня вопрос, как бы я изменил это для каждого или вставил бы для i = 0 до что-то длины Так, чтобы индикатор выполнения показывал, когда все PDF-файлы завершены и выведены в последний каталог, который они должныбыть в?

Мой подход и мысль заключались в следующем ... это приложение объединяет, скажем, 20 PDF-файлов из inputdir, который является просто папкой на рабочем столе пользователя с именем "unmerged"

Затем он объединяет эти PDF-файлы соответственнопо File # и их заголовкам и выводит их в папку OutputDir, которая является «объединенной» папкой.

Оттуда он берет файлы PDF с Cover Sheet и Complaint, объединяет эти 2 вместе и помещает их в OutputDir2, который по-прежнему являетсята же «слитая» папка сверху.

Я думал, что мог бы использовать список файлов, которые будут объединены из inputdir в виде массива (20 объектов pdf), и использовать его в качестве array.length для выполнения

For each PDF in array.length 

или

For PDF = 1 to array.length -1

, и я не мог найти способ сделать каталог файлов длиной массива или счетчиком, чтобы сделать это.

Я думал, что в моем коде,каждый раз, когда исходные PDF-файлы, которые использовались для слияния, завершаются, они удаляются из исходного каталога (удаляются все 20 PDF-файлов в незагруженной папке).

Таким образом, сверху всех титульных листов 1 - 3 и жалоб1 - 2 и т. Д. ... удаляются из их каталога с помощью этого кода:

For Each files In Directory.GetFiles(inputdir, "*" & name & "*.pdf")
                File.Delete(files)

            Next

И после этого исходный титульный лист ZTEST01 и жалоба ZTEST01 удаляются после объединения этих двух файлов в "ZTEST01 Cover-CompОбъединяется "с этим кодом:

 For Each fileinput As String In Directory.GetFiles(OutputDir2, files.Name)
                        File.Delete(fileinput)

                    Next

Не стоит ли пытаться объединить

Directory.GetFiles(inputdir, "*" & name & "*.pdf") 

с

Directory.GetFiles(OutputDir2, files.Name) 

в виде объединения двух массивов;первый представляет собой исходные 20 объектов PDF, которые были удалены, а затем еще 2 объекта PDF, которые удаляются после их объединения (ZTEST01 Cover Sheet и ZTEST01 Complaint) и устанавливают комбинацию обоих этих массивов (22 pdf или объектов) в качествеДлина всего массива, с которым я хочу сделать цикл For, чтобы дать мне индикатор выполнения, чтобы показать пользователю, когда все приложение готово?

Кроме того, если включить индикатор выполнения, можно ли в любом случае выдать msgBox, который показывает пользователю, что все приложение завершено после того, как все сделано?

Я попытался поместить Call Complete () вконец всего этого кода в последнем подпрограмме в for as

Public Sub Complete
MsgBox("Complete")
End Sub

Но это приложение вызывает этот путь слишком рано, прежде чем все слияние будет завершено.

...