Время на прочтение
3 мин
Количество просмотров 17K
Некоторые гос. структуры формируют отчёты в doc файлах. Где-то это делается руками, а где-то автоматически. Представим, что вам поручено обработать тонну таких документов. Это может быть необходимо для вычленения какой-то конкретной информации или просто проверки содержимого. Нам нужно вынуть только неформатированный текст без графиков и картинок. К примеру, такие данные проще засовывать в нейронную сеть для дальнейшего анализа.
Вот некоторые варианты для самого обычного человека:
- Ручками перебрать все файлы по одному. Уже после десятого документа к вам придёт мысль о том, что вы делаете что-то не так.
- Попробовать найти в интернете специальную библиотеку (расширение) для работы с doc файлами на языке программирования, которым вы владеете. Потратить часок другой на понимание, как работать с этой библиотекой. Также вам ещё предстоит столкнуться с тем, что принципы работы с doc и docx слегка отличаются.
- Попытаться автоматизированно пересохранить все документы в другой формат, с которым будет удобнее работать.
Как раз о последнем варианте и пойдёт речь.
И на помощь к нам спешит vbs скрипт. vbs скрипт можно вызвать из командной строки, что можно сделать в любом языке программирования.
Создадим файл converter.vbs
Const wdFormatText = 2
Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Open(Wscript.Arguments.Item(0), True)
objDoc.SaveAs WScript.Arguments.Item(1), wdFormatText
objWord.Quit
В первой строке мы указываем, в какой формат будем конвертировать: 2 — в txt, 17 — в pdf.
Все форматы можно посмотреть тут. Во второй строке мы открываем непосредственно word. После открытия можно добавить следующую строку:
objWord.Visible = TRUE
Это приведёт к тому, что мы будем видеть процесс открытия Word. Это может быть полезно в том случае, если в какой-то момент произойдёт ошибка, word не закроется сам, и без этой строчки процесс можно будет убить только через диспетчер задач, а так мы просто сможем нажать на крестик.
В командной строке скрипт будет запускаться следующим образом:
converter.vbs полный_путь_к_файлуимя_файла.docx полный_путь_куда_сохранитьимя_файла_без_расширения
Wscript.Arguments.Item(0) — это полный_путь_к_файлуимя_файла.docx
WScript.Arguments.Item(1) — полный_путь_куда_сохранитьимя_файла_без_расширения
Соответственно, в третьей строке нашего скрипта мы открываем файл, и на следующей строке сохраняем в указанный формат. И в завершении закрываем word.
Есть ещё одна маленькая нужная хитрость. Иногда из-за разницы в версиях word или по другим причинам, word может ругнуться, сказав, что файл повреждён. При ручном открытии файла мы увидим предупреждение «повреждена таблица, продолжить открытие файла?». И нужно лишь нажать на «Да», но скрипт уже на этом моменте прекратит свою работу.
В vbs очень корявая конструкция «try catch». Обойти данную проблему можно, добавив всего две строчки. Итого полноценный стабильный скрипт выглядит следующим образом:
Const wdFormatText = 2
Set objWord = CreateObject("Word.Application")
objWord.Visible = TRUE
On Error Resume Next
Set objDoc = objWord.Documents.Open(Wscript.Arguments.Item(0), True)
Set objDoc = objWord.Documents.Open(Wscript.Arguments.Item(0), True)
objDoc.SaveAs WScript.Arguments.Item(1), wdFormatText
objWord.Quit
Как вы можете заметить, продублировано открытие файла. В случае, когда с файлом всё в порядке, файл просто откроется два раза, а в случае ошибки просто продолжит открытие файла.
И на всякий пожарный, пример того, как может выглядеть функция на Python
import os
#folder_from = os.getcwd() + r'words' - папка, где лежит тонна word файлов
#folder_to = os.getcwd() + r'txts' - папка, куда будем сохранять
def convert(file_name):
str1 = folder_from + r"/" + file_name
str2 = folder_to + r"/" + file_name[:file_name.rfind('.')]
os.system('converter.vbs "' + str1 + '" "' + str2 + '"') #запуск скрипта
Далее просто применяем эту функцию ко всем файлам, которые нужно конвертнуть.
Итог
- Данное решение подходит под все форматы word.
- На прочтение этой статьи вы потратили не более 10 минут.
- Можно реализовать зная любой язык программирования.
Не знаю, как у вас, а у меня на работе иногда возникала проблема в конвертировании файлов из формата docx в формат pdf, чтобы в последующем разместить эти файлы на сайте. А файлов, иногда, бывало довольно много, потому, требовалось каждый открыть и сохранить в нужный формат. В какой-то момент времени мне это немного надоело и я стал искать способ, как бы автоматизировать данный процесс. И выход нашелся. Я написал небольшой скрипт на python, который конвертировал файлы в pdf автоматом. То есть, выполнял работу за меня.
В общем, это небольшой пост, посвящённый автоматизации )
Что потребуется?
Для работы скрипта нужно установить модуль docx2pdf. Потому, отрываем терминал и выполняем команду:
pip install docx2pdf
Пишем функцию конвертации
Для того, чтобы конвертировать файл из формата Microsoft Word в PDF, достаточно одной небольшой функции. На входе она будет принимать директорию с файлами docx и конвертировать их по очереди. Впрочем, для того, чтобы исключить попадание конвертеру файлов, расширение которых отлично от docx, сделаем небольшое условие, которое будет проверять файл на необходимое нам расширение. Если расширение другое, то файл будет пропущен, а скрипт продолжит свое выполнение, а не упадет в обмороке.
Вот сама функция, которая нам требуется:
Python:
def file_convert_docx_pdf(dirs):
file_in_dir = os.listdir(dirs)
if not os.path.isdir(f'{dirs}\convert_pdf'):
os.mkdir(f'{dirs}\convert_pdf')
for file in file_in_dir:
if file.endswith('.docx'):
file_k = f'{file.split(".")[0].replace(".", "_")}.pdf'
convert(f'{dirs}\{file}', f'{dirs}\convert_pdf\{file_k}')
else:
continue
Сканируем директорию и получаем список файлов. Дальше проверяем, есть ли папка, в которую надо будет складывать конвертированные файлы. Если такой папки нет – она будет создана. Ну, а потом перебираем в цикле список со сканированными файлами, проверяем их расширение и если расширение docx, формируем новое имя файла, попутно заменяя все точки в имени на «_». Это нужно для того, чтобы скрипт корректно сохранял файл. Если в имени файла попадается точка, то расширение файла сразу же отбрасывается. Ну и дальше конвертеру передается путь к файлу и имя файла для конвертирования, и путь к файлу, и имя файла для сохранения.
Пример работы скрипта
Ниже можно посмотреть результат работы скрипта:
Как можно заметить, в папке находится один файл в формате doc. Он пропускается, таким образом, из 23 файлов конвертированы только 22.
Вот в принципе и все. Надо отметить, что модуль docx2pdf, как следует из его названия не работает с файлами doc. А потому их, перед тем, как конвертировать нужно так же пересохранить в нужном формате. И тут выход так же нашелся. Но, об этом в следующий раз.
А сейчас, вот полный код скрипта:
Python:
import os
from docx2pdf import convert
def file_convert_docx_pdf(dirs):
file_in_dir = os.listdir(dirs)
if not os.path.isdir(f'{dirs}\convert_pdf'):
os.mkdir(f'{dirs}\convert_pdf')
for file in file_in_dir:
if file.endswith('.docx'):
file_k = f'{file.split(".")[0].replace(".", "_")}.pdf'
convert(f'{dirs}\{file}', f'{dirs}\convert_pdf\{file_k}')
else:
continue
def main():
dirs = input('Введите папку для сканирования: >> ')
file_convert_docx_pdf(dirs)
print(f'n[+] - Конвертация завершена...')
if __name__ == "__main__":
main()
Надеюсь, что данный скрипт будет кому-то полезен в работе. Спасибо за внимание
Rafael use CreateObject("Word.Application")
for creating new MSWord process. In my system this code does not close word process correctly. but this code works correct
Const wdExportAllDocument = 0
Const wdExportOptimizeForPrint = 0
Const wdExportDocumentContent = 0
Const wdExportFormatPDF = 17
Const wdExportCreateHeadingBookmarks = 1
if Wscript.Arguments.Count > 0 Then
' Get the running instance of MS Word. If Word is not running, Create it
On Error Resume Next
Set objWord = GetObject(, "Word.Application")
If Err <> 0 Then
Set objWord = CreateObject("Word.Application")
End If
On Error GoTo 0
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile(WScript.Arguments(0))
Set objDoc = objWord.Documents.Open(WScript.Arguments(0),,TRUE)
'Export to PDF using preferred settings
pdf = objWord.ActiveDocument.ExportAsFixedFormat( _
WScript.Arguments(1), _
wdExportFormatPDF, False, wdExportOptimizeForPrint, _
wdExportAllDocument,,, _
wdExportDocumentContent, _
False, True, _
wdExportCreateHeadingBookmarks _
)
'Quit MS Word
objWord.DisplayAlerts = False
objWord.Quit(False)
set objWord = nothing
set objFSO = nothing
Else
msgbox("You must select a file to convert")
End If
If this code save on word2pdf.vbs
, it can called by this command at cmd:
wscript word2pdf.vbs input.docx output.pdf
Get this book -> Problems on Array: For Interviews and Competitive Programming
Reading time: 10 minutes | Coding time: 15 minutes
In this article you will learn how how to create PDF files out of your word document.Well up until recently, creating complex or elegant PDFs in Javascript has been challenging.Here I’m going to show you step-by-step the path of to create beautiful PDFs.
Before we dive further into the process why don’t we learn what is word document or what is PDFs or what is the need to convert word document to PDFs.
Word Document is a popular word-processing program used primarily for creating documents such as letters, brochures, learning activities, tests, quizzes and students’ homework assignments.DOC stands for DOCument file. A DOC file can contain formatted text, images, tables, graphs, charts, page formatting, and print settings.
The Portable Document Format (PDF)is a file format developed by Adobe in the 1990s to present documents, including text formatting and images, in a manner independent of application software, hardware, and operating systems
Yes, PDFs were created to avoid any changes that might occur due change in hardware or software which might have occurred to you if you had ever used Word document.Let’s take a example,Whenever a make a word document and to a printing shop for the print the shop owner may have different OS,hardware or even software and when you get your printed document it is not what you saved at your computer maybe there is a large gap between line format is distorted or something else.So,that’s where PDF come’s to rescue.
Word to PDF approaches
There are three methods that I am going to discuss today which are very easy to use and produce excellent results. These are using:
- awesome-unoconv
- libreoffice-convert
- docx-pdf
1. awesome-unoconv
awesome-unoconv is nodeJS wrapper for converting Office files to PDF or HTML
REQUIREMENT
Unoconv is required, which requires LibreOffice (or OpenOffice)
You can install unoconv in linux operating system by using following command
sudo apt-get install unoconv
INSTALLATION
npm install awesome-unoconv
CODE
const path = require('path');
const unoconv = require('awesome-unoconv');
//Place your word file in source
const sourceFilePath = path.resolve('./word_file.docx');
const outputFilePath = path.resolve('./myDoc.pdf');
unoconv
.convert(sourceFilePath, outputFilePath)
.then(result => {
console.log(result); // return outputFilePath
})
.catch(err => {
console.log(err);
});
Now go to the terminal and run your command pdf will be created in current working directory with name «myDoc.pdf» (you choose any name you like).
This is one of the method to convert word document to pdf let’s keep going.
2. libreoffice-convert
A simple and fast node.js module for converting office documents to different formats.
DEPENDENCY
Since,I am using linux please Install libreoffice in /Applications (Mac), with your favorite package manager (Linux), or with the msi (Windows).
INSTALLATION
npm install libreoffice-convert
CODE
const libre = require('libreoffice-convert');
const path = require('path');
const fs = require('fs');
const extend = '.pdf'
const FilePath = path.join(__dirname, './word_file.docx');
const outputPath = path.join(__dirname, `./example${extend}`);
// Read file
const enterPath = fs.readFileSync(FilePath);
// Convert it to pdf format with undefined filter (see Libreoffice doc about filter)
libre.convert(enterPath, extend, undefined, (err, done) => {
if (err) {
console.log(`Error converting file: ${err}`);
}
// Here in done you have pdf file which you can save or transfer in another stream
fs.writeFileSync(outputPath, done);
});
Since,This is only for libre-office you might not find it very usefull if you are using windows but for for linux/Mac operating system it is very popular.
Let’s look at the last and third method to convert word document to PDFs
3. docx-pdf
It is a library that converts docx file to pdf and it is one of most optimal and quality wise best among the three and most easiest one also.
INSTALLATION
npm install docx-pdf
CODE
var docxConverter = require('docx-pdf');
docxConverter('./word_file.docx','./output.pdf',function(err,result){
if(err){
console.log(err);
}
console.log('result'+result);
});
Output should be output.pdf which will be produced on the output path your provided.
Question
Which one of the following is the correct command to install any module/package in your project?
npm install package-name
node install package-name
install package-name
nodejs install package-name
npm install
is the correct syntax,Example:
If you want to install express module you can do it by writing the command
> npm install express
If you want to see the project you can use this link to my github page.
Приветствую всех читателей блога scriptcoding.ru. В этой статье мы рассмотрим, как сохранить документ Word в PDF формате, или в формате XPS.
По умолчанию, само приложение Word не позволяет сохранять документы в заданных форматах (исключением являются последние версии), что немного обидно, учитывая функциональные возможности самой компании Майкрософт. Но это и не удивительно, так как дядюшка Билл любит радовать своего потребителя различными косяками и багами – каких только нецензурных слов удостоился тот же Internet Explorer.
В первую очередь, стоит сообщить хорошую новость – есть расширение «SaveAsPDFandXPS«, которое находится в бесплатном доступе и его можно скачать с официального сайта Майкрософт. После установки данного расширения появляется возможность сохранить страницу как PDF в Word документе, причем, как в ручном режиме (соответствующий тип файла появится в диалоговом окне «Сохранить Как«), так и программным путем.
Собственно, программный метод получения формата pdf мы и рассмотрим, а именно, метод ExportAsFixedFormatобъекта Range, который позволяет экспортировать целиком или частично содержимое документа в нужный формат.
Данный метод содержит много параметров, и поэтому, я решил описать его в отдельной статье.
ExportAsFixedFormat(OutputFileName, ExportFormat, OpenAfterExport, OptimizeFor, ExportCurrentPage, Item, IncludeDocProps, KeepIRM, CreateBookmarks, DocStructureTags, BitmapMissingFonts, UseISO19005_1, FixedFormatExtClassPtr) — Сохраняет часть документа Word как PDF или XPS формат. Только первые два параметра являются обязательными.
OutputFileName– Обязательный параметр, который задает путь и имя сохраняемого в Word PDF или XPS-файла.
ExportFormat– Обязательный параметр, который определяет формат сохранения в Word (PDF или XPS). Значение константы WdExportFormat:
- wdExportFormatPDF — 17 — Экспортировать документ в формате PDF.
- wdExportFormatXPS — 18 — Экспортировать документ в формате XML Paper Specification (XPS).
OpenAfterExport— Открыть новый файл после экспорта содержимого – значение true.
OptimizeFor– Параметр указывает, следует ли оптимизировать файл для экрана или для печати. Значение константы WdExportOptimizeFor:
- wdExportOptimizeForOnScreen — 1 – Для экрана — низкое качество и маленький размер.
- wdExportOptimizeForPrint — 0 — Для печати – высокое качество и большой размер.
ExportCurrentPage– Определяет, что нужно экспортировать, всю страницу (true) или только выбранный диапазон (false). Word сохранение в PDF.
Item— Определяет процесс экспорта — включать только текст или текст с разметкой. Значение константы WdExportItem:
- wdExportDocumentContent — 0 — Экспорт документа без разметки.
- wdExportDocumentWithMarkup — 7 — Экспорт документа с разметкой.
IncludeDocProps— Указывает, следует ли включить свойства документа в недавно экспортируемый файл (true). Сохранить как PDF в Word.
KeepIRM— Указывает, следует ли копировать права доступа IRM в XPS документ, если исходный документ имеет защиту IRM. Значение по умолчанию True.
CreateBookmarks — Указывает, следует ли экспортировать закладки и тип закладки. Значение константы WdExportCreateBookmarks:
- wdExportCreateHeadingBookmarks — 1 — Создание закладки в экспортируемом документе для всех заголовком, которые включают только заголовки внутри основного документа и текстовые поля не в пределах колонтитулов, концевых сносок, сносок или комментариев.
- wdExportCreateNoBookmarks — 0 — Не создавать закладки в экспортируемом документе.
- wdExportCreateWordBookmarks — 2 — Создание закладки в экспортируемом документе для каждой закладки, которая включает все закладки кроме тех, которые содержатся в верхнем и нижнем колонтитулах.
DocStructureTags— Указывает, следует ли включать дополнительные данные, которые помогут при чтении с экрана, например информацию о потоке и логическую организацию содержимого. Значение по умолчанию True. Документ Word сохранить в PDF.
BitmapMissingFonts— Указывает, следует ли включать растровое изображение текста. Установите этот параметр в значение True, когда шрифт не поддерживается в PDF.
UseISO19005_1 и FixedFormatExtClassPtr – Данные параметры не предоставляют практического интереса.
Теперь давайте рассмотрим два примера программного кода – на языке VBScript и JScript. Оба примера создают новый документ Word, далее вставляют в него текст, содержащий информацию о сервере сценариев Windows Script Host.
Программный код на VBSCRIPT:
<
' ---------------------------------------------------------------------------- ' Как документ word сохранить в pdf формате ' ExportAsFixedFormat.vbs ' ---------------------------------------------------------------------------- Option Explicit dim oWord, oDoc, oSel, oFont, oShell, oRange, oPars, cur_dir, REnd set oWord = WScript.CreateObject("Word.Application") set oShell = WScript.CreateObject("WScript.Shell") set oDoc = oWord.Documents oDoc.Add() set oSel = oWord.Selection oWord.Visible = True set oFont = oSel.Font set oRange = oDoc(1).Range() 'Текущий каталог cur_dir = oShell.CurrentDirectory with oFont .Size = 20 .Name = "Times New Roman" .Bold=true .Colorindex=2 end with oSel.TypeText "Word - сохранение в PDF" with oFont .Size = 12 .Bold=false .Colorindex=0 end with With oSel .TypeParagraph .TypeParagraph End With ' документ word сохранить в pdf With WScript call TXInsert("Name: ", .Name & "") call TXInsert("FullName: ", .FullName & "") call TXInsert("ScriptName: ", .Name & "") call TXInsert("ScriptFullName: ", .FullName & "") call TXInsert("Path: ", .Path & "") call TXInsert("Version: ", .Version & "") call TXInsert("Application: ", .Application & "") call TXInsert("Timeout: ", .Timeout & "") call TXInsert("BuildVersion: ", .BuildVersion & "") End With set oPars = oRange.Paragraphs REnd = oPars(oPars.Count).Range.End call LRange(4,7) With oRange ' Сохраняем абзацы с 4 по 7 в PDF формате .ExportAsFixedFormat cur_dir & "WscInfo_VBS.pdf", 17, true .setRange 0, REnd ' Сохраняем весь документ Word в PDF формате .ExportAsFixedFormat cur_dir & "WscInfoFull_VBS.pdf", 17, true End With ' Используем метод SaveAs для сохранения документа oDoc(1).SaveAs cur_dir & "WscInfoFull_SaveAs_VBS.pdf", 17 ' процедура выбора диапазона Sub LRange(a, b) With oRange .setRange 0, REnd .setRange oPars(a).Range.Start, oPars(b).Range.End End With End Sub ' Процедура для форматирования шрифта и вставки абзаца как сохранить ворд в пдф Sub TXInsert(a, b) With oSel oFont.Bold=true .TypeText a .EndOf oFont.Bold=false .TypeText b .TypeParagraph End With End Sub
Программный код на JSCRIPT:
// ---------------------------------------------------------------------------- // Как документ word сохранить в pdf формате // ExportAsFixedFormat.js // ---------------------------------------------------------------------------- var oWord1, oDoc1, oSel1, oFont1, oShell1, oRange1, oPars1, CurDir1, REnd; oWord1 = WScript.CreateObject("Word.Application"); oShell1 = WScript.CreateObject("WScript.Shell"); oDoc1 = oWord1.Documents; oDoc1.Add(); oSel1 = oWord1.Selection; oWord1.Visible = true; oFont1 = oSel1.Font; oRange1 = oDoc1(1).Range(); //Текущий каталог CurDir1 = oShell1.CurrentDirectory; with(oFont1){ Size = 20; Name = "Times New Roman"; Bold=true; Colorindex=2; } oSel1.TypeText("Word - сохранение в PDF"); with(oFont1){ Size = 12; Bold=false; Colorindex=0; } oSel1.TypeParagraph(); oSel1.TypeParagraph(); // документ word сохранить в pdf with(WScript){ TXInsert("Name: ", Name + ""); TXInsert("FullName: ", FullName + ""); TXInsert("ScriptName: ", Name + ""); TXInsert("ScriptFullName: ", FullName + ""); TXInsert("Path: ", Path + ""); TXInsert("Version: ", Version + ""); TXInsert("Application: ", Application + ""); TXInsert("Timeout: ", Timeout + ""); TXInsert("BuildVersion: ", BuildVersion + ""); } oPars1 = oRange1.Paragraphs; REnd = oPars1(oPars1.Count).Range.End; LRange(4,7); with(oRange1){ // Сохраняем абзацы с 4 по 7 в PDF формате ExportAsFixedFormat (CurDir1 + "\WscInfo_JS.pdf", 17, true); setRange(0, REnd); // Сохраняем весь документ Word в PDF формате ExportAsFixedFormat (CurDir1 + "\WscInfoFull_JS.pdf", 17, true); } // Используем метод SaveAs для сохранения документа oDoc1(1).SaveAs(CurDir1 + "\WscInfoFull_SaveAs_JS.pdf", 17); // процедура выбора диапазона function LRange(a, b){ with(oRange1){ setRange(0, REnd) setRange(oPars1(a).Range.Start, oPars1(b).Range.End) } } // Процедура для форматирования шрифта и вставки абзаца как сохранить ворд в пдф function TXInsert(a, b){ with(oSel1){ oFont1.Bold=true; TypeText(a); EndOf(); oFont1.Bold=false; TypeText(b); TypeParagraph(); } }
Сами сценарии сохраняют документ Word в формате PDF в текущем каталоге, то есть, в каталоге, из которого произошел запуск сценария. Две функции LRange и TXInsert позволяют выбрать нужный диапазон текста (точнее нужные абзацы) и применить форматирование текста (тип шрифта и размер). Метод SaveAs также позволяет сохранить документ Word в PDF формате или в любом другом формате, данный метод принадлежит объекту Document. Более детально похожий пример я рассмотрел в этой статье.