[Acr DC] Как считать текстовое поле из PDF с помощью скрипта

Статус
Закрыто для дальнейших ответов.

iDim

Участник
Топикстартер
Сообщения
14
Реакции
1
Добрый день !

Нужна помощь апологетов скриптинга для Adobe Acrobat :o)

Есть готовый PDF файл, содержащий внутри:
- номер бухгалтерского счета вида «Счет №003 от 10.10.2016»;
- информацию о плательщике вида «Плательщик ООО «Эволюция печати»;

Надо с помощью скрипта найти в этом PDF эти элементы, и считать из них текстовую информацию, чтобы потом переименовать сам файл в «Счет №003 Эволюция печати.pdf».

Сам неплохо знаком со скриптингом для InDesign на VB.
Но с Acrobat дел не имел, так что буду благодарен за любые подсказки и идеи.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Есть готовый PDF файл, содержащий внутри:
- номер бухгалтерского счета вида «Счет №003 от 10.10.2016»;
- информацию о плательщике вида «Плательщик ООО «Эволюция печати»;
Содержащего где?
В текстовом поле формы или текстовый объект в самом файле?
Если второе, то могут быть серьезные проблемы с кодировкой кириллицы.
 

iDim

Участник
Топикстартер
Сообщения
14
Реакции
1
Скорее в текстовом объекте в самом файле (как проверить ?).
PDF файл генерирует программа всегда одинаковым образом, всегда на одном месте, всегда одним шрифтом Arial.
Мне кажется, что у Arial всегда все хорошо с кодировкой :о)
 

iDim

Участник
Топикстартер
Сообщения
14
Реакции
1
Но даже если с кодировкой кириллицы будут проблемы - это не важно.
Ключевые слова для поиска всегда одинаковые «Счет №» и «Плательщик».
Главное найти эти кусочки текста.
 

iDim

Участник
Топикстартер
Сообщения
14
Реакции
1
Вот образец PDF файла (залил на Яндекс диск):
yadi точка sk/i/gn_QzHTgwiutc
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Судя по всему, действительно, с кодировкой все ok
upload_2016-10-13_13-6-10.png

Код:
for (i=0;i<this.getPageNumWords(0);i++)
{
if (this.getPageNthWord(0,i).length>0)
{
  app.alert(this.getPageNthWord(0,i));
}
 
  • Спасибо
Реакции: iDim

iDim

Участник
Топикстартер
Сообщения
14
Реакции
1
Спасибо за код !
Я все вставил в Acrobat - работает, слова из документа перебирает отлично.

Но мне нужен внешний скрипт, так как запускать его будет другая программа.
Порядок такой:
- программа PDF Creator создает файл с именем например Счет.pdf .
- сразу после того как этот файл создан, автоматически запускается скрипт
- скрипт считывает текст и в соответствии с ним меняет название файла например Счет №001 Компания.pdf

Т.е в скрипт в начале должен настраиваться на конкретный документ Счет.pdf
и далее выполнять файловые операции по переименованию.

Для VB это выглядит приблизительно так:
Код:
Private Sub Test_Acrobat_Click()

    Dim AcroApp As Acrobat.CAcroApp
    Dim Document As Acrobat.CAcroPDDoc
    Dim numPages As Integer
    Dim N As Long
    Dim S As String

    Set AcroApp = CreateObject("AcroExch.App")
    Set Document = CreateObject("AcroExch.PDDoc")
    Document.Open ("C:\Temp\Счет.pdf ")
 
    'выполняем нужные операции с открытым документом, например
    S = Document.GetFileName 'считывает имя файла текущего
    N = Document.GetNumPages 'получает количество страниц в документе
       
    Document.Close
    AcroApp.Exit
 
    Set AcroApp = Nothing
    Set Document = Nothing

    MsgBox "Done"

End Sub


Так как я в Javascript не программировал, то буду крайне признателен, если вы приведете
кусок кода, который покажет настройку на нужный файл PDF.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Брр, я что-то не пойму, так вам что, надо мой кусок кода в бейсик затащить или ваш в мой яваскрипт? %8
 
  • Спасибо
Реакции: iDim

iDim

Участник
Топикстартер
Сообщения
14
Реакции
1
Нет :о)
Мой VB код приведен только в качестве примера - там как раз скрипт
настраивается на нужный документ :о)

