Страницы: 1
RSS
Есть ли возможность сохранить PDF-файл в txt-формате из VBA?
 
Добрый день,
собственно говоря в названии темы отображена часть окольного пути для получения данных из PDF-файла в Excel
Знаю что есть спец. конвертеры - но по нескольким причинам они не подходят.
Ипользование SendKeys не дает нужного результата (тем более очень ненадежно все):

Код
Sub er()
Dim f$
Application.CutCopyMode = False
f = "c:\Documents and Settings\vvv\Рабочий стол\20245.pdf"
CreateObject("wscript.shell").Run """" & f & """"
Application.Wait (Now + TimeValue("0:00:05"))
SendKeys "^a", 100
SendKeys "^c", 10
SendKeys ("%n"), 10
Workbooks("по пдф").ActiveSheet.[a1].Activate
' ActiveSheet.[a1].PasteSpecial
End Sub
 
По этому возникла идея:
при "ручной" обработке PDF-файла есть возможность сохранить его в Блокнот,
а уже обработать содержимое txt-файла из VBA не есть проблема.
Так вот вопрос: как открытый из VBA PDF-файл сохранить в нужное место с форматом .txt?
 
Могу посоветовать вот такой вот кусок кода для сохранения текстового файла в нужное место (по мотивам):
Код
Sub Notepader()
Application.ScreenUpdating = False
Dim FF As Integer
Dim newpdf As String
newpdf = ThisWorkbook.Path & "\PDF1.txt" ' path and name
If FileOrDirExists(newpdf) Then
    Kill newpdf ' kill previous file
End If
    FF = FreeFile
    Open newpdf For Output As #FF
    Close #FF
    Shell "Notepad.exe " & newpdf, vbNormalFocus
    SendKeys "^v", True
    Application.Wait (Now + TimeValue("0:00:03"))
    Application.SendKeys "%{F4}" ', True 'close
    Application.SendKeys "{ENTER}"
Application.ScreenUpdating = True
End Sub

Function FileOrDirExists(PathName As String) As Boolean
 
Dim iTemp As Integer
 
On Error Resume Next
iTemp = GetAttr(PathName)
 
Select Case Err.Number
Case Is = 0
FileOrDirExists = True
Case Else
FileOrDirExists = False
End Select
 
On Error GoTo 0
End Function
F1 творит чудеса
 
Спасибо Максим,
а все таки можно ли из VBA сохранить PDF в текстовом формате?
Нашел несколько советов но то ли они нерабочие то ли я не могу ими воспользоваться:
пример 1
пример 2
может у кого что получиться  
 
в первом примере надо же еще доп.программу скачать - которая и выдергивает текст из PDF в текстовый файл
F1 творит чудеса
 
Максим я увидел про скачивание программы (кстати она бесплатная насколько я понимаю так как не имею возможности проинсталировать на работе)
но вот где именно она задействована (и задействована ли) по ходу кода я не смог определить.
Кстати, может кто сталкивался, с использованием метода FileCopy
возможно на этом этапе можно поменять расширение или забрать данные из PDF?  
 
во втором примере понятно, почему не срабатывает - нужен установленный Adobe Acrobat (именно Acrobat, а не Acrobat Reader). Скорее всего его нет.
Цитата
Vitallic пишет: где именно она задействована (и задействована ли) по ходу кода я не смог определить.
Там всё достаточно просто. Вызывается bat-файл в этой строке
Код
TestValue = Shell("YourPage.bat", 1) 
bat-файл содержит только одну строку:
Код
' pdftotext.exe -layout YourPage.pdf
там ниже есть подробная инструкция по его созданию:
Скрытый текст
F1 творит чудеса
 
Спасибо - понято :)
 
У меня есть самописная программа для преобразования файла ПДФ в формат rtf
Работает через командную строку.
Параметр,путь к файлу ПДФ ,файл rtf формируется в одной директории с файлом ПДФ.
Можно и в Excel вывести,если это таблица.
Надо на структуру файла глянуть.
Если подходит,пишите в личку,поделюсь.
 
