1

Тема: Макрос для удаления персональной информации из файла

Иногда нам необходимо передать файл Word другим людям или выложить его в сеть.
Перед этим желательно удалить из файла персональную информацию, которая хранится в файле, но часто мы забываем или ленимся это сделать.
Имеется в виду, например, имя автора, наименование компании, внутреннее наименование файла, наименование шаблона и др. Со свойствами файла можно ознакомиться с помощью функциональности Свойства (в версии 2007: кнопка Office - Подготовить - Свойства - Дополнительные свойства).

Обычно удаление персональной информации из файла выполняется с помощью специальной функциональности Инспектор документов (в версии 2007: кнопка Office - Подготовить - Инспектор документов).

Следующий простой макрос, размещенный в шаблон Normal.dotm (Normal.dot), позволит быстро очистить ваш файл от персональной информации:
 

Sub RemovePersInf()
'
' Удаление персональной информации из файла
'
    ActiveDocument.RemoveDocumentInformation (wdRDIDocumentProperties)
    ActiveDocument.RemoveDocumentInformation (wdRDIRemovePersonalInformation)
End Sub
Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

2

Re: Макрос для удаления персональной информации из файла

Доброго времени, уважаемые коллеги!
Есть задача, СКРИПТОМ добавить в поле { AUTHOR [ "имя" ] } имя Автора; провести процедуру, обратную WdRemoveDocInfoType. Это задача минимум.

А в идеале, задача вписать (заполнить) и некоторые другие переменные полей, типа:

(wdRDIAll)
(wdRDIComments)
(wdRDIContentType)
(wdRDIDocumentManagementPolicy)
(wdRDIDocumentProperties)
(wdRDIDocumentServerProperties)
(wdRDIEmailHeader)
(wdRDIInkAnnotations)
(wdRDIRemovePersonalInformation)
(wdRDIRevisions)
(wdRDIRoutingSlip)
(wdRDISendForReview)
(wdRDITaskpaneWebExtensions)
(wdRDITemplate)
(wdRDIVersions)

Все добавляемые данные - статичны. Раз вписал в скрипт и забыл. Скрипт нужен для рекурсивной обработки файлового массива, связанного с его "переездом".
Не могу, ув. коллеги, сообразить, как вместо RemoveDocumentInformation добавить в скрипт, что-то подобное BrowseDocumentInformation (или Add, или Update), заполнить поле AUTHOR.

Я сам прихожу!

3

Re: Макрос для удаления персональной информации из файла

Всем спасибо. Вопрос снят.

Я сам прихожу!

4

Re: Макрос для удаления персональной информации из файла

Хотя... вероятно поспешил радоваться: после сохранения документа, не важно, скриптом (через ActiveDocument.Save) или просто кнопкой, данные (например, Author, Company) почему-то самоликвидируются... Их не видно ни из Ворда, ни в свойствах файла. Как так? До сохранения - видны. После - исчезают!

Я сам прихожу!

5

Re: Макрос для удаления персональной информации из файла

Приложите, пожалуйста, файл Word с макросом.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

6

Re: Макрос для удаления персональной информации из файла

Alex_Gur пишет:

файл Word с макросом.

Благодарю Вас, коллега, за отзыв.
Думаю, смысла в Вородовском то файле нет. А вот сам скрипт:

Sub Kill_the_meta()
'
Application.ScreenUpdating = False
With ActiveDocument
    .RemoveDocumentInformation (wdRDIAll)
    .RemoveDocumentInformation (wdRDIComments)
    .RemoveDocumentInformation (wdRDIContentType)
    .RemoveDocumentInformation (wdRDIDocumentManagementPolicy)
    .RemoveDocumentInformation (wdRDIDocumentProperties)
    .RemoveDocumentInformation (wdRDIDocumentServerProperties)
    .RemoveDocumentInformation (wdRDIEmailHeader)
    .RemoveDocumentInformation (wdRDIRemovePersonalInformation)
    .RemoveDocumentInformation (wdRDIRevisions)
    .RemoveDocumentInformation (wdRDIRoutingSlip)
    .RemoveDocumentInformation (wdRDISendForReview)
    .RemoveDocumentInformation (wdRDITaskpaneWebExtensions)
    .RemoveDocumentInformation (wdRDITemplate)
    .RemoveDocumentInformation (wdRDIVersions)
    ActiveDocument.BuiltInDocumentProperties(3) = "XXX"
    ActiveDocument.BuiltInDocumentProperties(7) = "YYY"
    ActiveDocument.BuiltInDocumentProperties(9) = "Microsoft Office Word 2010"
    ActiveDocument.BuiltInDocumentProperties(21) = "ZZZ"
End With
    Application.ScreenUpdating = True
    ActiveDocument.Save
    ActiveDocument.Close
    Application.Quit
End Sub

