Страницы: 1
RSS
Импорт свойств файла *pdf в таблицу excel
 
Доброго времени суток, вопрос специфический и поиск ответов не дал.
Дано:
1) директория в которой в нужном порядке имеются файлы формата pdf (в файлах отсканированные документы, каждый файл - отдельный документ со своим названием и определенным количеством листов;
2) файл Excel собственно опись (прилагается), делал сам, для заполнения вручную названий и количества листов. При необходимости добавить в опись новый документ - она пересчитывает страницы что значительно ускоряло работу.
задача: Импортировать свойства файлов из директории (название и количество листов) в опись.

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

Заранее спасибо!
 
Количество листов указано в названии файла? Если нет, то можно в названии файла указывать это количество? Названия файлов хоть как-то унифицированы?
Приведите пару тройку реальных (хотя-бы по структуре) названий файлов, свойства которых Вам необходимы
Согласие есть продукт при полном непротивлении сторон
 
Нет, в названии только название документа, в свойствах pdf файла имеется запись - количество страниц в документе.
А если документы в ручную именовать с количеством листов - теряется смысл затеи.Названия не унифицированы.
 
Код в сообщении #8 от ZVI

Еще подобная тема
Изменено: Sanja - 15.12.2016 13:20:35
Согласие есть продукт при полном непротивлении сторон
 
Добрый день,
Поискал свежие решения в форумах. Пусто.

Попробовал ссылки из предыдущего сообщения.
Код в сообщении #8 от ZVI - к сожалению, не опрeделяет количество страниц в pdf (см. скриншот).
Еще подобная тема - требуется наличие библиотеки от платного Acrobat X Professional, поэтому попробовать не удалось.

Уважаемый ZVI! Подскажите, как всё-таки подсчитать количество страниц в pdf.
Заранее очень благодарен.
 
Доброе время суток.
Цитата
Alex_Kite написал:
как всё-таки подсчитать количество страниц в pdf.
Посмотрите тут. У меня только на одном pdf промахнулся - в Acrobat Reader показывает 522 листа, а макрос 521. В прочем, там (и не только там) есть ещё варианты.
Успехов.
Изменено: Андрей VG - 20.06.2019 16:35:27
 
Если установлен Adobe Acrobat и в CMD команда
Код
reg query HKCR\AcroExch.PDDoc\CurVer
не возвращает ошибку
то можно получать количество страниц так
Код
    With CreateObject("AcroExch.PDDoc")
        .Open FilePath
        Debug.Print FilePath; .GetNumPages
        .Close
    End With
 
Цитата
Alex_Kite написал: ...Подскажите, как всё-таки подсчитать количество страниц в pdf.
Добрый день. Проанализировал PDF различных версий (не зашифрованные), выявил закономерность, вот код, проверяйте:
Код
Function PdfNumPages(PdfFile As String) As Long
' ZVI:2019-06-21 https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&TID=85707#message979418
' Returns Number of Pages in PdfFile
  
  Dim s As String, s1 As String, sp As String
  Dim i(0 To 2) As Long, FileNum As Integer
  
  FileNum = FreeFile
  Open PdfFile For Binary As FileNum
  s = Space(LOF(FileNum))
  Get FileNum, , s
  Close FileNum
  
  i(1) = InStr(1, s, "/Type/Pages", vbTextCompare)
  If i(1) = 0 Then
    i(1) = InStr(1, s, "/Type /Pages", vbTextCompare)
    If i(1) = 0 Then
      ' Scanned/Encoded? Not strong extracting!
      i(1) = InStr(1, s, "/N ", vbTextCompare)
      PdfNumPages = Val(Mid$(s, i(1) + 2))
      Exit Function
    End If
    sp = " "
  End If
  Do
    i(0) = InStrRev(s, "obj", i(1), vbTextCompare)
    i(2) = InStr(i(1), s, "endobj", vbTextCompare)
    s1 = Mid$(s, i(0), i(2) - i(0))
    If InStr(1, s1, "/Parent ", vbTextCompare) = 0 Then
      i(1) = InStr(1, s1, "/Count", vbTextCompare)
      PdfNumPages = Val(Mid(s1, i(1) + 6))
      Exit Do
    End If
    i(1) = InStr(i(2), s, "/Type" & sp & "/Pages", vbTextCompare)
  Loop While i(1) > 0
 
End Function

Private Sub Test()
  Dim PdfFile As String
  PdfFile = "D:\Tmp\1.pdf"
  Debug.Print PdfNumPages(PdfFile)
End Sub

Для сканированных/зашифрованных файлов алгоритм работы упрощен и может быть неточным.
Изменено: ZVI - 21.06.2019 08:08:42
 
Владимир, большое спасибо!
Цитата
ZVI написал:
может быть неточным.
Есть такая проблема на некоторых pdf.
 
Цитата
ZVI написал:
Для сканированных/зашифрованных файлов алгоритм работы упрощен и может быть неточным.
У меня файлы со сканами, и Ваш алгоритм почти всегда выдаёт неправильное значение (38 для большей части файлов).
Буду пробовать альтернативы.
 
Цитата
Андрей VG написал:
Посмотрите  тут . У меня только на одном pdf промахнулся - в Acrobat Reader показывает 522 листа, а макрос 521.
На файлах со сканами почти всегда ошибается - показывает 0 страниц.

Резюме: в моём случае идеально работает алгоритм Андрей Лящук.
Ещё раз большое спасибо!!!
Изменено: Alex_Kite - 21.06.2019 10:26:02 (typo)
 
Цитата
Alex_Kite написал:
в моём случае идеально работает алгоритм  Андрей Лящук .
Тогда вы счастливый сотрудник - у вас есть Adobe Acrobat как минимум версии standard  :D
 
Цитата
Андрей VG написал:
Тогда вы счастливый сотрудник
:)  8)
Видимо, с pdf-файлами при помощи Excel можно сделать много интересных вещей   ;)  
 
Видимо, вы не уловили иронии. Посмотрите стоимость Adobe Acrobat. Как вы думаете, у каждого сотрудника установлен он? А без такой программы - код тёзки работать не будет.
 
Если кому интересен бюджетный вариант, то можно в PBI решить вопрос вот таким нехитрым кодом:
Код
let
    Источник = Table.SelectRows( Folder.Files("E:\ПапкаСФайлами"), each [Extension] = ".pdf"),
    СчитаемСтроки = Table.AddColumn(Источник, "Количество страниц", each Table.RowCount( Table.SelectRows( Pdf.Tables( [Content] ), each [Kind] = "Page") ))
in
    СчитаемСтроки

Ну или если M$ когда-нибудь разродится добавить в в Экселевский PQ коннектор к pdf'кам... Эх, мечты.
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
бюджетный вариант, то можно в PBI
Ну, да, ну, да - бюджетный. :)  Такая махина. Не проще ли тогда простая консольная программка? Всё же в архиве в половину меньше весит  :D  Опять же, из Excel просто запускается.
 
Андрей VG, таки PBI desktop уже много у кого установлен, халява все таки. А тут, что-то новое искать/устанавливать/разбираться. Я ленивый, медку зачерпнул, запрос запустил, и хорошо!  :D
Вот горшок пустой, он предмет простой...
 
Цитата
Alex_Kite написал: ...У меня файлы со сканами, и Ваш алгоритм почти всегда выдаёт неправильное значение (38...)
Если не сложно, то приложите, пожалуйста, или лучше перешлете мне на почту (адрес - в профиле) парочку таких файлов, интересно было бы посмотреть их структуру.
 
Цитата
Андрей VG написал: Есть такая проблема на некоторых pdf.
Андрей, добрый день! Если есть пара проблемных PDF-ок, то тоже был бы Вам благодарен, если перешлете/выложите или дадите ссылку
 
Цитата
ZVI написал:
Если есть пара проблемных PDF-ок
На домашних отработало без проблем. А вот с рабочими - они ДСП, нет желания потом с безами отношения выяснять. Если что-то попадётся позже - сброшу.
Изменено: Андрей VG - 21.06.2019 17:13:49
 
Здравствуйте, коллеги! Проверил штук 30 pdf-файлов (с графикой и без) - замечаний нет.
Владимир
 
Цитата
ZVI написал:
перешлете/выложите или дадите ссылку
v089i01.pdf отсюда 28 стр., функция возвращает 15
v068c01.pdf отсюда 18 стр., функция возвращает 61
сгенерированы в LaTeX / pdfTex
 
Спасибо Андреям за файлы-примеры.
Посмотрел, такие файлы закодированы, явно информацию о страницах из них не вытащить.
В качестве бесплатной альтернативы Adobe Acrobat можно воспользоваться некоммерческой (GNU General Public License) утилитой командной строки pdftk-server.
Тогда такая командная строка (можно использовать VBA Shell):
pdftk.exe 1.pdf dump_data output report.txt
создаст текстовый файл отчета report.txt, в котором будет интересующая нас строка: NumberOfPages: 1377
где 1377 - количество страниц (значение приведено для примера).
Изменено: ZVI - 22.06.2019 03:50:25
 