Doober, спасибо за отклик
возьму на заметку Ваше предложение
 
Цитата
Vitallic пишет: но вот где именно она задействована
Код
TestValue = Shell("YourPage.bat", 1) 
Проверил, отработало.
Но вот на практике проще использовать текст после ручного сохранения.
 
Добрый день.
Решил дописать сообщение в эту тему может кому-то будет полезная информация:
вытаскивать текст из pdf-файла (если он сохранен  "правильно", а не сканирован) получилось
вот таким образом:

Код
Sub Robo4uj()
'On Error Resume Next
Dim answer, FileNum, r%, wb As Workbook, Data$
answer = Application.GetOpenFilename(Title:="Выбрать файл", FileFilter:="PDF Files *.pdf (*.pdf),")
CreateObject("wscript.shell").Run """" & answer & """"
Debug.Print answer
Application.Wait (Now + TimeValue("0:00:02"))
SendKeys "^+S", 10
SendKeys "~", 10
SendKeys "^q", 10
answer = Replace(answer, ".pdf", ".txt")
   With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & answer, Destination:=Range("$A$1"))
    .TextFilePlatform = 65001
    .Refresh BackgroundQuery:=False
   End With
   Debug.Print answer
Kill (answer)
End Sub
 
да в макросе присутствует "неконтролируемый" участок кода (имитация кнопок),
но если не ставить ничего дополнительного (конвертеров), то получилось как-то так.
Отдельно надо сказать что за умолчанием pdf-файл открывается с помощью Foxit Fantom исключительно вот такой версии (рис.):
потому как в вышеуказаной версии по умолчанию стоит сохранение в txt-формате.
Что касаеться использования pdftotext.exe то програмка действительно бесплатная.
К ней нашел еще такой вот макрос отработало на 5+(нюанс только есть ли у Вас возможность ставить exe-файлы, например на работе):

Код
Sub PdfToText()
Dim answer, source As String, dest As String, exe As String, wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
answer = Application.GetOpenFilename(Title:="Please choose a file to import", FileFilter:="PDF Files *.pdf (*.pdf),")
If answer = False Then
MsgBox "No file specified.", vbExclamation, "Warning"
Exit Sub
End If
source = answer
exe = "c:\Documents and Settings\vvv\Ðàáî÷èé ñòîë\oper\bin32\pdftotext.exe"
dest = Replace(source, ".pdf", ".txt")
wsh.Run exe & " " & source & " -layout", vbHide, True
Workbooks.OpenText Filename:=dest, StartRow:=1, DataType:=xlFixedWidth, _
TrailingMinusNumbers:=True
End Sub
 


 
Vitallic, спасибо за второй код для pdftotext.exe - вот как раз вчера именно это понадобилось (чтоб без батника и переименования файлов, без лишнего мусора), всёж не всегда "ручные" тексты получаются пригодными для разбора.
Вечером проверю.
 
Цитата
Vitallic пишет: Что касаеться использования pdftotext.exe то програмка действительно бесплатная. К ней нашел еще такой вот макрос отработало на 5+(нюанс только есть ли у Вас возможность ставить exe-файлы, например на работе)
Vitallic возможно эти 5+ также как-то заточенны оказались на наличие Foxit'a на компьютере?... у меня с моим Adobe Acrobat 11 Pro  любой pdf отсюда в txt переименовыванием не превращается - точнее в Locals появляется переменная, а потом ошибка выскакивает "убедитесь что файл не был переименовам, перемещён или удалён" - т е файла .txt как бы нет... да и в папке не видно чтобы файл превращался в txt...

код отсюда (6 пост) вроде печатает в Immediate (при включённых библиотеках Adobe Acrobat Type Library, Acrobat)... но что-то пока тоже не соображу как вывести в ячейки...

