Разделение многостраничных PDF-файлов на основе штрих-кода на странице до следующего уникального штрих-кода - PullRequest
0 голосов
/ 31 августа 2018

У меня есть код VB.NET, который до сих пор работает для одного файла, и он разбивает этот файл на основе уникального штрих-кода на каждой странице, чтобы идентифицировать его.

Каждый штрих-код является одним из:

COVERSPLIT
COMPLAINTSPLIT
EXHIBITSPLIT
MILSPLIT
SUMSPLIT

Проблема в том, что, например, на первой странице есть штрих-код 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 на Integer i + 1 на i +2, чтобы включить его дополнительную страницу.

Проблема в том, что иногда страница с уникальным штрих-кодом может иметь неопределенное количество страниц после нее ...

Итак, как бы я написал это так, чтобы он извлекал, например:

Страница COVERSPLIT + все последующие страницы без штрих-кода до перехода на следующую страницу с штрих-кодом (COMPLAINTSPLIT, например)? А также, как я мог сделать это так, чтобы он извлекал страницу со штрих-кодом COVERSPLIT со своими страницами (до тех пор, пока он не достигнет следующего штрих-кода), но сохраняя все эти страницы вместе в одном файле PDF?

1 Ответ

0 голосов
/ 31 августа 2018

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

Итак, если мы получим список штрих-кодов, которые идентифицируют тип страницы, мы можем перебрать их, чтобы узнать, какой тип является текущей страницей. Если штрих-код отсутствует, мы предполагаем, что тип страницы не изменился по сравнению с предыдущей страницей.

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

I подозревают , что Using splitter As New DocumentSplitter() With {.OptimizeSplittedDocuments = True} должно быть вне цикла For, чтобы он не создавался и не уничтожался для каждой страницы.

Я переименовал вашу переменную page, поскольку она мешает краткому использованию IO.Path. Лучше использовать метод Path.Combine для объединения частей пути, потому что он заботится о символах разделителя пути.


Чтобы собрать все страницы типа в один файл, вам необходимо определить, когда тип изменится, а затем использовать метод ExtractPageRange . У меня нет Bytescout.PDFExtractor или примера PDF, поэтому я не могу его опробовать.

...