Несоответствующий счетчик страниц документа PDF - PullRequest
0 голосов
/ 16 мая 2018

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

После нескольких часов исследований я пришел к выводу, что этопроще сказать, чем сделать. Количество страниц редко возвращается, давая мне правильное количество страниц , хотя в большинстве PDF-файлов действительно есть /Count внутри двоичного кода.

Например, я использовал следующеекод;он должен открыть документ в двоичном режиме, найти /Count или /N и получить рядом с ним номер, который должен подсчитать количество страниц.

Public Sub pagecount(sfilename As String)
    On Error GoTo a
    Dim nFileNum As Integer
    Dim s As String
    Dim c As Integer
    Dim pos, pos1 As Integer
    pos = 0
    pos1 = 0
    c = 0
    ' Get an available file number from the system
    nFileNum = FreeFile
    'OPEN the PDF file in Binary mode
    Open sfilename For Binary Lock Read Write As #nFileNum
    ' Get the data from the file
    Do Until EOF(nFileNum)
    Input #1, s
    c = c + 1
    If c <= 10 Then
        pos = InStr(s, "/N")
    End If
    pos1 = InStr(s, "/count")
       If pos > 0 Or pos1 > 0 Then
            Close #nFileNum
            s = Trim(Mid(s, pos, 10))
            s = Replace(s, "/N", "")
            s = Replace(s, "/count", "")
            s = Replace(s, " ", "")
            s = Replace(s, "/", "")
            For i = 65 To 125
                    s = Replace(s, Chr(i), "")
            Next
            pages = Val(Trim(s))
            If pages < 0 Then
                pages = 1
            End If
            Close #nFileNum
            Exit Sub
        End If
        'imp only 1000 lines searches
        If c >= 1000 Then
             GoTo a
        End If
     Loop
       Close #nFileNum
       Exit Sub
   a:
       Close #nFileNum
       pages = 1
       Exit Sub
End Sub

Однако большинствовремя, по умолчанию это страницы = 1 (под :).Я также обновил его до 10000, чтобы быть уверенным, что он попадает в строку /Count, но все равно не дает правильного подсчета.

If c >= 10000 Then
         GoTo a
End If

Я также сталкивался с этим reddit

Есть ли другой способ сделать это, что я могу использовать в своем приложении?

Любая помощь приветствуется.


Справочная информация:

Это для устаревшего приложения vb6, где я пытаюсь позволить пользователю манипулировать файлами PDF.Я добавил ListBox, который отображает все документы PDF в определенном каталоге.Когда пользователь дважды щелкает по любому из файлов, я отображаю его в компоненте WebBrowser внутри моего приложения.

РЕДАКТИРОВАТЬ: Изображение, содержащее строку BinaryMode Count для 3 различных документов: enter image description here

Я дважды проверил количество страниц, и / Count отображает правильное количество страниц для каждого из трех документов.

1 Ответ

0 голосов
/ 17 мая 2018

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

Добавьте ссылку на Microsoft VBScript Regular Expressions 5.5 в ваш проект. Тогда вы можете попробовать пример кода ниже.

Private Sub Command1_Click()
    Dim oRegEx As RegExp
    Dim fHndl As Integer
    Dim sContents As String
    Dim oMatches As MatchCollection

    On Error GoTo ErrCommand1_Click

    'Open and read in the file
    fHndl = FreeFile
    Open some pdf file For Binary Access Read As fHndl
    sContents = String(LOF(fHndl), vbNull)
    Get #fHndl, 1, sContents
    Close #fHndl    'We have the file contents so close it
    fHndl = 0

    'Instantiate and configure the RegEx
    Set oRegEx = New RegExp
    oRegEx.Global = True
    oRegEx.Pattern = "((?:/Count )(\d+))"
    Set oMatches = oRegEx.Execute(sContents)

    'Look for a match
    If oMatches.Count > 0 Then
       If oMatches(0).SubMatches.Count > 0 Then
           MsgBox CStr(oMatches(0).SubMatches(0)) & " Pages"
       End If
    End If

    Exit Sub

ErrCommand1_Click:
    Debug.Print "Error: " & CStr(Err.Number) & ", " & Err.Description
    If Not oRegEx Is Nothing Then Set oRegEx = Nothing
    If Not oMatches Is Nothing Then Set oMatches = Nothing

End Sub

Объяснение шаблона RegEx:
() создает группу
?: в круглых скобках делает группу не захватывающей
<</Linearized является литеральной строкой
.* жадный квантификатор, соответствует любому символу 0 или более раз
/N буквенная строка
\d+ жадный квалификатор, совпадающие цифры 1 или более раз
>> буквенная строка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...