Код
... 
Dim oPDTextSelect As Acrobat.AcroPDTextSelect
Dim i As Long   
    '1. Открываем PDF-файл.
    oPDDocument.Open sPath
    
    '2. Берём нужную страницу. Страницы в PDF в VBA нумеруются с нуля.
    Set oPDPage = oPDDocument.AcquirePage(0)
    
    '3. Указываем, с какого по счёту слова взять слова и сколько
    'слов взять. Максимально в объект AcroHiliteList можно взять 32767 слова.
    oHiliteList.Add nOffset:=0, nLength:=32767
    
    '4. Берём слова в объект oPDTextSelect.
    Set oPDTextSelect = oPDPage.CreateWordHilite(oHiliteList)
    
    '5. Просматриваем взятые слова.
    For i = 0 To oPDTextSelect.GetNumText - 1 Step 1
        Debug.Print oPDTextSelect.GetText(i)
    Next i
...
Изменено: JeyCi - 11.11.2014 21:00:52
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
У меня отработало, но путь к всему должен быть покороче - по длинному работать не хотело.
 
Цитата
Hugo пишет: но путь к всему должен быть покороче - по длинному работать не хотело.
как всё просто оказалось!  :D   - и я повторила ваш подвиг (закинув pdf в саму папку с pdftotext) - всё отработало...
спасибо Hugo и Vitallic!

p.s. в дополнение: размышления о вечном  pdfedit или pdftotext ... (наверно, только для Linux размышления эти)
Изменено: JeyCi - 12.11.2014 11:01:21
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Уже целый день пытаюсь через VBA преобразовать pdf в excel.
Я добился открытия файла pdf через Addobe Reader, а дальше ничего не могу сделать.
"Dim oPDTextSelect As Acrobat.AcroPDTextSelect" из 13 сообщения не работает.
"pdftotext.exe" из 11 сообщения установил, но макрос так и не заработал, спотыкается на 12 строке "wsh.Run exe & " " & source & " -layout", vbHide, True"

Помогите пожалуйста вытащить данные из PDF.
 
Цитата
CrazyRabbit написал: "Dim oPDTextSelect As Acrobat.AcroPDTextSelect" из 13 сообщения не работает. Я добился открытия файла pdf через Addobe Reader
при чём тут Addobe Reader?... вы внимательно прочитали?
Цитата
JeyCi написал: при включённых библиотеках Adobe Acrobat Type Library, Acrobat
а дальше вас уже сложно понять...
Цитата
CrazyRabbit написал: "pdftotext.exe" из 11 сообщения установил, но макрос так и не заработал
... год назад всё протестировала - всё отработало, как описала ! (спрашивается, зачем мы так подробно описываем вам в помощь, чтобы потом гадать, с чем у вас проблемы?)
Цитата
CrazyRabbit написал: спотыкается на 12 строке
на что рассчитываете? - вытягивать из вас описание проблемы и файл пример, согласно Правил Форума... лучше ознакомьтесь  8)
Изменено: JeyCi - 27.08.2016 18:27:27
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
С тем моментом разобрался, я скачал "pdftotext.exe" с другого сайта, а он там другой.
Скачал прогу с "http://www.foolabs.com/xpdf/download.html", создал "Yourpage.bat", в ту же папку сохранил pdf файл и все заработало, но...
Но преобразуются только числа, а слова исчезают (см. вложение).

P.S. надеюсь правильно выразился.
 
Доброго времени суток!
Тема старая и не двигается.
Возникала когда-то необходимость обрабатывать однотипные файлы PDF, при этом задача стояла не пользоваться сторонними программами и библиотеками.
Был написан макрос. За основу, была взята разработка Алексея Рембиша (https://habr.com/ru/articles/69568/), с языка php адаптировано под vba. Многие комментарии в макросе оставлены его. Формат сжатия реализован только FlateDecode. Аналог библиотеки zlib на vba взят отсюда https://tools.ietf.org/html/rfc1951.
Соответственно макрос не всё может прочитать и не все задачи в макросе реализованы оптимально - кто желает может доделать.
В книге, на листе "1" необходимо указать где лежит файл pdf (для примера прикладываю файл -Hello word.pdf), также необходимо указать куда сохранять полученный из pdf текст (сохраняется в текстовом виде).
Страницы: 1
Наверх