• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Печать дока из Word

  • Автор темы Gor
  • Дата начала
G

Gor

Здравствуйте.
Подскажите, возможно ли вообще осуществить данную операцию? И если да, то как?

Web заявка. после определённой стадии прохождения апрувала, т.е. по втарту агента WebQuerySave
на основе этой заявки должен формироваться документ Word по шаблону с полями Word из Notes заявки (это мне понятно как сделать), И
САМОЕ ГЛАВНОЕ автоматически распечатываться полученый документ Word на Default принтере у создателя заявки или последнего аппрувера. Возможно ли это реализовать ?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
создайте скрипт (в ворде) кот. будет печатать его при открытии
но по-мне - лучше создать ПДФ и открыть его же в браузере (редайректом), опосля чего чел просто нажмет печать (ежели захочет)
а "выкручивание рук" и всяки автоматизмы, в духе виндовз - это интерфейсный изврат (ИМХО)
 
G

Gor

тему создавать новую не хочется. Продолжу в этой, немного в другую сторону.

Как проверить в шаблоне .dot создано ли там поле с определённым именем из LS?
(Типа как аналог функции HasItem в лотусе только в Word)

у меня набор шаблонов (10 штук). у этих всех шаблонов есть набор полей, но в каком то шаблоне есть поле MiddleName а в каком то нет,
а скрипт для заполнения единый с одинаковым количеством входных параметров, вот и нужна такая чтоб заполнять только нужные созданные поля...
а то скрипт на строчке worddoc.FormFields("MiddleName").result = "Test" выполняется только для тех шаблонов у которых это поле создано.
 
M

morpheus

Gor
есть у АктивДокумента свойство Fields (коллекция полей) - там и проверять
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
[codebox]Function CheckField(fld As String, worddoc As Variant) As Integer
CheckField=False
On Error Goto ErrHandler
If(worddoc.FormFields(fld) Is Nothing) Then Goto ExitCode
CheckField=True
Goto ExitCode
ErrHandler:
Resume ExitCode
ExitCode:
End Function[/codebox]

вызов типа того:
[codebox] Set word = CreateObject("Word.Application") 'Create Word object
Call word.documents.add(path & file) 'Create a new document based on the template
Set worddoc = word.activedocument 'Get a handle for the active document
........

If(Checkfield("docName",worddoc)) Then worddoc.FormFields("docName").result = doc.docName(0)[/codebox]
код "убивает" поле! (мне так больше нра)
 
G

Gor

Новую тему открывать не стал, хотел бы задать вопрос здесь.

Столкнулся со следующей проблемой.

Задача таже - т.е. по определённым шаблонам формировать Word document из лотусового агента.
В шаблонах вордовых Text Form Field-ы

надо из лотусового документа записать в поля вордовые.

в лотусовом доке есть поле текстовое Authorities_1. В нём содержится достаточно много текста.
Пытаюсь его получить и перенести в ворд следующим образом:

Код:
	Dim Item As NotesItem
Set item = doccontext.GetFirstItem( "Authorities_1" )
Dim Authorities As String
Authorities = item.Text
................................................

If(Checkfield("Authorities",worddoc)) Then worddoc.FormFields("Authorities").result = Authorities

Checkfield - функция на проверку наличия данного поля в Word, предоставленная lmike

На данной строчке - If(Checkfield("Authorities",worddoc)) Then worddoc.FormFields("Authorities").result = Authorities
появляется ошибка Microsoft Word: String is too long

Видимо вставляемый текст слишком объёмный (хотя по меркам Word-a всего полстраницы текста)
Как бороться с такой бедой???
 
D

DNT

создайте скрипт (в ворде) кот. будет печатать его при открытии
но по-мне - лучше создать ПДФ и открыть его же в браузере (редайректом), опосля чего чел просто нажмет печать (ежели захочет)
а "выкручивание рук" и всяки автоматизмы, в духе виндовз - это интерфейсный изврат (ИМХО)