Поскольку из VB к сожалению не получается сделать, то что надо (получить текст из PDF),
то мне придется освоить JavaScript и писать весть скрипт на нем.

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
А почему не получается на VB сделать? Насколько я помню, там вся обьектная модель задублирована с яваскриптом.
 
  • Спасибо
Реакции: iDim

iDim

Участник
Топикстартер
Сообщения
14
Реакции
1
Да, действительно похоже на то :о)

Вот нашел документ Developing Applications Using Interapplication Communication
где написано:
Acrobat provides a rich set of JavaScript programming interfaces that can be used from within the Acrobat environment. It also provides the JSObject interface, which allows external clients to access the same functionality from environments such as Visual Basic.

In precise terms, JSObject is an interpretation layer between an OLE automation client, such as a Visual Basic application, and the JavaScript functionality provided by Acrobat. From a developer's point of view, programming JSObject in a Visual Basic environment is similar to programming in JavaScript using the Acrobat console.

Общий смысл, что весь функционал JavaScript доступен в Visual Basic через JSObject.

И сразу нашлось решение для считывания слов из PDF с помошью Visual Basic
Код:
Private Sub Test_Acrobat_Click()

    Dim AcroApp As Acrobat.CAcroApp
    Dim PDFDocument As Acrobat.CAcroPDDoc
    Dim jso As Object
    Dim count As Integer
    Dim i As Integer
    Dim Word As Variant

    Set AcroApp = CreateObject("AcroExch.App")
    Set PDFDocument = CreateObject("AcroExch.PDDoc")   
  
    If PDFDocument.Open("C:\Temp\Test 1.pdf") Then
        Set jso = PDFDocument.GetJSObject
        If Not jso Is Nothing Then
            count = jso.getPageNumWords(0) 'получаем количество слов на странице
            For i = 0 To count - 1
                Word = jso.getPageNthWord(0, i) 'считываем слово по порядку
                If VarType(Word) = vbString Then S = Word
            Next i
        End If
    Else
        MsgBox "Failed to open file"
    End If
    
    PDFDocument.Close
    AcroApp.Exit
    
    Set AcroApp = Nothing
    Set PDFDocument = Nothing
    jso = Nothing

End Sub
 

iDim

Участник
Топикстартер
Сообщения
14
Реакции
1
Спасибо огромное, что натолкнули на хорошую идею ! 'thank'

Вот теперь бы научиться считывать текст по координатам ;]=
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Тоже несложно. Курите метод getPageNthWordQuads - он, хотя и несколько заднепроходно, но координаты каждого слова возвращает, в референсе примеры есть. А для спасибо тут есть кнопочка в правом нижнем углу. ;)
 
  • Спасибо
Реакции: iDim

iDim

Участник
Топикстартер
Сообщения
14
Реакции
1
Кнопочки в правом углу по-нажимал неоднократно :)
 
  • Спасибо
Реакции: _MBK_

iDim

Участник
Топикстартер
Сообщения
14
Реакции
1
Разобрал метод getPageNthWordQuads, он возвращает аж все 4 координаты текста в массиве.
Только считает от левого нижнего угла страницы и значения в пунктах.
Не бог весть как удобно, но вполне себе приемлемо.
 

iDim

Участник
Топикстартер
Сообщения
14
Реакции
1
Также обнаружил одну особенность метода getPageNthWord.
Он считывает слова, но при этом удаляет все символы пунктуации, вопросительные и восклицательные знаки и т.д.
Точнее он их считывает, но как слово с нулевой длинной.
Даже дефисы :о(
Т.е. если у вас есть слово «во-первых», он считает его как три слова: «во», «», «первых».
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
На самом деле, все гораздо хуже. Вам очень сильно повезло с файлами - там и с кодировкой все в порядке и слова более-менее нормально определяются. Этот механизм в pdf сделан исключительно длч комментирования поэтому работает несколько заднепроходно
 

iDim

Участник
Топикстартер
Сообщения
14
Реакции
1
Ну раз уж тему так раскурили, то уже чисто из академического интереса:
есть ли возможность узнать/задать шрифт для текста (слова) ?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Из скрипта - нет
 
Статус
Закрыто для дальнейших ответов.