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

Тема в разделе "Lotus - Программирование", создана пользователем Gor, 22 дек 2008.

  1. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Здравствуйте.
    Подскажите, возможно ли вообще осуществить данную операцию? И если да, то как?

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    создайте скрипт (в ворде) кот. будет печатать его при открытии
    но по-мне - лучше создать ПДФ и открыть его же в браузере (редайректом), опосля чего чел просто нажмет печать (ежели захочет)
    а "выкручивание рук" и всяки автоматизмы, в духе виндовз - это интерфейсный изврат (ИМХО)
     
  3. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    тему создавать новую не хочется. Продолжу в этой, немного в другую сторону.

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

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Gor
    есть у АктивДокумента свойство Fields (коллекция полей) - там и проверять
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    [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]
    код "убивает" поле! (мне так больше нра)
     
  6. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Новую тему открывать не стал, хотел бы задать вопрос здесь.

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

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

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

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

    Код (Text):
        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 всего полстраницы текста)
    Как бороться с такой бедой???
     
  7. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7

    чем создаете ПДФ?
     
  8. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    По мере выполнения задачи этот функционал решили порезать и формирование PDF оказалось не нужным, оставил как есть вордовый файл как аттач в документе и всё... так что с PDF я не столкнулся. А вообще по формированию PDF есть топик помоему в codebase... http://codeby.net/forum/threads/13800.html

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

     
  9. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    как я указывал - я заменяю букмарк (в данном фрагменте - содержимое поля меняется)
    пользовался кусками кода с notesnet.ru от Андрея Черепанова
    http://notesnet.ru/nn/notesnet.nsf/725e165...bd?OpenDocument
    так-как поля - есть закладки одновременно ;) (вот такое у МС видение)
    и тогда можно плюнуть на типы полей и их длину (единственно придется анпротектить файл)

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

    [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 имеет этот атрибут и странно, что автор проекта не внедрил его
     
  10. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    попробовал сделать так
    Код (Text):
           

    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. Получается закладка в файле создана, но переход до неё сделать не получается... что за чудеса((?
     
  11. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Может быть это как то зависит от какого нибудь свойства самого шаблона Word? Код то вроде бы правильный...

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    worddoc.UnProtect(pwd$)
    и протект
    Call worddoc.Protect(2,False,pwd$)
     
  13. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    пишет что файл уже анпротекченый...

    а такая конструкция всё равно ругается что закладка не существует на строчке word.Selection.GoTo wdGoToBookmark, , , "Authorities" 'переход к закладке ...((
    Код (Text):
     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
     
  14. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    не забывайте полностью закрывать word (причем "не программно"!)
    в том числе и созданные вами инстансы
    для того чтобы видеть что происходит - не скрывайте окно ворда...
    и воще, я предупреждал, мелкосаксовые пердульки - страшно глюкозявая технология :)

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

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Код (Text):
    или, возможно, вложите здесь шаблон
    ммм. не совсем понял этой фразы. ?

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

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

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

    Поставил

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    во-во - то так работает, то эдак :) - это и есть "особенность" МС протухтов

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

Поделиться этой страницей