чем создаете ПДФ?
 
G

Gor

чем создаете ПДФ?
По мере выполнения задачи этот функционал решили порезать и формирование PDF оказалось не нужным, оставил как есть вордовый файл как аттач в документе и всё... так что с PDF я не столкнулся. А вообще по формированию PDF есть топик помоему в codebase... https://codeby.net/threads/13800.html

А всё таки насчёт данной ошибки никто не может подсказать как от неё избавиться?

в лотусовом доке есть поле текстовое Authorities_1. В нём содержится достаточно много текста.
Пытаюсь его получить и перенести в Word в Text Form Field следующим образом:

Код:
	Dim Item As NotesItem	
Set item = doccontext.GetFirstItem( "Authorities_1" )	
Dim Authorities As String	
Authorities = item.Text	
................................................
If(Checkfield("Authorities",worddoc)) Then worddoc.FormFields("Authorities").result = Authorities
Checkfield - функция на проверку наличия данного поля в Word, предоставленная lmike

На данной строчке - If(Checkfield("Authorities",worddoc)) Then worddoc.FormFields("Authorities").result = Authorities
появляется ошибка Microsoft Word: String is too long

Видимо вставляемый текст слишком объёмный (хотя по меркам Word-a всего полстраницы текста)
Как бороться с такой бедой???
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
как я указывал - я заменяю букмарк (в данном фрагменте - содержимое поля меняется)
пользовался кусками кода с notesnet.ru от Андрея Черепанова

так-как поля - есть закладки одновременно ;) (вот такое у МС видение)
и тогда можно плюнуть на типы полей и их длину (единственно придется анпротектить файл)

мой кусок кода выглядит так (выдернул из рабочего варианта)

[codebox] Forall mark In worddoc.Bookmarks
On Error Goto WrongMark
txt$=mark.Name
Set collection=view.GetAllDocumentsByKey(doc.Parentdocumentunid + "|" + txt$ ,True)
On Error Goto ErrorHandler
If collection.Count>0 Then
Set fielddoc=collection.GetNthDocument(1)
nam$=fielddoc.name(0)
value$=fielddoc.value(0)
If Left(value$,1)="@" Then
Set fieldSearch=view.GetAllDocumentsByKey(doc.Parentdocumentunid + "|" + Mid(value$,2),True)
If fieldSearch.Count>0 Then
value$=fieldSearch.GetNthDocument(1).value(0)
End If
End If
If value$="<>" Then
value$=|<| + fielddoc.comments(0) + |>|
End If
On Error Goto WrongMark
word.Selection.GoTo wdGoToBookmark, , , mark 'переход к закладке
word.Selection.Delete wdCharacter, 1 ' удаление закладки и текста закладки, курсор остается на месте закладки
word.Selection.TypeText " " & value$
End If
Goto nxt
WrongMark:
' Msgbox Str(n)
Resume nxt
nxt:
End Forall[/codebox]

