Vb.net 根据页面上的条形码拆分多页PDF,直到下一个唯一条形码

Vb.net 根据页面上的条形码拆分多页PDF,直到下一个唯一条形码,vb.net,pdf,merge,pdfsharp,Vb.net,Pdf,Merge,Pdfsharp,到目前为止,我有一个适用于一个文件的VB.NET代码,它根据每个页面上的唯一条形码对该文件进行分割以识别它 每个条形码是以下其中之一: COVERSPLIT 投诉拆分 参展商拆分 米尔斯普利特 萨姆斯普利特 问题是:例如,第一页有COVERSPLIT的条形码,因为它是封面,但下一页也是封面,但上面没有条形码。因此,当我运行代码时,它只提取带有识别条形码的表单,而不提取那些没有识别条形码的表单。​ 我试着这样做: Imports Bytescout.PDFExtractor Imports Sys

到目前为止,我有一个适用于一个文件的VB.NET代码,它根据每个页面上的唯一条形码对该文件进行分割以识别它

每个条形码是以下其中之一:

COVERSPLIT
投诉拆分
参展商拆分
米尔斯普利特
萨姆斯普利特

问题是:例如,第一页有COVERSPLIT的条形码,因为它是封面,但下一页也是封面,但上面没有条形码。因此,当我运行代码时,它只提取带有识别条形码的表单,而不提取那些没有识别条形码的表单。​

我试着这样做:

