Колонтитулы в PDF

1. SMA154 10.02.16 06:18 Сейчас в теме
Добрый день!

Есть задачка: есть документ в формате PDF (конфигурация Документооборот, он уже хранится внутри конфы, но суть не в этом), необходимо написать команду, которая бы вставляла в данный документ определенную информацию в нижний колонтитул этого документа.

У меня уже была написана обработка, которая вставляет колонтитулы в документ Word и сохраняет в PDF, я думала попробовать как-то сконвертировать PDF в Word и применить ее, но не могу понять, как это можно сделать в 1С.

Собственно вопрос: можно ли в 1С преобразовать PDF в Word или напрямую прочитать, отредактировать и сохранить PDF?

PS Если вы можете посоветовать какие-то сторонние программы и библиотеки, то есть ограничение - они должны быть бесплатными, клиент не будет платить за дополнительный софт. А также просьба дать небольшие пояснения о том, как мне их состыковать с 1С

Спасибо
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. PhoenixAOD 62 10.02.16 06:31 Сейчас в теме
(1) SMA154, ну вообще PDF это же картинка. Есть сторонние софтинки которые могу сконвертировать из PDF в Word, но бывает кривовато это делают.
3. SMA154 10.02.16 11:14 Сейчас в теме
(2) PhoenixAOD, я понимаю, но вот к сожалению клиент поставил задачу и не хочет никаким образом ее изменять, поэтому мне необходимо найти способ ее решить в таких условиях
4. Boneman 302 10.02.16 11:37 Сейчас в теме
(3) SMA154,
а что тут особо придумаешь,
есть вещи которые никакого отношения к 1С не имеют, pdf - в том числе.
Это реально картинка. Даже акробаты и фокситы ридеры, только читать могут, а не менять.
Редактировать, - это что-то посерьезнее надо.
Я бы курил, в сторону установки полноценного адобе акробата, и дальше, методом программного открытия файла в нем и подключения к нему из 1С - изучал бы функции данного программного продукта.
Но он весит килограмм, и как это все шевелится будет х.з.

П.С.
обработка, которая вставляет колонтитулы в документ Word

ну она ведь и делает это не сама по себе 1Ской, а самими вордом, т.е. программой, в которой и придуман данный формат файла.
То же и с pdf, по аналогии, только акробатом
5. SMA154 10.02.16 17:24 Сейчас в теме
(4) Boneman, спасибо, попробую сделать через Adobe Acrobat
6. infostart user 20 10.02.16 19:32 Сейчас в теме
(5) SMA154, напишешь, что получилось
7. SMA154 12.02.16 12:17 Сейчас в теме
(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=">
link_l; infostart user; Boneman; AllexSoft; +4 Ответить
9. Xershi 1551 10.06.16 13:48 Сейчас в теме
(7) SMA154, ну водяные знаки это цветочки. Тут считай ничего сложного и не было!

А вот вопрос с конвертацией пдф в формат 1С я думаю поняли затея гиблая, потому что нет варианта на 100% получить, то что было в нем!

Есть только софт, который может склеить два пдф или срезать кусок в начале или конце.
12. link_l 12 15.06.16 15:29 Сейчас в теме
(7) SMA154, вываливается с ошибкой "Ошибка выполнения Microsoft VB * Script: Невозможно создание объекта контейнером ActiveX: 'AcroExch.App'", подскажите куда копать =)
13. v3rter 15.06.16 15:58 Сейчас в теме
(12) link_l, https://forums.adobe.com/thread/302392
For the use of AcroExch.App you must have an installation of Adobe Acrobat Standard or Prof.
копать в сторону установки пробной версии или покупки Adobe Acrobat Standard или Adobe Acrobat Prof. Или не покупки.
14. link_l 12 15.06.16 16:13 Сейчас в теме
(13) v3rter, а вон как! я думал обычного ридера хватит =) придется изучить то что писал в (10). Спасибо!
15. aibasoft 11 23.01.23 20:15 Сейчас в теме
(1)
У меня уже была написана обработка, которая вставляет колонтитулы в документ Word и сохраняет в PDF

Доброго времени суток! Не могли бы вы выложить этот код сюда если это делалось без применения COM?
8. Maximum210 10.06.16 13:22 Сейчас в теме
А как потом отредактированный файл вернуть в 1С из папки куда он сохранился?
10. v3rter 10.06.16 14:13 Сейчас в теме
Посмотрите здесь: http://infostart.ru/public/527208/ или сами прикрутите бесплатную консольную утилиту PDFTk Server https://www.pdflabs.com/tools/pdftk-server/ .

Для наложения колонтитула создайте pdf только с колонтитулом. Наложение запускается так:

pdftk "D:\1C\Ishodnyi_dokument.pdf" multistamp "D:\1C\kolontitul.pdf" output "D:\1C\konechnyi_dokument.pdf"

Или под текст документа:

pdftk "D:\1C\Ishodnyi_dokument.pdf" background "D:\1C\kolontitul.pdf" output "D:\1C\konechnyi_dokument.pdf"


Тут http://stackoverflow.com/questions/8470808/stamp-pdf-file-with-control-for-position-stamp-file делают это с помощью ghostscript и pdftk полностью из командной строки.
dour-dead; +1 Ответить
11. Xershi 1551 10.06.16 14:24 Сейчас в теме
(10) v3rter, тестировал функции:
Извлечение.
Добавление и удаление.

Высасывает, только то что можно и добавление/удаление, только концов?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот