У меня есть приложение, которое я написал, и оно почти завершено.Эта часть приложения берет каждый 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
Но это приложение вызывает этот путь слишком рано, прежде чем все слияние будет завершено.