Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Количество примечаний в Word-файлах (http://forum.oszone.net/showthread.php?t=279501)

Fresh96 19-03-2014 14:06 2325716

Количество примечаний в Word-файлах
 
Вложений: 2
Здравствуйте. Прошу помощи в решении такой задачи:
Есть папка с Word(*docx) файлами. Хотелось бы с помощью скрипта посчитать количество примечаний в каждом из документов и вывести результат в файл(например csv) в виде:
Код:

Имя файла; Количество примечаний
П2_2.docx;62
И5_1.docx;17

и т.д.

Папку в которой находятся Word-файлы хотелось бы выбирать с помощью стандартного диалога выбора папки (но это не критично).
Заранее благодарю.

Документ с примечаниями (2 шт) приложил.
----
Кросс-темы: тут и тут

Iska 19-03-2014 18:13 2325822

Примерно так:
читать дальше »
Код:

Option Explicit

Dim strDestFile

Dim objSourceFolder
Dim strSourceFolder

Dim objFSO
Dim objFile
Dim objTS

Dim objWord


strDestFile = "out.csv"

Set objSourceFolder = WScript.CreateObject("Shell.Application").BrowseForFolder(0, "Select source folder:", 81, "")

If Not objSourceFolder Is Nothing Then
        strSourceFolder = objSourceFolder.self.Path
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FolderExists(strSourceFolder) Then
                Set objWord = Nothing
                Set objTS = objFSO.CreateTextFile(objFSO.BuildPath(strSourceFolder, strDestFile), True)
               
                objTS.WriteLine "Имя файла;Количество примечаний"
               
                For Each objFile In objFSO.GetFolder(strSourceFolder).Files
                        Select Case LCase(objFSO.GetExtensionName(objFile.Name))
                                Case "doc", "docx"
                                        If objWord Is Nothing Then
                                                Set objWord = WScript.CreateObject("Word.Application")
                                        End If
                                       
                                        With objWord.Documents.Open(objFile.Path)
                                                objTS.WriteLine objFile.Name & ";" & .Comments.Count
                                                .Close
                                        End With
                                Case Else
                                        ' Nothing to do
                        End Select
                Next
               
                objTS.Close
                Set objTS = Nothing
               
                If Not objWord Is Nothing Then
                        objWord.Quit
                        Set objWord = Nothing
                End If
        Else
                WScript.Echo "Can't use folder [" & strSourceFolder & "]."
                WScript.Quit 1
        End If
Else
        WScript.Echo "Cancelled choice folder."
End If

WScript.Quit 0


Fresh96 19-03-2014 20:07 2325901

Iska, уже какой раз выручаете. Спасибо. :up

А не могли бы Вы еще немного подкорректировать скриптик, чтобы он проходился и по файлам в подпапках.
Структура папок, для примера, такая:

Код:

ПапкаНакоторуюУказываю (в ней несколько подпапок в которых Word-файлы)
          |                                        |
    Папка01 (в ней файлы)    Папка02 (в ней тоже файлы ворда)      ....


Iska 19-03-2014 21:04 2325945

«Немного» не получится:
читать дальше »
Код:

Option Explicit

Dim strDestFile

Dim objSourceFolder
Dim strSourceFolder

Dim objFSO
Dim objDictionary
Dim objTS
Dim strPath


strDestFile = "out.csv"

Set objSourceFolder = WScript.CreateObject("Shell.Application").BrowseForFolder(0, "Select source folder:", 81, "")

If Not objSourceFolder Is Nothing Then
        strSourceFolder = objSourceFolder.self.Path
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FolderExists(strSourceFolder) Then
                Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
               
                ScanSubFolders objFSO.GetFolder(strSourceFolder)
               
                If objDictionary.Count > 0 Then
                        Set objTS = objFSO.CreateTextFile(objFSO.BuildPath(strSourceFolder, strDestFile), True)
                        objTS.WriteLine "Путь к файлу;Количество примечаний"
                       
                        With WScript.CreateObject("Word.Application")
                                For Each strPath In objDictionary.Items
                                        With .Documents.Open(strPath)
                                                objTS.WriteLine strPath & ";" & .Comments.Count
                                                .Close
                                        End With
                                Next
                               
                                .Quit
                        End With
                       
                        objTS.Close
                        Set objTS = Nothing
                Else
                        WScript.Echo "Nothing found."
                End If
        Else
                WScript.Echo "Can't use folder [" & strSourceFolder & "]."
                WScript.Quit 1
        End If
       
        Set objFSO = Nothing
        Set objSourceFolder = Nothing
Else
        WScript.Echo "Cancelled choice folder."
End If

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub ScanSubFolders(objFolder)
        Dim objSubFolder
        Dim objFile
       
        For Each objFile In objFolder.Files
                Select Case LCase(objFSO.GetExtensionName(objFile.Name))
                        Case "doc", "docx"
                                objDictionary.Add objFile.Path, objFile.Path
                        Case Else
                                ' Nothing to do
                End Select
        Next
       
        For Each objSubFolder In objFolder.SubFolders
                ScanSubFolders objSubFolder
        Next
End Sub
'=============================================================================


Fresh96 20-03-2014 08:09 2326076

Iska, всё работает.

На 160 файлах в 14 подпапках = ~5 минут работы (но это ерунда, по сравнению с ручной обработкой).

Уже совестно просить, но попробовал переделать Ваш файл под обработку PDF (там комментарии). Ничего не выходит, точнее выходит одна ругань скрипта (в программировании я не знаток).

Вот здесь скрипт выполняет подсчет количества страниц в PDF-файлах.

Для подсчета количества страниц в PDF:
Код:

strFilename="c:\test.pdf"
Set objAcroExch = CreateObject("AcroExch.PDDoc")
objAcroExch.Open strFilename
CountPages = objAcroExch.GetNumPages
objAcroExch.Close

msgbox CountPages

Как я понимаю, нужно заменить GetNumPages(и, возможно, что то еще) на чтение количества комментариев, но нигде не могу найти, что написать (http://www.onestopqa.com/resources/Accessing PDFs.pdf).

Fresh96 20-03-2014 13:52 2326193

Наваял такой код для показа количества комментариев:
Код:

Set pdSourceDoc = CreateObject("AcroExch.PDDoc")

strFilename="C:\1\TestDoc.pdf"
pdSourceDoc.Open strFilename
iSourcePageCount = pdSourceDoc.GetNumPages()
Set pAcroSourcePage = pdSourceDoc.AcquirePage(0)
iSourceAnnotationCount = pAcroSourcePage.GetNumAnnots()
msgbox iSourcePageCount
msgbox iSourceAnnotationCount

Количество страниц "iSourcePageCount" показывает верно, а
количество комментариев "iSourceAnnotationCount" показывает в 2 раза больше. Не пойму почему?

Если этот код верный помогите интегрировать его в код из поста
Цитата:

Цитата Iska
«Немного» не получится:
читать дальше » »


Iska 20-03-2014 14:28 2326202

Fresh96, у меня нет Adobe Acrobat.

Цитата:

Цитата Fresh96
а количество комментариев "iSourceAnnotationCount" показывает в 2 раза больше. Не пойму почему? »

Interapplication Communication API Reference - Adobe:
Цитата:

GetNumAnnots

Gets the number of annotations on the page.

Annotations that have associated pop-up windows, such as a strikeout, count as two annotations. Also note that widget annotations (Acrobat form fields) are included.

Fresh96 20-03-2014 18:37 2326283

Iska, спасибо за пояснение.

Получилось так (к сожалению должен быть установлен Adobe Acrobat):
читать дальше »

Код:

Option Explicit

Dim strDestFile

Dim objSourceFolder
Dim strSourceFolder

Dim iSourcePageCount
Dim iSourceAnnotationCount
Dim iSourceAnnotationCountPage
Dim pAcroSourcePage
Dim pdSourceDoc

Dim objFSO
Dim objDictionary
Dim objTS
Dim strPath

Dim i


strDestFile = "out_pdf.csv"
iSourceAnnotationCount = 0

Set pdSourceDoc = CreateObject("AcroExch.PDDoc")
Set objSourceFolder = WScript.CreateObject("Shell.Application").BrowseForFolder(0, "Select source folder:", 81, "")

If Not objSourceFolder Is Nothing Then
        strSourceFolder = objSourceFolder.self.Path
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FolderExists(strSourceFolder) Then
                Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
               
                ScanSubFolders objFSO.GetFolder(strSourceFolder)
               
                If objDictionary.Count > 0 Then
                        Set objTS = objFSO.CreateTextFile(objFSO.BuildPath(strSourceFolder, strDestFile), True)
                        objTS.WriteLine "Путь к файлу;Количество примечаний"
                       
                                For Each strPath In objDictionary.Items
                                                pdSourceDoc.Open(strPath)
                                                iSourcePageCount = pdSourceDoc.GetNumPages()
                                                for i=0 to iSourcePageCount-1
                                                        Set pAcroSourcePage = pdSourceDoc.AcquirePage(i)
                                                        iSourceAnnotationCountPage = pAcroSourcePage.GetNumAnnots()/2
                                                        iSourceAnnotationCount = iSourceAnnotationCount + iSourceAnnotationCountPage
                                                        'msgbox iSourcePageCount
                                                        'msgbox iSourceAnnotationCount       
                                                Next
                                                objTS.WriteLine strPath & ";" & iSourceAnnotationCount
                                                iSourceAnnotationCount = 0
                                                pdSourceDoc.Close
                                Next
                        objTS.Close
                        Set objTS = Nothing
                Else
                        WScript.Echo "Nothing found."
                End If                       

        Else
                WScript.Echo "Can't use folder [" & strSourceFolder & "]."
                WScript.Quit 1
        End If
       
        Set objFSO = Nothing
        Set objSourceFolder = Nothing
Else
        WScript.Echo "Вы не выбрали папку с файлами."
End If

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub ScanSubFolders(objFolder)
        Dim objSubFolder
        Dim objFile
       
        For Each objFile In objFolder.Files
                Select Case LCase(objFSO.GetExtensionName(objFile.Name))
                        Case "pdf"
                                objDictionary.Add objFile.Path, objFile.Path
                        Case Else
                                ' Nothing to do
                End Select
        Next
       
        For Each objSubFolder In objFolder.SubFolders
                ScanSubFolders objSubFolder
        Next
End Sub
'=============================================================================


Iska 20-03-2014 18:48 2326291

Fresh96, не стоит ли вынести создание объекта «AcroExch.PDDoc» за пределы цикла?

Fresh96 20-03-2014 19:26 2326312

Подправил.


Время: 03:15.

Время: 03:15.
© OSzone.net 2001-