Буду обязан за любые Ваши рекомендации.
p.s. Отладку произвожу на 2013. Столкнулся с багом, сменил рабочую станцию, всё воссоздал с 0 на 2010. Не помогло. Те же грабли, в тот же профиль: ставишь Save - слетают "свойства" в пустоту. Словно... словно верхняя часть скрипта доминирует над нижней!

Я сам прихожу!

7

Re: Макрос для удаления персональной информации из файла

За сохранение персональных данных в конкретном файле отвечает флажок:
Параметры-Центр управления безопасностью - Параметры центра управления безопасностью - Параметры конфиденциальности - Удалять персональные данные  из свойств файла при сохранении

Также имеется гиперссылка Разрешить сохранение этих сведений в файле на вкладке Файл - Сведения.

Программно это реализуется так:

ActiveDocument.RemovePersonalInformation = 0

Этот оператор я поставил перед сохранением и у меня все получилось:

Sub Kill_the_meta()
'
    Application.ScreenUpdating = False
    With ActiveDocument
        .RemoveDocumentInformation (wdRDIAll)
        .RemoveDocumentInformation (wdRDIComments)
        .RemoveDocumentInformation (wdRDIContentType)
        .RemoveDocumentInformation (wdRDIDocumentManagementPolicy)
        .RemoveDocumentInformation (wdRDIDocumentProperties)
        .RemoveDocumentInformation (wdRDIDocumentServerProperties)
        .RemoveDocumentInformation (wdRDIEmailHeader)
        .RemoveDocumentInformation (wdRDIRemovePersonalInformation)
        .RemoveDocumentInformation (wdRDIRevisions)
        .RemoveDocumentInformation (wdRDIRoutingSlip)
        .RemoveDocumentInformation (wdRDISendForReview)
        .RemoveDocumentInformation (wdRDITaskpaneWebExtensions)
        .RemoveDocumentInformation (wdRDITemplate)
        .RemoveDocumentInformation (wdRDIVersions)
    End With
    ActiveDocument.BuiltInDocumentProperties(3) = "XXX"
    ActiveDocument.BuiltInDocumentProperties(7) = "YYY"
    ActiveDocument.BuiltInDocumentProperties(9) = "Microsoft Office Word 2010"
    ActiveDocument.BuiltInDocumentProperties(21) = "ZZZ"
    Application.ScreenUpdating = True
    ActiveDocument.RemovePersonalInformation = 0
    ActiveDocument.Save
    ActiveDocument.Close
    Application.Quit
End Sub
Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

8

Re: Макрос для удаления персональной информации из файла

Уважаемый Александр, СПАСИБО!

Alex_Gur пишет:

"Разрешить сохранение этих сведений в файле"

Это оно! Если "галочка" и была нажата, то эта, незамеченная мною ссылка, увы, была и не замечена.
С П А С И Б О ! ! !
Теперь, думаю, почти идеально. Могу обрабатывать рекурсивно, не то, что каталог, а целые массивы Вордовских файлов из конструкции DOS+VBA. Единственно, придется натравливать обработку дважды: на DOC и DOCX. И еще, нюанс - аргумент "Last Author" - почему-то в моем скрипте игнорируется, вписывает пользователя той машины, от имени которой запущен скрпит. Понятно, что можно поправить в Параметрах, в Общих, Имя пользователя. Но это как-то не изящно. Вроде.

Я сам прихожу!

9

Re: Макрос для удаления персональной информации из файла

Аргумент "Last Author", как и некоторые другие, может вводиться автоматически из атрибутов установки Office или из Windows. В таких случаях вряд-ли можно что-то сделать средствами Word.

Нашел еще макрос для обработки свойств файла Word в "тихом режиме", без открытия файла (из другого файла Word) (внешняя ссылка):

Private Sub CommandButton1_Click()
    Dim bp As Word.WdBuiltInProperty 
    Dim AsDoc As Word.Document
    Dim fname1 As String
    fname1 = "C:\temp\Kill the Meta.docm"
    Application.ScreenUpdating = False
    Set AsDoc = Documents.Open(fname1, ReadOnly = False) 
    bp = wdPropertyCategory
    AsDoc.BuiltInDocumentProperties(bp) = TextBox4.Text
    AsDoc.Close True
    Set AsDoc = Nothing
    Application.ScreenUpdating = True
End Sub

Попробуйте использовать эту идею, добавив сюда оператор:

ActiveDocument.RemovePersonalInformation = 0
Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

10

Re: Макрос для удаления персональной информации из файла

Нашел еще макрос для обработки свойств файла Word в "тихом режиме", без открытия файла (из другого файла Word)

Если Вам удастся изменить аргумент "Last Author" - сообщите, пожалуйста.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

11

Re: Макрос для удаления персональной информации из файла

Alex_Gur пишет:

сообщите, пожалуйста