Imports Bytescout.PDFExtractor
Imports System.Collections
Imports System.Collections.Generic
Imports System.IO.Path
Class Program


    Friend Shared Sub Main(args As String())



        Dim Dir As String = "G:\Word\Department Folders\Pre-Suit\Drafts-IL\2-IL_AttyReview\2018-09\Reviewed\"
        Dim inputFile As String = Dir & "ZTEST01.SMITH.pdf"
        Dim Unmerged As String = Dir & "unmerged\"

        Dim Path As String = IO.Path.GetFileNameWithoutExtension(inputFile)
        Dim Extracted As String = Path.Substring(0, 7)

        ' Create Bytescout.PDFExtractor.TextExtractor instance
        Dim extractor As New TextExtractor()

        ' Load sample PDF document
        extractor.LoadDocumentFromFile(inputFile)

        Dim pageCount As Integer = extractor.GetPageCount()

        ' Search each page for a keyword 
        For i As Integer = 0 To pageCount - 1

            If extractor.Find(i, "COVERSPLIT", False) Then

                ' Extract page
                Using splitter As New DocumentSplitter()

                    splitter.OptimizeSplittedDocuments = True

                    Dim pageNumber As Integer = i + 1
                    ' (!) page number in ExtractPage() is 1-based

                    Dim outputfile As String = Unmerged & Extracted & " Cover Sheet " & pageNumber.ToString() & ".pdf"

                    splitter.ExtractPage(inputFile, outputfile, pageNumber)


                    Console.WriteLine("Extracted page " & pageNumber.ToString() & " to file """ & outputfile & """")

                End Using
            End If
        Next

        For i As Integer = 0 To pageCount - 1

            If extractor.Find(i, "COVERSPLIT", False) Then

                ' Extract page
                Using splitter As New DocumentSplitter()

                    splitter.OptimizeSplittedDocuments = True

                    Dim pageNumber As Integer = i + 2
                    ' (!) page number in ExtractPage() is 1-based

                    Dim outputfile As String = Unmerged & Extracted & " Cover Sheet " & pageNumber.ToString() & ".pdf"

                    splitter.ExtractPage(inputFile, outputfile, pageNumber)


                    Console.WriteLine("Extracted page " & pageNumber.ToString() & " to file """ & outputfile & """")

                End Using
            End If
        Next
        For i As Integer = 0 To pageCount - 1

            If extractor.Find(i, "COMPLAINTSPLIT", False) Then

                ' Extract page
                Using splitter As New DocumentSplitter()

                    splitter.OptimizeSplittedDocuments = True

                    Dim pageNumber As Integer = i + 1
                    ' (!) page number in ExtractPage() is 1-based

                    Dim outputfile As String = Unmerged & Extracted & " Complaint " & pageNumber.ToString() & ".pdf"

                    splitter.ExtractPage(inputFile, outputfile, pageNumber)

                    Console.WriteLine("Extracted page " & pageNumber.ToString() & " to file """ & outputfile & """")

                End Using
            End If
        Next

        For i As Integer = 0 To pageCount - 1

            If extractor.Find(i, "COMPLAINTSPLIT", False) Then

                ' Extract page
                Using splitter As New DocumentSplitter()

                    splitter.OptimizeSplittedDocuments = True

                    Dim pageNumber As Integer = i + 2
                    ' (!) page number in ExtractPage() is 1-based

                    Dim outputfile As String = Unmerged & Extracted & " Complaint " & pageNumber.ToString() & ".pdf"

                    splitter.ExtractPage(inputFile, outputfile, pageNumber)

                    Console.WriteLine("Extracted page " & pageNumber.ToString() & " to file """ & outputfile & """")

                End Using
            End If
        Next
        For i As Integer = 0 To pageCount - 1

            If extractor.Find(i, "EXHIBITSPLIT", False) Then

                ' Extract page
                Using splitter As New DocumentSplitter()

                    splitter.OptimizeSplittedDocuments = True

                    Dim pageNumber As Integer = i + 1
                    ' (!) page number in ExtractPage() is 1-based

                    Dim outputfile As String = Unmerged & Extracted & " Exhibit " & pageNumber.ToString() & ".pdf"

                    splitter.ExtractPage(inputFile, outputfile, pageNumber)

                    Console.WriteLine("Extracted page " & pageNumber.ToString() & " to file """ & outputfile & """")

                End Using
            End If
        Next

        For i As Integer = 0 To pageCount - 1

            If extractor.Find(i, "EXHIBITSPLIT", False) Then

                ' Extract page
                Using splitter As New DocumentSplitter()

                    splitter.OptimizeSplittedDocuments = True

                    Dim pageNumber As Integer = i + 2
                    ' (!) page number in ExtractPage() is 1-based

                    Dim outputfile As String = Unmerged & Extracted & " Exhibit " & pageNumber.ToString() & ".pdf"

                    splitter.ExtractPage(inputFile, outputfile, pageNumber)

                    Console.WriteLine("Extracted page " & pageNumber.ToString() & " to file """ & outputfile & """")

                End Using
            End If
        Next
        For i As Integer = 0 To pageCount - 1

            If extractor.Find(i, "MILSPLIT", False) Then

                ' Extract page
                Using splitter As New DocumentSplitter()

                    splitter.OptimizeSplittedDocuments = True

                    Dim pageNumber As Integer = i + 1
                    ' (!) page number in ExtractPage() is 1-based

                    Dim outputfile As String = Unmerged & Extracted & " Military " & pageNumber.ToString() & ".pdf"

                    splitter.ExtractPage(inputFile, outputfile, pageNumber)

                    Console.WriteLine("Extracted page " & pageNumber.ToString() & " to file """ & outputfile & """")

                End Using
            End If
        Next

        For i As Integer = 0 To pageCount - 1

            If extractor.Find(i, "SUMSPLIT", False) Then

                ' Extract page
                Using splitter As New DocumentSplitter()

                    splitter.OptimizeSplittedDocuments = True

                    Dim pageNumber As Integer = i + 1
                    ' (!) page number in ExtractPage() is 1-based

                    Dim outputfile As String = Unmerged & Extracted & " Summons " & pageNumber.ToString() & ".pdf"

                    splitter.ExtractPage(inputFile, outputfile, pageNumber)

                    Console.WriteLine("Extracted page " & pageNumber.ToString() & " to file """ & outputfile & """")

                End Using
            End If
        Next

        For i As Integer = 0 To pageCount - 1

            If extractor.Find(i, "SUMSPLIT", False) Then

                ' Extract page
                Using splitter As New DocumentSplitter()

                    splitter.OptimizeSplittedDocuments = True

                    Dim pageNumber As Integer = i + 2
                    ' (!) page number in ExtractPage() is 1-based

                    Dim outputfile As String = Unmerged & Extracted & " Summons " & pageNumber.ToString() & ".pdf"

                    splitter.ExtractPage(inputFile, outputfile, pageNumber)

                    Console.WriteLine("Extracted page " & pageNumber.ToString() & " to file """ & outputfile & """")

                End Using
            End If
        Next

        ' Cleanup
        extractor.Dispose()

        Console.WriteLine()
        Console.WriteLine("Press any key...")
        Console.ReadKey()

    End Sub
End Class
如您所见,我刚刚复制并粘贴了相同的
For I..
循环,并将Dim pageNumber更改为整数I+1到I+2,以包含其第二页

问题是,有时带有唯一条形码的页面后面可能有不确定数量的页面

那么,我该如何写这篇文章,以便它能够提取,例如:

Page COVERSPLIT+在进入下一个带有条形码的页面之前,所有后续页面都没有条形码(例如,COMPLAINTSPLIT)? ​
还有,我如何才能做到这一点,使其提取带有条形码封面的页面与其页面拆分(直到到达下一个条形码),但将所有这些页面保存在一个pdf中?

您已经注意到,您有很多重复的代码。在这种情况下,您可以将在其他相同代码之间变化的小部分放入一个变量中

所以,如果我们得到一个识别页面类型的条形码列表,我们可以遍历它们来找出当前页面的类型。如果没有条形码,则我们假定页面类型与上一页相同

Option Infer On
Option Strict On

Imports System.IO

Module Module1

    Class PageType
        Property Identifier As String
        Property TypeName As String
    End Class

    Sub Main()
        Dim dir = "G:\Word\Department Folders\Pre-Suit\Drafts-IL\2-IL_AttyReview\2018-09\Reviewed\"

        Dim inputFile = Path.Combine(dir, "ZTEST01.SMITH.pdf")
        Dim unmerged = Path.Combine(dir, "unmerged")

        ' Set up a list of the identifiers to be searched for and the corresponding names to be used in the filename.
        Dim pageTypes As New List(Of PageType)
        Dim ids = {"COVERSPLIT", "COMPLAINTSPLIT", "EXHIBITSPLIT", "MILSPLIT", "SUMSPLIT"}
        Dim nams = {" Cover Sheet ", " Complaint ", " Exhibit ", " Military ", " Summons "}
        For i = 0 To ids.Length - 1
            pageTypes.Add(New PageType With {.Identifier = ids(i), .TypeName = nams(i)})
        Next

        Dim extracted = Path.GetFileNameWithoutExtension(inputFile).Substring(0, 7)

        Dim extractor As New TextExtractor()

        ' Load sample PDF document
        extractor.LoadDocumentFromFile(inputFile)

        Dim pageCount = extractor.GetPageCount()
        Dim currentPageTypeName = "UNKNOWN"

        ' Search each page for a keyword 
        For i = 0 To pageCount - 1

            ' Find the type of the current page
            ' If it is not present on the page, then the last one found will be used.
            For Each pt In pageTypes
                If extractor.Find(i, pt.Identifier, False) Then
                    currentPageTypeName = pt.TypeName
                End If
            Next

            ' Extract page
            Using splitter As New DocumentSplitter() With {.OptimizeSplittedDocuments = True}
                Dim pageNumber = i + 1  ' (!) page number in ExtractPage() is 1-based
                Dim outputfile = Path.Combine(unmerged, extracted & currentPageTypeName & pageNumber & ".pdf")

                splitter.ExtractPage(inputFile, outputfile, pageNumber)

                Console.WriteLine("Extracted page " & pageNumber & " to file """ & outputfile & """")

            End Using

        Next

        extractor.Dispose()

        Console.WriteLine()
        Console.WriteLine("Press any key...")
        Console.ReadKey()

    End Sub

End Module
我怀疑,{.OptimizeSplittedDocuments=True}将拆分器用作新的DocumentSplitter()的
应该在For循环之外,这样就不会为每个页面创建和销毁它

我重命名了您的
页面
变量,因为它干扰了IO.Path的简洁使用。最好使用Path.Combine方法组合路径的各个部分,因为它会为您处理路径分隔符


要将一个类型的所有页面累积到一个文件中,您必须检测类型何时更改,然后使用方法。我没有Bytescout.PDFExtractor或示例PDF,因此无法尝试