Извлечение полного переносимого слова из .pdf с помощью acrobat.tlb в .NET VB или C # - PullRequest
0 голосов
/ 12 сентября 2018

Я анализирую .pdf с использованием библиотеки acrobat.tlb

Слова с переносами переносятся по новым строкам с удалением дефисов.

например. ABC-123-XXX-987

Разбирает как:
ABC
123
XXX
987

Если я анализирую текст с помощью iTextSharp, он анализирует всю строку, как показано в файле, и это то поведение, которое мне нужно. Однако мне нужно выделить эти строки (серийные номера) в формате .pdf, а iTextSharp не размещает выделение в правильном месте ... отсюда acrobat.tlb

Я использую этот код, отсюда: http://www.vbforums.com/showthread.php?561501-RESOLVED-2003-How-to-highlight-text-in-pdf

 ' filey = "*your full file name including directory here*"
        AcroExchApp = CreateObject("AcroExch.App")
        AcroExchAVDoc = CreateObject("AcroExch.AVDoc")
        ' Open the [strfiley] pdf file
        AcroExchAVDoc.Open(filey, "")       

        ' Get the PDDoc associated with the open AVDoc
        AcroExchPDDoc = AcroExchAVDoc.GetPDDoc
        sustext = "accessorizes"
        suktext = "accessorises" 
        ' get JavaScript Object
        ' note jso is related to PDDoc of a PDF,
        jso = AcroExchPDDoc.GetJSObject
        ' count
        nCount = 0
        nCount1 = 0
        gbStop = False
        bUSCnt = False
        bUKCnt = False
        ' search for the text
        If Not jso Is Nothing Then
            ' total number of pages
            nPages = jso.numpages           

                ' Go through pages
                For i = 0 To nPages - 1
                    ' check each word in a page
                    nWords = jso.getPageNumWords(i)
                    For j = 0 To nWords - 1
                        ' get a word

                        word = Trim(CStr(jso.getPageNthWord(i, j)))
                        'If VarType(word) = VariantType.String Then
                        If word <> "" Then
                            ' compare the word with what the user wants
                            If Trim(sustext) <> "" Then
                                result = StrComp(word, sustext, vbTextCompare)
                                ' if same
                                If result = 0 Then
                                    nCount = nCount + 1
                                    If bUSCnt = False Then
                                        iUSCnt = iUSCnt + 1
                                        bUSCnt = True
                                    End If
                                End If
                            End If
                            If suktext<> "" Then
                                result1 = StrComp(word, suktext, vbTextCompare)
                                ' if same
                                If result1 = 0 Then
                                    nCount1 = nCount1 + 1
                                    If bUKCnt = False Then
                                        iUKCnt = iUKCnt + 1
                                        bUKCnt = True
                                    End If
                                End If
                            End If
                        End If
                    Next j
                Next i
jso = Nothing
        End If

Код выполняет выделение текста, но цикл FOR с переменной 'word' разбивает дефисную строку на составные части.

For i = 0 To nPages - 1
                        ' check each word in a page
                        nWords = jso.getPageNumWords(i)
                        For j = 0 To nWords - 1
                            ' get a word

                            word = Trim(CStr(jso.getPageNthWord(i, j)))

Кто-нибудь знает, как поддерживать всю строку, используя acrobat.tlb? Мои довольно обширные поиски вычеркнули пробел.

1 Ответ

0 голосов

Я могу понять, что iTextSharp проблематичен при выделении текста, потому что вам приходится рисовать прямоугольник и становится сложным, но решение acrobat.tlb также имеет свой недостаток.Это не бесплатно, мало кто может его использовать.Лучшим решением для остальных из нас является бесплатный и простой в использовании Spire.Pdf.Вы можете получить его из пакетов NuGet .Код выполняет следующие действия:

  • Открывает .pdf
  • Прочитать каждую текстовую страницу
  • , используя регулярные выражения, найти совпадения
  • сохранить ихк списку строк, исключающих дубликаты
  • для каждой строки в этой странице поиска списка, и выделите слово

Код:

Dim pdf As PdfDocument = New PdfDocument("Path")
Dim pattern As String = "([A-Z,0-9]{3}[-][A-Z,0-9]{3}[-][A-Z,0-9]{3}[-][A-Z,0-9]{3})"
Dim matches As MatchCollection

Dim result As PdfTextFind() = Nothing
Dim content As New StringBuilder()
Dim matchList As New List(Of String)

For Each page As PdfPageBase In pdf.Pages
    'get text from current page
    content.Append(page.ExtractText())

    'find matches
    matches = Regex.Matches(content.ToString, pattern, RegexOptions.None)

    matchList.Clear()

    'Assign each match to a string list.
    For Each match As Match In matches
        matchList.Add(match.Value)
    Next

    'Eliminate duplicates.
    matchList = matchList.Distinct.ToList

    'for each string in list
    For i = 0 To matchList.Count - 1
        'find all occurances of matchList(i) string in page and highlight it
        result = page.FindText(matchList(i)).Finds

        For Each find As PdfTextFind In result
            find.ApplyHighLight(Color.BlueViolet) 'you can set your color preference
        Next

    Next 'matchList

Next 'page

pdf.SaveToFile("New Path")

pdf.Close()
pdf.Dispose()

Яне так хорошо в regular expression, чтобы вы могли реализовать свои.Это был мой подход в любом случае.

...