Посмотрел темы: Как поставить штамп с информацией о ЭП на документ, Не работает функция DCTSConvertFileToPDF, Перестало работать преобразованиев PDF, в чем может быть причина?
А так же: Штампы на PDF-документы, Прикладной блок «Постановка штампа на документ», Служба преобразования документов.
Затем пошел подготовленный - нашел материалы по генерации штампов. Это оказалось весьма полезной информацией и ни разу не скучной, ведь вариантов оказалось больше чем 1 и это радовало:
Великолепная тройка, достойная обсуждения и рассмотрения. У каждой есть свои преимущества и у каждой есть свои недостатки. Но тут поподробнее:
1. GenerateStateStamp - стандартный и элегантный. Принимает картинку для размещения и в целом хорош. Из минусов - ограниченные поля. Ни добавить, ни прибавить.
2. GenerateTextImage - шикарный вариант из разряда "Дешево и сердито", что хотите, то и пишите, штамп все поглотит и выдаст результат. Из минусов - забудьте про логотип или иные изображения.
3. GeneratePNGImageFromHTML - ограничен лишь вашими умениями по настройке HTML, но как неплохая база - вариант отличный. Подойдет вам если вы любите гибкую настройку.
Что произошло после моего выбора: решение вопроса по конвертации документа в PDF (DCTSConvertFileToPDF). Я же нашел много материалов и проблем не ожидал, но как оказалось "гладко было только на бумаге". С чем же я столкнулся:
И вот только после всех этих танцев, пошла работа со штампом. Вообще все это было довольно интересно, особенно когда видишь результат своей работы на живом документе.
И как итог, я написал функцию по подписанию документов (StampPDFDoc):
Запускается примитивно: StampPDFDoc({ID документа};'{Номер сертификата}';'{Ф.И.О. владельца сертификата}';'{Период действия сертификата}')
Сам код:
WSDL = GetConstant('DCTSConvertToPDFWSDL')
TempFolder = GetTempFolder()
PDFDocument = TempFolder & 'PDFDocument.pdf'
TempLogo = TempFolder & 'logo.png'
NoteVD = "Конвертация и штамповка документа."
//---------------------------------------------
EDocInfo = EDocuments.GetObjectByID(IdDoc).Info
EDoc = EDocInfo.Document
VersionNum = GetNumVersionEDoc(EDoc; EDOC_VERSION_ACTIVE_STAGE_CODE)
if VersionNum = -1
VersionNum = GetNumVersionEDoc(EDoc; EDOC_VERSION_DESIGN_STAGE_CODE)
if VersionNum = -1
VersionNum = GetNumVersionEDoc(EDoc; EDOC_VERSION_OBSOLETE_STAGE_CODE)
endif
endif
EDocumentVersion = EDoc.Versions.ValueByName(VersionNum)
if Trim(EDocumentVersion.Note) == NoteVD
Exit() // Нельзя дважды ставить Штамп, а потому - на выход
endif
FileName = GetFullEDocumentVersionFileName(EDocumentVersion; TempFolder)
GenerateStateStamp(Art; Sert; User; Srok; TempLogo)
if Edoc.Info.Editor.Extension == 'PDF' // Если версия уже PDF, то можно не конвертировать
EDoc.Export(VersionNum; PDFDocument; FALSE)
else
EDoc.Export(VersionNum; FileName; FALSE)
DCTSConvertFileToPDF(WSDL; FileName; PDFDocument)
endif
AddImageToPDFFile(PDFDocument; TempLogo; 420; 730; 2;;40)
EDoc.ImportFromFile(-1;NoteVD; PDFDocument)
ФайлУдалить(FileName)
ФайлУдалить(TempLogo)
ФайлУдалить(PDFDocument)
Если же Вам надо ставить ряд Штампов на документ, то переводите работу функции на работу со списком (LIstObject)
CL = CreateList()
CL.Add(Data_in_stamp_1;'355;240') // Данные на 1 штамп и его координаты
CL.Add(Data_in_stamp_2;'200;255') // Данные на 2 штамп и его координаты
Kolontitul_v2(Dov.Doc; CL; Vers) // Измененная функция для потребления списка
И в коде пишем:
EDoc = EDocuments.GetObjectByID(IDDoc)
if Vers > -1
VersionNum = Vers
else
VersionNum = _LastVersionDoc(EDoc)
endif
FileLogo = GetTempFolder() & 'Logo.png'
NoteVD = "Конвертация и штамповка документа."
EDocumentVersion = EDoc.Versions.ValueByName(VersionNum)
FileName = GetFullEDocumentVersionFileName(EDocumentVersion; GetTempFolder())
PDFDocument = GetTempFolder() & 'PDFDocument'& IDDoc &'.pdf'
if EDocumentVersion.Editor.Extension == 'PDF'
EDoc.Export(VersionNum; PDFDocument; FALSE)
else
EDoc.Export(VersionNum; FileName; FALSE)
DCTSConvertToPDFWSDL = GetAssignedConst("DCTSConvertToPDFWSDL")
DCTSConvertFileToPDF(DCTSConvertToPDFWSDL; FileName; PDFDocument)
endif
ind = 0
while ind < LIstObject.Count
Text = LIstObject.Names(ind)
X = SubString(LIstObject.Values(ind);';';1)
Y = SubString(LIstObject.Values(ind);';';2)
GenerateTextImage(Text; 0; 0;; 18; 6; FileLogo; 0)
AddImageToPDFFile(PDFDocument; FileLogo; X; Y; 0;;40)
ind = ind + 1
endwhile
NameVers = EDocumentVersion.Note
EDocumentVersion.LeaveEditMode
EDocumentVersion = nil
if Trim(NameVers) == NoteVD
EDoc.ImportFromFile(VersionNum;"Конвертация и штамповка документа.";PDFDocument)
else
EDoc.ImportFromFile(-1;"Конвертация и штамповка документа.";PDFDocument)
endif
ФайлУдалить(FileName)
ФайлУдалить(FileLogo)
ФайлУдалить(PDFDocument)
EDoc.Save
EDoc = nil
Данный код ставить простой штамп в виде текста, но как пример альтернативного использования - подойдет.
Если кому пригодилось - был рад помочь. Удачного дня!
Образец HTML:
Выглядит так:
Респект, особенно видя, что статья опубликована сегодня, а комментарии к ней сделаны начиная с июня 2020 г.
Анатолий, да, это был неожиданно долгий путь... Статья была выложена на Рецензию 23 декабря 2019 года...
Тарас, добрый день. Подскажите, пожалуйста, а нельзя место в документе определять как-нибудь на лету, а не четкими координатами задавать? Например, добавить в шаблон документа картинку, чтобы пользователь размещал ее в нужном месте, а при генерации штампа определять координаты картинки и вставлять по ним штамп...
Авторизуйтесь, чтобы написать комментарий