Владимир, большое спасибо за разбор полётов. Вывод, чтобы было верно это утверждение
Цитата
Alex_Kite написал:
с pdf-файлами при помощи Excel можно сделать много интересных вещей
нужно углубляться в спецификацию Pdf, чтобы в любом случае, только средствами VBA получать число страниц в pdf.
 
Цитата
Zotchik написал:
Сразу оговорюсь, безусловно то, что я собираюсь делать и делаю с экселем - то еще извращение и применение не по прямому назначению сей волшебной программы. И конечно большая часть вопроса вообще относится к другому программному обеспечению, но я рассчитываю что добрые люди помогут.
Один из путей Windows PowerShell + утилита ExifTool
PS обычно установлен уже в системе - просто наберите  PowerShell в поиске

Как установить ExifTool running - написано в указаной ссылке, просто распакуйте скаченый файл, переименуйте в exiftool.exe и закинте в папку Windows или пропишите путь в PATH

Этот скрипт позволяет получить информацию по количеству страниц в pdf-файле и записать в текстовой файл данные
Можете скопировать в консоль, можете сохранить в файле с расширением .ps1 и запустить из консоли этот файл.
Если будете запускать из фала проверьте политику выполнения сценария в PS (наберите в строке Get-ExecutionPolicy)

ВНИМАНИЕ:
Не проверял на зашифрованных файлах
Скрипт проходит по всем файлам (включая подпапки)
ExifTool не работает/плохо работает с именами файлов на кирилице.

Можно доработать скрипт для переименования на лету и потом возращать старое название - но не думаю, что эт обудет хорошее решение
Код
<# 
Скрипт для получения метаданных 
с помощью утилиты exiftool.exe

#>

<# 
меняем текущую директорию 
Укажите путь к папке с фалами
Например:    "C:\FROM D\Codding\PDF" 
Примечание:   если в имени папки есть пробел указывайте в кавычках
#>
Set-Location "C:\FROM D\Codding\PDF"
$outputFile = "PDF_data.txt"

<#
Объявляем переменную для хранения строки
в которую будем собирать метаданные файлов
#>

$fullStringMeta = ""

<#
Получаем список файлов из текущей дирректории
Отфильтровываем только с расширением pdf

#>
$arrayFile = get-childitem  -recurse -Name -Filter "*.pdf"

<#
Организовываем цикл по списку файлов
с помощью утилиты exiftool.exe получаем метаданные по ключам
-FileName: имя файла
-PageCount: количество страниц

Объединяем имя файла и количество страниц в строку
Добавляем данные в конец строки

#>

ForEach ($currentFileName in $arrayFile){ 
$sRecordName = exiftool.exe -FileName $currentFileName
$sRecordPages = exiftool.exe -PageCount $currentFileName
$fullStringMeta = $fullStringMeta + "`r"+"`n" + [string]::Join("`t",$sRecordName,$sRecordPages)

} 

<#
Записываем данные в файл
Примечание:   если в папке существует файл с таким наименованием, то он будет перезаписан

#>

$fullStringMeta | Out-File $outputFile

<#
Выводим на экран результат

#>
$fullStringMeta

<#
Удаляем из памяти переменные

#>

Remove-Variable -Name sRecordName
Remove-Variable -Name sRecordPages
Remove-Variable -Name fullStringMeta
Remove-Variable -Name outputFile

Результат в .txt (дальше вы может это загрузить в эксель и допилить через PQ)
Код
File Name                       : class-country.pdf   Page Count                      : 35
File Name                       : Jar_calculation.pdf   Page Count                      : 10
File Name                       : Top-Co.pdf   Page Count                      : 22

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

Вы можете получить все метаданные по файлу запустив в PS  команду: exiftool.exe "Путь к файлу/ Имя файла"
Справку по утилите можно получить запустив команду exiftool.exe


 
Цитата
ZVI написал:
Если не сложно, то приложите, пожалуйста, или лучше перешлете мне на почту (адрес - в профиле) парочку таких файлов, интересно было бы посмотреть их структуру.
К сожалению, не могу прислать - файлы корпоративные.
Содержат сканы документов.
PDF Specification: 1.6
Creator: Xerox Phaser 3635MFP
 
ZVI, здравствуйте! А можете немного поподробнее рассказать о методе описанном в #26
Страницы: 1
Наверх