Перейти к содержанию

Как автоматически посчитать число страниц в разных файлах?


Рекомендуемые сообщения

Всем привет!

 

Есть техническая проблема, прошу помощи в автоматизации.

 

Ситуация: мне принесли жесткий диск с разрозненными файлами. Там могут быть договоры и прочие документы в формате doc, docx, xls, xlsx и подобные (пока сам не знаю точно какие, еще не видел диск). Некоторые документы могут быть по одной странице, некоторые по 1000 страниц. Допустим, на диске будет 5123 документа (наугад написал, скорее всего будет больше).

 

Мне нужно узнать объём выполняемой работы в страницах. Каждый понимает, что оплатить труд по анализу 50 страниц дешевле, чем по анализу 5000 страниц. Кроме того, чем больше страниц, тем больше время требуется на работу.

Стандартный вариант: открыть вордом или экселем документ, нажать кнопку "печать" и в предпросмотре увидеть количество страниц в данном документе при выводе на печать. И сделать это 5123 раза подряд, суммируя результаты. Это труд, который может занять море времени.

 

Как посчитать автоматически количество страниц во всех документах при выводе их на печать, не открывая каждый из них отдельно?

Ссылка на комментарий
Поделиться на другие сайты

Поиск подсказал один из способов
Как посчитать количество страниц сразу в нескольких документах Word

сам не проверял, нет образцов файлов Word

  • Like (+1) 1
Ссылка на комментарий
Поделиться на другие сайты

19 минут назад, kmscom сказал:

Так всё равно надо будет сидеть и потом на калькуляторе плюсовать страницы, так что под условия задачи не подходит.

19 минут назад, kmscom сказал:

Поиск подсказал один из способов

В поиске можно найти это https://www.sql.ru/forum/953973/kak-poschitat-obshhee-kolichestvo-stranic-teksta-v-nabore-faylov-word-a

Вроде как раз то что нужно, но там делалось для старого ворда. Так что если для .doс и будет работать (не проверял), то для docx и так ясно, что работать не будет. Ибо это уже по структуре это документ внутри архива. На всякий случай код .vbs скрипта из последнего вложения там

With CreateObject("word.application")
  For Each x In CreateObject("scripting.filesystemobject").getfile(wscript.scriptfullname).parentfolder.Files
    If LCase(Mid(x.Name, InStrRev(x.Name, ".") + 1, 3)) = "doc" Then
      With .documents.open(x.Path, , True) 'ReadOnly
        numDocs = numDocs + 1
        sumPages = sumPages + .Content.ComputeStatistics(2) 'wdStatisticPages
'        sumPages = sumPages + .BuiltInDocumentProperties(14) 'wdPropertyPages 'считает неправильно!
        .Close False 'don't save changes
      End With
    End If
  Next
  .Quit
End With
wscript.echo "Всего страниц " & sumPages & Chr(13) & "Документов " & numDocs

 

Изменено пользователем regist
  • Like (+1) 1
  • Спасибо (+1) 1
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, regist сказал:

Так всё равно надо будет сидеть и потом на калькуляторе плюсовать страницы, так что под условия задачи не подходит.

Зачем? Там ведь отобразиться количество страниц сразу нескольких документов.

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, kmscom сказал:

Поиск подсказал один из способов

Там есть один момент: "Замечание: Если в списке присутствуют файлы, в которых нет подсчёта страниц, то в столбце Число страниц (Pages) указано ничего не будет."

 

2 часа назад, regist сказал:

Так всё равно надо будет сидеть и потом на калькуляторе плюсовать страницы, так что под условия задачи не подходит.

3 часа назад, kmscom сказал:

Их хотя бы не надо открывать каждый, уже хорошо.

Ссылка на комментарий
Поделиться на другие сайты

Не вижу, где там показывает сразу у нескольких документов.

 

Попробовал способ через колонку "Число страниц" на MS Office 2019, Windows 10 x64,

система корректно показывает кол-во страниц только у документов, созданных этим же Office 2019 (как doc, так и docx),

у других doc, например, созданных в Office 2003, показывает всегда число 1.

А еще часто бывают rtf, там вообще не отображается.

 

Попробовал способ через vbs, считает долго (т.к. открывает в скрытом виде каждый документ), но посчитало правильно.

Для docx тебе ничего исправлять в скрипте не надо, т.к. во первых проверяются только первые 3 буквы после последней точки в имени файла,

во-вторых, документ открывается точно также как и doc, не смотря на другую его структуру, ведь скрипт берёт значение от самого Word-а,

не анализируя внутренности файла самостоятельно.

 