Доброго Вам времени, уважаемый Александр! Спасибо Вам за помощь и не равнодушие. Наверное, в силу возраста (или какого-то консерватизма?) я половину операции сделал на досовских операторах, половину - скриптом на VBA. По этому, раз уж VBA не сдался (в плане «Last Author»), то я этого "автора", а он во всех документах у меня, согласно задаче, статичный, вписал руками в Настройках Word. Вот. И задачу, сразу после Вашей подсказки, завершил вчера.
Если интересно, то могу Вам показать оба обработчика, хотя, думаю, что DOS-овскому атавизму здесь, на этом форуме, уже не место!

Я сам прихожу!

12

Re: Макрос для удаления персональной информации из файла

eGreyWolf пишет:

Если интересно, то могу Вам показать оба обработчика, хотя, думаю, что DOS-овскому атавизму здесь, на этом форуме, уже не место!

Да, были бы очень интересны оба образчика.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

13

Re: Макрос для удаления персональной информации из файла

Доброго времени, уважаемый коллега!
Скрипт, основанный на DOS-операторе FOR.
Создаётся пустой *.bat (или *.cmd) файл, содержащий одну строку (без перевода каретки):
FOR /r имя_диска:\полный\путь\"до места"\хранения\"файлового архива"\ %%f in (*.doc) DO START /WAIT C:\"Program Files"\"Microsoft Office"\Office14\WINWORD.EXE "%%f" /mKill_the_meta

В моём примере:
• команда FOR -  позволяет организовать работу команд в цикле, то есть последовательно перебирает, от первого файла до последнего, в указанном каталоге;
• опция /r - заставляет перебирать от рутовой директории вниз, по дереву. В нашем примере, от имя_диска:\полный\путь\"до места"\хранения\"файлового архива"\ и вниз, сколько бы не было вложенных каталогов;
%%f - переменная, принимает значения, которые определяются в блоке «in». В нашем примере находится выражение - «*.doc», которое определяет, что переменной присваиваются значения имен файлов с расширением .doc. Если указать - (*.doc *.docx ), то в переменной будут находиться имена файлов с расширениями *.doc и *.docx. Хотя в моем примере *.docx - "не пригодился": Ворд заходит во все свои документы и doc, и docx сам.
DO START - запустить внешнее приложение. В нашем примере - это Ворд, размещенный по стандартному своему пути: C:\"Program Files"\"Microsoft Office"\"Office14"\WINWORD.EXE
/WAIT - опция, говорящая нашему исполняемому, точнее батч-файлу о том, что он должен дождаться окончания выполнения вызванной им программы. По английски это звучит лаконичнее: /wait forces the batch file to halt processing until the called program has finished executing.
/m - встроенная вордовская опция, открывающая файл одновременно с указанным VBA-скриптом. В нашем примере - Kill_the_meta, показанный Вам выше.
НЮАНСЫ: DOS не понимает пробелы в именах директорий (папок). Для того, что б "понимал" - необходимо заключать такие имена в кавычки: например, \полный\путь\"до места"\хранения\

Созданный нами файл *.bat (или *.cmd) запускаем с помощью любой консоли DOS, например: Правой кнопкой мыши на кнопке "Пуск" —> Выполнить —> Обзор —> Открыть.
Благодаря связке (DOS + VBA), один скрипт последовательно открывает указанные файлы (и дожидается их завершения) в указанных каталогах, а другой - совершает с этими файлами, оговоренные макросом, действия. Скрипт работает очень быстро, глазами не уследить как, и с сетевыми ресурсами (т.е. поенимает UNC-имена).
Из минусов — два нюанса:
- прервать выполнение программы можно только комбинацией «Ctrl + Break»;
- нет реакции на файлы "Только для чтения": макрос VBA наталкивается на такие и ждет реакции пользователя, а не продолжает обработку. Приходится их схлапывать руками и возвращаться к ним уже потом, вручную.
Надеюсь, что это будет кому-то полезно.

Я сам прихожу!

14

Re: Макрос для удаления персональной информации из файла

Спасибо большое!
Необычно! smile

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

15

Re: Макрос для удаления персональной информации из файла

Alex_Gur пишет:

Спасибо большое!
Необычно! smile

Необычно? Имеете ввиду использование DOS-овского костыля?
Я просто изначально не сообразил, как создать нечто подобное циклу на VBA, при чем не открывая Ворд руками. Вот и пошел, давно протоптанной дорожкой.

Я сам прихожу!

16

Re: Макрос для удаления персональной информации из файла

eGreyWolf пишет:
Alex_Gur пишет:

Спасибо большое!
Необычно! smile

Необычно? Имеете ввиду использование DOS-овского костыля?
Я просто изначально не сообразил, как создать нечто подобное циклу на VBA, при чем не открывая Ворд руками. Вот и пошел, давно протоптанной дорожкой.

Для нас, специалистов по Word, это необычно. smile
Но интересно! roll

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.