чем создаете ПДФ?
UJAC - замечательный тулз
почти доточил XSL (подрихтовать преобразование булетов и границ ячеек таблиц)
здесь выкладывал экзампел (он сырой и без указ выше фич)
НО в UJAC нет отступов у параграфа :( я знаю как решить это, но не хочется делать форк из-за этой фичи
iText имеет этот атрибут и странно, что автор проекта не внедрил его
 
G

Gor

попробовал сделать так
Код:
Set word = CreateObject("Word.Application") 

Call word.documents.add("\\sss\"+DovType+"\"+DovType+".dot")

Set worddoc = word.activedocument 

Dim Item As NotesItem
Dim Authorities As String

Set item = doccontext.GetFirstItem( "Authorities_1" )
Authorities = item.Text

Forall mark In worddoc.Bookmarks				
txt$=mark.Name
If txt$ = "Authorities" Then

word.Selection.GoTo wdGoToBookmark, , , mark 'переход к закладке			
word.Selection.Delete wdCharacter, 1 ' удаление закладки и текста закладки, курсор остается на месте закладки		
word.Selection.TypeText " " & Authorities

End If

Ругается на строчке word.Selection.GoTo wdGoToBookmark, , , mark 'переход к закладке
Говорит Microsoft Word: This bookmark does not exist

Непойму почему. У меня в переменной txt$ чётко имя закладки Authorities. И в файле шаблона закладка создана с таким именем...((?
попробовал проверить так - sss = worddoc.Bookmarks.Exists("Authorities")
sss возвращает True. Получается закладка в файле создана, но переход до неё сделать не получается... что за чудеса((?
 
G

Gor

Может быть это как то зависит от какого нибудь свойства самого шаблона Word? Код то вроде бы правильный...

и тогда можно плюнуть на типы полей и их длину (единственно придется анпротектить файл)

А как анпротектить файл?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
worddoc.UnProtect(pwd$)
и протект
Call worddoc.Protect(2,False,pwd$)
 
G

Gor

пишет что файл уже анпротекченый...

а такая конструкция всё равно ругается что закладка не существует на строчке word.Selection.GoTo wdGoToBookmark, , , "Authorities" 'переход к закладке ...((
Код:
 Set word = CreateObject("Word.Application")  
Call word.documents.add("\\sss\"+DovType+"\"+DovType+".dot")	  
Set worddoc = word.activedocument		 
Dim Item As NotesItem  
Dim Authorities As String 
Set item = doccontext.GetFirstItem( "Authorities_1" )	
Authorities = item.Text	
If worddoc.Bookmarks.Exists("Authorities") = True Then
word.Selection.GoTo wdGoToBookmark, , , "Authorities" 'переход к закладке			
word.Selection.Delete wdCharacter, 1 ' удаление закладки и текста закладки, курсор остается на месте закладки			word.Selection.TypeText Chr(10) & Authorities
End If
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
не забывайте полностью закрывать word (причем "не программно"!)
в том числе и созданные вами инстансы
для того чтобы видеть что происходит - не скрывайте окно ворда...
и воще, я предупреждал, мелкосаксовые пердульки - страшно глюкозявая технология :)

или, возможно, вложите здесь шаблон
 
G

Gor

Код:
или, возможно, вложите здесь шаблон

ммм. не совсем понял этой фразы. ?

У меня уже документ создаётся по шаблону.
Call word.documents.add("\\sss\"+DovType+"\"+DovType+".dot")

в нём уже есть поля/закладки со своими именами
Lotus как я понимаю на предмет их обнаружения даже не ругается - worddoc.Bookmarks.Exists
Но перейти в область закладки упорно нехотит.
Закрыл Word где только можно))) Всё равно ругается)))) С визибл окном ворда таже самая ошибка, не переходит на поле и всё)) Хотя в самом документе щёлкаю на поле и проверяю его имя - оно совпадает))))
Мистика млин( Давно не чувствовал себя таким беспомощным)

ааа=))) Получилось)))) Обошёл по другому=)))

Поставил

Код:
worddoc.Bookmarks("Authorities").Select
word.Selection.TypeText Chr(10) & Authorities

вместо
Код:
 word.Selection.GoTo wdGoToBookmark, , , "Authorities" 'переход к закладке 
word.Selection.Delete wdCharacter, 1 ' удаление закладки и текста закладки, курсор остается на месте 
word.Selection.TypeText Chr(10) & Authorities
Вот в таком варианте почему то заработало!!!!!=))
Спасибо за терпение =)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
во-во - то так работает, то эдак :) - это и есть "особенность" МС протухтов

надысь 3-и часа убили с сотрудником... - появлялась букмарка и филд с именем кот. изначально не было в шаблоне
пока этот кусок текста из ворда не убили и не набили заново (вставили из буфера как плэйн тект) и заново поля не повставляли - не работало
и эти продукты называются удобными и интуитивно-понятными ;)
гистарезис какой-то :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!