Сделал обобщённый вариант vbs, с подсчетом раздельно и в сумме DOC*, XLS*, RTF со сканом рекурсивно (с подкаталогами):

 

Dim numXDocs, sumXSheets, sumXPages, numWDocs, sumWPages

set oExcel = CreateObject("excel.application")
set oWord = CreateObject("word.application")
set root = CreateObject("scripting.filesystemobject").getfile(wscript.scriptfullname).parentfolder
Analysis(root)

oExcel.Quit: oWord.Quit
set oExcel = Nothing: set oWord = Nothing: set root = Nothing

wscript.echo _
	"DOC*, RTF:" & Chr(13) & _
	"Всего страниц: " & sumWPages & Chr(13) & "Документов: " & numWDocs & _
	Chr(13) & Chr(13) & "XLS*" & Chr(13) & _
	"Всего страниц: " & sumXPages & Chr(13) & "Всего листов: " & sumXSheets & Chr(13) & "Документов: " & numXDocs & _
	Chr(13) & Chr(13) & "-----------------" & Chr(13) & "Общее:" & Chr(13) & Chr(13) & _
	"Страниц: " & sumXPages + sumWPages & Chr(13) & "Документов: " & numXDocs + numWDocs
	
Sub Analysis(root)

	With oExcel
	  For Each x In root.Files
		If LCase(Mid(x.Name, InStrRev(x.Name, ".") + 1, 3)) = "xls" Then
		  With .workbooks.open(x.Path, , True) 'ReadOnly
			numXDocs = numXDocs + 1
			sumXSheets = sumXSheets + .sheets.count
			For Each sheet in .sheets
			  sumXPages = sumXPages + (sheet.HPageBreaks.Count + 1) * (sheet.VPageBreaks.Count + 1)
			Next
			.Close False 'don't save changes
		  End With
		End If
	  Next
	  .Quit
	End With
	
	With oWord
	  For Each x In root.Files
	    ext = LCase(Mid(x.Name, InStrRev(x.Name, ".") + 1, 3))
		if ext = "doc" or ext = "rtf" then
          With .documents.open(x.Path, , True) 'ReadOnly
            numWDocs = numWDocs + 1
            sumWPages = sumWPages + .Content.ComputeStatistics(2) 'wdStatisticPages
            .Close False 'don't save changes
          End With
		end if
	  Next
    End With

	For Each x in root.SubFolders: Analysis(x): Next

End Sub

 

Изменено пользователем Dragokas
  • Like (+1) 2
  • Спасибо (+1) 1
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Dragokas сказал:

Сделал обобщённый вариант vbs, с подсчетом раздельно и в сумме DOC*, XLS*, RTF со сканом рекурсивно (с подкаталогами):

 

Спасибо! А как его запускать? В блокнот скопировать и сменить расширение на *.vbs? 

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, Воронцов сказал:

Зачем? Там ведь отобразиться количество страниц сразу нескольких документов.

Нескольких, но число то выводится для каждого отдельно, а не суммарное в папке.

 

2 часа назад, Mrak сказал:

В блокнот скопировать и сменить расширение на *.vbs? 

да.

  • Спасибо (+1) 1
Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...
03.12.2020 в 19:59, Dragokas сказал:

Не вижу, где там показывает сразу у нескольких документов.

 

Попробовал способ через колонку "Число страниц" на MS Office 2019, Windows 10 x64,

система корректно показывает кол-во страниц только у документов, созданных этим же Office 2019 (как doc, так и docx),

у других doc, например, созданных в Office 2003, показывает всегда число 1.

А еще часто бывают rtf, там вообще не отображается.

 

Попробовал способ через vbs, считает долго (т.к. открывает в скрытом виде каждый документ), но посчитало правильно.

Для docx тебе ничего исправлять в скрипте не надо, т.к. во первых проверяются только первые 3 буквы после последней точки в имени файла,

во-вторых, документ открывается точно также как и doc, не смотря на другую его структуру, ведь скрипт берёт значение от самого Word-а,

не анализируя внутренности файла самостоятельно.

 

Сделал обобщённый вариант vbs, с подсчетом раздельно и в сумме DOC*, XLS*, RTF со сканом рекурсивно (с подкаталогами):

 


Dim numXDocs, sumXSheets, sumXPages, numWDocs, sumWPages

set oExcel = CreateObject("excel.application")
set oWord = CreateObject("word.application")
set root = CreateObject("scripting.filesystemobject").getfile(wscript.scriptfullname).parentfolder
Analysis(root)

