Есть задачка: есть документ в формате PDF (конфигурация Документооборот, он уже хранится внутри конфы, но суть не в этом), необходимо написать команду, которая бы вставляла в данный документ определенную информацию в нижний колонтитул этого документа.
У меня уже была написана обработка, которая вставляет колонтитулы в документ Word и сохраняет в PDF, я думала попробовать как-то сконвертировать PDF в Word и применить ее, но не могу понять, как это можно сделать в 1С.
Собственно вопрос: можно ли в 1С преобразовать PDF в Word или напрямую прочитать, отредактировать и сохранить PDF?
PS Если вы можете посоветовать какие-то сторонние программы и библиотеки, то есть ограничение - они должны быть бесплатными, клиент не будет платить за дополнительный софт. А также просьба дать небольшие пояснения о том, как мне их состыковать с 1С
(2) PhoenixAOD, я понимаю, но вот к сожалению клиент поставил задачу и не хочет никаким образом ее изменять, поэтому мне необходимо найти способ ее решить в таких условиях
(3) SMA154,
а что тут особо придумаешь,
есть вещи которые никакого отношения к 1С не имеют, pdf - в том числе.
Это реально картинка. Даже акробаты и фокситы ридеры, только читать могут, а не менять.
Редактировать, - это что-то посерьезнее надо.
Я бы курил, в сторону установки полноценного адобе акробата, и дальше, методом программного открытия файла в нем и подключения к нему из 1С - изучал бы функции данного программного продукта.
Но он весит килограмм, и как это все шевелится будет х.з.
П.С.
обработка, которая вставляет колонтитулы в документ Word
ну она ведь и делает это не сама по себе 1Ской, а самими вордом, т.е. программой, в которой и придуман данный формат файла.
То же и с pdf, по аналогии, только акробатом
(6) infostart user, (4) Boneman, если интересно, то вот, что получилось:
1) Вместо колонтитулов я вставила водяные знаки, т.к на самом деле клиенту без разницы, лишь бы надпись была
&НаСервере
Процедура ВставитьВодяныеЗнаки()
//выбираю файл, пока жестко вшитый
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Файлы.Ссылка
|ИЗ
| Справочник.Файлы КАК Файлы
|ГДЕ
| Файлы.ВладелецФайла.Наименование = ""Тестирование ПП Входящий ДО 1С (№ 11..2016 от 03.02.2016)""
| И Файлы.ТекущаяВерсияРасширение = ""pdf""";
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Пока РезультатЗапроса.Следующий() Цикл
ДвоичныеДанныеФайла = АвтозаполнениеШаблоновФайловСервер.ПолучитьДвоичныеДанныеФайла(РезультатЗапроса.Ссылка);
ВременныйФайл = "D:\TestFiles\file.pdf";
ДвоичныеДанныеФайла.Записать(ВременныйФайл);
//с помощью скрипта на Visual Basic пользуюсь объектами Acrobat
КодФункции =
"Function PDFinsertWatermark(filename, text)
| Dim AcroApp
| Dim AVDoc
| Dim PDDoc
| Dim objJSO
| Dim boResult
| Dim ExportFormat
| Dim NewFilePath
| Dim PDFPath
| Dim bNoSave
| Set AcroApp = CreateObject(""AcroExch.App"")
| Set AVDoc = CreateObject(""AcroExch.AVDoc"")
| Call AVDoc.Open(filename, """")
| Set AVDoc = AcroApp.GetActiveDoc
| Set PDDoc = AVDoc.GetPDDoc
| Set objJSO = PDDoc.GetJSObject
| Call objJSO.addWatermarkFromText(text, objJSO.app.constants.align.top, ""Arial"", 10, objJSO.Color.black, 0, objJSO.numPages, True, True, True, objJSO.app.constants.align.right, objJSO.app.constants.align.bottom, -50, 30, False, 0.9, False, 0, 1)
| nPages = PDDoc.GetNumPages
| Call PDDoc.Save(1,filename)
| AVDoc.Close(1)
| AcroApp.Exit
| PDFinsertWatermark = nPages
|
|End Function";
мПараметры = Новый Массив;
мПараметры.Добавить("D:\TestFiles\file.pdf");
мПараметры.Добавить("9896666 OT 21.12.2015");
РезультатВыполнения = ВыполнитьСкрипт("vbscript", КодФункции, "PDFinsertWatermark", мПараметры);
КонецЦикла;
КонецПроцедуры
Функция ВыполнитьСкрипт(ЯзыкСкрипта, КодФункции, ИмяФункции, ПараметрыФункции = Неопределено)
Script = Новый COMОбъект("MSScriptControl.ScriptControl.1");
Script.Language = ЯзыкСкрипта;
СтрокаПараметров = "";
Если ПараметрыФункции <> Неопределено Тогда
Для Индекс = 0 По ПараметрыФункции.Количество() - 1 Цикл
СтрокаПараметров = СтрокаПараметров + ",ПараметрыФункции[" + Строка(Индекс) + "]";
КонецЦикла;
КонецЕсли;
СтрокаВызова = "ВозвращаемоеЗначение = Script.Run(""" + ИмяФункции + """" + СтрокаПараметров + ")";
ВозвращаемоеЗначение = Неопределено;
Попытка
Script.AddCode(КодФункции);
Выполнить(СтрокаВызова);
Исключение
ГдеОшибка = "{" + Script.Error.Line + ", " + Script.Error.Column + "}";
КакаяОшибка = Script.Error.Source + ": " + Script.Error.Description;
Если Не ПустаяСтрока(Script.Error.Text) Тогда
КакаяОшибка = КакаяОшибка + " (" + Script.Error.Text + ")";
КонецЕсли;
ВызватьИсключение ГдеОшибка + " " + КакаяОшибка;
КонецПопытки;
Возврат ВозвращаемоеЗначение;
КонецФункции // ВыполнитьСкрипт()
Показать
2)Хоть мне и не пригодилась конвертация PDF в другие форматы, код скрипта я дописала, может кому пригодится. com.adobe.acrobat.jpeg можно свободно менять на другие форматы, например com.adobe.acrobat.doc (соответственно также изменив расширение выходного файла):
КодФункции =
"Function ConvertPDF(filename)
| Dim AcroApp
| Dim AVDoc
| Dim PDDoc
| Dim objJSO
| Dim boResult
| Dim ExportFormat
| Dim NewFilePath
| Dim PDFPath
| Dim bNoSave
| Set AcroApp = CreateObject(""AcroExch.App"")
| Set AVDoc = CreateObject(""AcroExch.AVDoc"")
| Call AVDoc.Open(filename, """")
| Set AVDoc = AcroApp.GetActiveDoc
| Set PDDoc = AVDoc.GetPDDoc
| Set objJSO = PDDoc.GetJSObject
| nPages = PDDoc.GetNumPages
| ExportFormat = ""com.adobe.acrobat.jpeg""
| NewFilePath = ""D:\TestFiles\final.jpeg""
| boResult = objJSO.SaveAs(NewFilePath, ExportFormat)
| bNoSave = 1
| AVDoc.Close(bNoSave)
| AcroApp.Exit
| ConvertPDF= TypeName(PDDoc)
|
|End Function";
Показать
При написании очень помогла документация: <a href="/redirect.php?url=aHR0cDovL2NvbW11bml0eS5ocGUuY29tL2hwZWIvYXR0YWNobWVudHMvaHBlYi9zd3MtRnVuX1RFU1RfU0YvNDE3MS8xL0Fjcm9iYXQlMjBFeGNoYW5nZSUyMENPTSUyMEFQSSUyMHdpdGglMjBRPFdCUi8+JnNoeTtUUC5wZGY=">
(7) SMA154, вываливается с ошибкой "Ошибка выполнения Microsoft VB * Script: Невозможно создание объекта контейнером ActiveX: 'AcroExch.App'", подскажите куда копать =)