Штамп на документ (история изучения)

8 4

С чего я начал - изучение

Посмотрел темы: Как поставить штамп с информацией о ЭП на документНе работает функция DCTSConvertFileToPDFПерестало работать преобразованиев PDF, в чем может быть причина?

А так же: Штампы на PDF-документыПрикладной блок «Постановка штампа на документ»Служба преобразования документов.

Затем пошел подготовленный - нашел материалы по генерации штампов. Это оказалось весьма полезной информацией и ни разу не скучной, ведь вариантов оказалось больше чем 1 и это радовало:

  1. GenerateStateStamp - генератор стандартного штампа.
  2. GenerateTextImage - генератор штампа по произвольному тексту.
  3. GeneratePNGImageFromHTML - генератор по HTML-шаблону.

Великолепная тройка, достойная обсуждения и рассмотрения. У каждой есть свои преимущества и у каждой есть свои недостатки. Но тут поподробнее:

1. GenerateStateStamp - стандартный и элегантный. Принимает картинку для размещения и в целом хорош. Из минусов - ограниченные поля. Ни добавить, ни прибавить. 

2. GenerateTextImage - шикарный вариант из разряда "Дешево и сердито", что хотите, то и пишите, штамп все поглотит и выдаст результат. Из минусов - забудьте про логотип или иные изображения.

3. GeneratePNGImageFromHTML - ограничен лишь вашими умениями по настройке HTML, но как неплохая база - вариант отличный. Подойдет вам если вы любите гибкую настройку. 


 

Далее - конвертация в PDF

Что произошло после моего выбора: решение вопроса по конвертации документа в PDF (DCTSConvertFileToPDF). Я же нашел много материалов и проблем не ожидал, но как оказалось "гладко было только на бумаге". С чем же я столкнулся:

  1. Установка Microsoft SOAP Toolkit 3.0 на сервер.
  2. Сворачивание сценария на серверное событие или подготовка кода в маршруте, чтобы не зависеть от этого на ПК пользователя. 
  3. Поиск файла "DctsTransformationService.exe.config" чтобы поставить параметр "В PDF c возможностью печати и копирования" на первое место из 3х.

И вот только после всех этих танцев, пошла работа со штампом. Вообще все это было довольно интересно, особенно когда видишь результат своей работы на живом документе.  

И как итог, я написал функцию по подписанию документов (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

Данный код ставить простой штамп в виде текста, но как пример альтернативного использования - подойдет.

Если кому пригодилось - был рад помочь. Удачного дня!

8
Авторизуйтесь, чтобы оценить материал.
1
Тарас Асачёв

Образец HTML:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<style type="text/css">
.box1 
	{
background-color: #ffffff;padding: 5px;

	border: 3px solid #d7d7d7;

	border-color: #000000;

	-moz-border-radius: 11px;

	-webkit-border-radius: 11px;

	border-radius: 11px;

	behavior: url(border-radius.htc);
}
 
	.tg1{font-weight:bold;font-size:16px;font-family:"Times New Roman", Times, serif !important;}
 
	.tg2{font-size:16px;font-family:"Times New Roman", Times, serif !important;}
 
	.tg3{font-weight:bold;font-size:19px;font-family:"Times New Roman", Times, serif !important;;text-align:center} 

</style>

</head>

<body>


<table class="box1" style="undefined;table-layout: fixed;width: 460px; cellspacing=1">

<colgroup>

<col style="width: 100px">

<col style="width: 100px">

<col style="width: 260px">

</colgroup>

<tbody>

<tr>

	<td align="left" colspan="1" rowspan="4">
  		!GERB!
	</td>
	<td colspan="2" rowspan="1">
		<div class="tg3">ДОКУМЕНТ ПОДПИСАН<br>ЭЛЕКТРОННОЙ ПОДПИСЬЮ</div>	
	</td>
	<tr>
		<td class="tg2" rowspan="1">Сертификат</td>
    		<td class="tg1" rowspan="1">!CERT_NUMBER!</td>
	</tr>
	<tr>
	
    	<td class="tg2" rowspan="1">Владелец</td>

    		<td class="tg1" rowspan="1">!FIO!</td>
	</tr>
	<tr>
		
<td class="tg2" rowspan="1">Действителен</td>

    		<td class="tg1" rowspan="1">!DATE!</td>
	</tr>
</tr>

</tbody>
</table>


</body>
</html>

Выглядит так:

Анатолий Придыбайло

Респект, особенно видя, что статья опубликована сегодня, а комментарии к ней сделаны начиная с июня 2020 г.

Тарас Асачёв

Анатолий, да, это был неожиданно долгий путь... Статья была выложена на Рецензию 23 декабря 2019 года...

Ольга Белюга

Тарас, добрый день. Подскажите, пожалуйста, а нельзя место в документе определять как-нибудь на лету, а не четкими координатами задавать? Например, добавить в шаблон документа картинку, чтобы пользователь размещал ее в нужном месте, а при генерации штампа определять координаты картинки и вставлять по ним штамп...

Авторизуйтесь, чтобы написать комментарий