oExcel.Quit: oWord.Quit
set oExcel = Nothing: set oWord = Nothing: set root = Nothing

wscript.echo _
	"DOC*, RTF:" & Chr(13) & _
	"Всего страниц: " & sumWPages & Chr(13) & "Документов: " & numWDocs & _
	Chr(13) & Chr(13) & "XLS*" & Chr(13) & _
	"Всего страниц: " & sumXPages & Chr(13) & "Всего листов: " & sumXSheets & Chr(13) & "Документов: " & numXDocs & _
	Chr(13) & Chr(13) & "-----------------" & Chr(13) & "Общее:" & Chr(13) & Chr(13) & _
	"Страниц: " & sumXPages + sumWPages & Chr(13) & "Документов: " & numXDocs + numWDocs
	
Sub Analysis(root)

	With oExcel
	  For Each x In root.Files
		If LCase(Mid(x.Name, InStrRev(x.Name, ".") + 1, 3)) = "xls" Then
		  With .workbooks.open(x.Path, , True) 'ReadOnly
			numXDocs = numXDocs + 1
			sumXSheets = sumXSheets + .sheets.count
			For Each sheet in .sheets
			  sumXPages = sumXPages + (sheet.HPageBreaks.Count + 1) * (sheet.VPageBreaks.Count + 1)
			Next
			.Close False 'don't save changes
		  End With
		End If
	  Next
	  .Quit
	End With
	
	With oWord
	  For Each x In root.Files
	    ext = LCase(Mid(x.Name, InStrRev(x.Name, ".") + 1, 3))
		if ext = "doc" or ext = "rtf" then
          With .documents.open(x.Path, , True) 'ReadOnly
            numWDocs = numWDocs + 1
            sumWPages = sumWPages + .Content.ComputeStatistics(2) 'wdStatisticPages
            .Close False 'don't save changes
          End With
		end if
	  Next
    End With

	For Each x in root.SubFolders: Analysis(x): Next

End Sub

 

Drakokas, спасибо тебе большущее! Твой скрипт меня очень выручил. Случайно наткнулся на этот форум, когда гуглил способ подсчёта страниц огромного пакета документов. В моём случае вышло 113238 страниц. Как бы я считал это вручную - хз.

Ссылка на комментарий
Поделиться на другие сайты

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Похожий контент

    • MiStr
      Автор MiStr
      Последние несколько дней захожу на форум и всё жду: когда же мы превысим порог в 50 000 сообщений? Судя по активности, это должно произойти скоро. Заснимите скриншот, если кто будет на форуме в момент икс.
       
      На момент написания сообщения всего на форуме около 49 900 сообщений.
    • infobez_bez
      Автор infobez_bez
      Здравствуйте
      интересует такой вопрос:
      Например есть группа администрирования "Карантин" - в ней 0 устройств, управляется политикой, которая ограничивает доступ в сеть, блокирована USB шина и т.д.
      Есть группа администрирования " Не карантин" - в ней например 100 устройств, там своя политика.
       
      В KSC, во вкладке "Устройства/Правила перемещения" - есть возможность настройки автоматического перемещения устройств между группами/ распределенными и нераспределенными устройствами. Для настройки перемещения есть условия сработки правила перемещения (теги, сеть, программы и т.д.).

      Плюс есть вкладка Устройства/Выборки устройств - где собраны различные выборки, с защитой/без защиты, устаревшие базы, есть активные угрозы и т.д.
       
      Хотелось бы выполнить настройку таким образом, чтобы при наличии на устройстве активных угроз оно автоматически перемещалось в группу администрирования "Карантин".

      В правилах перемещения - условия похожего на "наличие активных угроз" - нет, перемещать по попаданию в выборку тоже нельзя, но появилась мысль зацепиться за теги, например, есть активная угроза -> назначается тег -> по тегу устройство автоматически перемещается в группу администрирования "карантин" и на него действует соответствующая политика. Но в тегах тоже ничего подходящего не смог найти.
       
      Подскажите, можно ли выполнить настройку автоматического перемещения устройства между группами администрирования (или между политиками)  по наличию на устройстве активных угроз или нахождения вирусной активности? 
      Используется KSC 14.2 для Windows
    • Sgorick
      Автор Sgorick
      Добрый день. Прошу помощи, переименовались файлы в службах, wuauserv_bkp, UsoSvc_bkp, BITS_bkp, WaaSMedicSvc_bkp, dosvc_bkp. wuauserv я с помощью роликов переделал. bits существует в двух экземплярах, один из которых был bkp, но потом стал обычным.
      FRST.txt Addition.txt CollectionLog-2025.06.07-20.41.zip
    • itman
      Автор itman
      Добрый день всем! Хочу поведать вам всем поучительную историю как делать НЕ НАДО!!! В апреле месяце подцепили вирус -шифровальщик! Утром пришли  пользователи, а там все зашифровано на 3 севаках и 2х локалках на которых была расшаренная какая-то папка!! печаль !!! ну а что делать?! благо сисадмин делал копию раз в месяц акрониксом всех серверов, а бухгалтер помимо всего копии на внешний hdd каждое утро и хдд этот хранил в сейфе! (рекомендую всем бухгалтерам так делать!!!) и вот утром сисадмину звонок: -ААА!! Все пропало!! Что делать???? ничего не работает!!!  Помоги!!! и проч))) ну что проснулся от и начал смотреть что все таки произошло! на каждом из серваков при запуске вот такой текст: Encrypted by trust
       Email us for recovery: Rdpdik6@gmail.com
       In case of no answer, send to this email: Rdpp771@gmail.com
      Your unqiue ID:  писать не буду.
       Почти  все файлы (кроме *.dll и тому подобных и системных зашифрованы и переименованы по формуле имя.расширение. [Rdpdik6@gmail.com].lockedfile) и в каждой папке файлик txt c вот таким содержимым:
       Email 1:
      Rdpdik6@gmail.com
      Email 2:
      Rdpp771@gmail.com
      Send messages to both emails at the same time
      So send messages to our emails, check your spam folder every few hours
      ID: эту строчку сотру на всякий случай)
      If you do not receive a response from us after 24 hours, create a valid email, for example, gmail,outlook
      Then send us a message with a new email
      Ну сисадмин начал заниматься восстановлением копии то есть пусть месячные но все же копии а базы 1с так вообще вчерашние!!!  (а это самое главное!) прежде чем все восстанавливать сделал копию того что зашифровали а мало ли)) ну и параллельно всё-таки решил он написать этим недо людям (медикам на букву П), что так и так копии есть ущерб не большой на то что пока будет восстанавливаться копия уйдет время давайте разойдемся все миром и в итоге договорились на 30 баксах. Сисадмин им перевел на их кошелек, а они его кинули ни хрена они ему не прислали!!!!
      Прошло какое-то время (месяца полтора!) и тут пользователи посмотрели что у одного там пара доков осталась в общей папке уже после того как делалась копия у другого тоже какие-то доки  у третьего вообще фото с корпоратива и подумали они что всё-таки давай заплатим этим  людям нетрадиционной ориентации) сумму которую они просят! Скинулись толпой. Вот на переговоры опять отправили сисадмина (как жаль его)! Опять шли переговоры пару дней а то и больше ну вроде нашли они компромисс с шантажистами в размере 250$ те опять прислали адрес куда переводить деньги причем второй раз без гарантий! Типа из всех гарантий попросили прислать любой зашифрованный файл не более мегабайта и они покажут что всё-таки могут расшифровать. Отправили им какой-то pdf они в ответ скрин файла только весь замазанный видно только пару слов по которым надо только больше догадываться! По итогу  Он им опять перевел общий банк:
      Получаете:
      200.0813 Tether TRC20 USDT
      На счет:
      TBgx7szAXYNSwPJz1Ama2K85kTXrCcsnG1
       
      И? что вы думаете? Эти деятели пишут:
      Sinior (это ник в телеге одного из шантажистов )
      Deposit $50
      Sinior
      I won't give you the key until you pay me $50.
      Типа вы не доплатили 50 баксов!! Вот так уважаемые читатели этого поста ни в коем случае не вздумайте им платить так как они вам все равно ничего не пришлют!!! А деньги вы потеряете!!! И ни одного файла не расшифруете там рассчитано не на то чтоб найти компромисс а на то чтоб выдурить с вас побольше денег!!!!!!!
      P.S.    Делайте резервные копии и храните их на внешних hhd  и не оставляйте их подключенными к компьютеру! Сделал копию и отключай да не удобно зато надежно!!!! Всем удачи!!!!
       
      Сообщение от модератора thyrex Перенесено из раздела по шифровальщикам
       
    • Gistap
      Автор Gistap
      Здравствуйте. Виндовс 11. При запуске таймера на автоматическое выключение  через - выполнить, (shutdown -s -t 4000) мелькает окошко терминала и ничего не происходит. В чём проблема? Причём если поставить таймер на 10 секунд, то он его вырубит.
        CollectionLog-2025.03.11-16.27.zip
×
×
  • Создать...