Шаблоны на основе ворд файлов

Тема в разделе "Lotus - Программирование", создана пользователем lmike, 6 сен 2011.

Метки:
  1. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    анонс "цикла" изысканий
    http://codeby.net/forum/threads/43087.html?vi...st&p=210819
    будет код ;), насколько полный - не знаю (зависит от времени)
    преобразование схематично выглядит так:
    Word-> загрузка в LDN -> генерация FO файла + получение полей для заполнения -> заполнение полей -> подстановка значений и получение PDF
    создание Word файла и заполнение полей "лежат на плечах" юзеров :)
    остальное делается кодом
     
  2. Gandliar

    Gandliar Well-Known Member

    Регистрация:
    16 фев 2004
    Сообщения:
    222
    Симпатии:
    0
    Я видел вот какую реализацию

    шаблон в rtf файле, в нем обозначаются поля в виде [название поля].
    rtf шаблон деттачиться на диск, считывается как текстовый файл, в нем реплэйсом заменяются поля на значения и сохраняется.
    В результате получаем вордовский файл с заполненными значениями.

    Сгенерить табличку тоже можно, принцип примерно такой же.
     
  3. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    реализаций и разных подходов много..., но форматы отличные от ПДФ плохо подходят для печати и отображения на разных "устройствах" (фактически - ПДФ в т.ч. и для этого создавался)

    список причин для вышеописанного подхода:
    -например в РТФ нет шифрования, подписи...
    -РТФ можно получить из FO (из него много что можно получить). Т.е. единая "точка" наложения модификаций
    -вместо ворда - FO можно получать из ДХЛ (простой пример я выкладывал)
    -в корпоративной среде, как это не печально, используют МСО, и генерят кучу документов. Заставить конвертить в РТФ - мало смысла и административные "сложности"
    -в FO преобразуются файлы др. форматов (в частности Excel)
     
  4. Gandliar

    Gandliar Well-Known Member

    Регистрация:
    16 фев 2004
    Сообщения:
    222
    Симпатии:
    0
    А что такое FO можно ссылочку?
     
  5. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    - это XML, предназначеный для обработки apache fop
    ну по самому FO


    Добавлено: до кучи - по ссылке, в топике, я рассказывал про POI (там и ссыдки есть) оно то и работает с МСО форматами
     
  6. Gandliar

    Gandliar Well-Known Member

    Регистрация:
    16 фев 2004
    Сообщения:
    222
    Симпатии:
    0
    Если есть два основных условия

    а) юзер генерит шаблон в ворде (удобно для понимания)
    б) на выходе хотим получить pdf

    то подход может быть такой

    1. сохранение шаблона в ртф файле, присоединение в базу лотуса
    2. скрипт детачит rtf на диск, заменяет поля на значения в текстовом файле
    3. запускает некую програмку конвертации rtf в pdf
    4. что то делаем с готовым pdf

    разве так не проще?
     
  7. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    нет - не проще
    список:
    -откуда берём РТФ
    -в схеме выше - вообще ничего с на диск выгружать не придётся, кроме результата (ну если тока самому захотелось)
    -каким инструментом проводим замену
    -
    какую, не подскажите ;) уиндоуз GDI принтер не предлагать
    FO - это обычный XML и средств работы с ним тонны (XSLT как минимум)

    Добавлено: а вот захочу в доки нотусни перенести шаблоны - всё переделывать?
    в случ. с FO - ДХЛ + XSLT (вместо WordToFo), и никаких более замен
     
  8. Gandliar

    Gandliar Well-Known Member

    Регистрация:
    16 фев 2004
    Сообщения:
    222
    Симпатии:
    0
    ртф - пользователь сохраняет ворд в формате rtf и цепляет в базу лотуса

    конвертация - найти программку что то типа такого http://www.rtf-to-xml.com/, правда она платная

    все шаблоны можно засунуть в лотусовые доки ;)

    разово сконвертив из ворда в ртф видимо
     
  9. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    ну из вышеизложенного сами видите :newconfus: - не проще
    да ещё и за деньги, да еще и парсеры писать (для получения списка полей и для замены)
    да и много ещё чего нахардкодить...
     
  10. 777DEN777

    777DEN777 Гость

    получение PDF

    если OFFICE 2007 в скрипте возможно реализовать сохранение файла в PDF формате.
     
  11. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    во-первых нет, во-вторых как бум на не уиндоуз платформе делать :), а если без МСО...
    я понимаю что корпорейт сидит на иглевинде, но это не вечно и есть масса вменяемых фирм, у кот. нет ни винды ни МСО, в частности
    под каждый бздёх проприетарщины (в данном случае МС) подстраиваться нет ни желания ни времени (на борьбу с "реализациями") ни охоты тратить неоправданные деньги (в данном контексте - МСО)

    даже корпорейты (а уж там откаты руляд не подетцки) не торопятся переходить на новые пердуляторы от МС (у нас до сих пор хрюша и МСО2003) - и это нормально (деньги, время миграции, траблы...)

    но это лирика, а практика - как подстановку будем делать на МСО? у меня-то есть код, но я глубоко несчастлив, пользуя угрёбищный КОМ (сколько грабель уже собрал)

    ничего нет проще - чем оперировать XML и не трогать код (написавши его 1-ин раз), для МСО у мя тыщи строк..., здесь будет в разы меньше (ибо масса уже написана - FOP и POI) не мной ;)
     
  12. Gandliar

    Gandliar Well-Known Member

    Регистрация:
    16 фев 2004
    Сообщения:
    222
    Симпатии:
    0
    Чето не понимаю.

    1. Пользователь руками вставляет "поля" в условный шаблон печатного документа (например в ворде) типа @имя_директора, @юридический адрес, ...
    2. Сохраняет как .rtf и цепляет в базу
    3. на лотусскрипте детачим на диск, читаем как stream в переменную, делаем replace(переменная,"@имя_директора","реальное фио") и записываем назад.

    Дальше с rtf-ом делаем что хочется. разве так не проще?
     
  13. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    вы серьёзно верите в работоспособность и скорость такого кода? :)
    очень гуманно напоминать оператору, про дополнительные действия ;) (в моей схеме это шаг отсутствует)
    и пропущен немаловажный момент - получение переменных в нотус из РТФ - это уже не проще

    так же не учтено...
    вот у нас по 200 полей в договоре и в "пакет" документов, помимо договора, входят допники (поля местами перемекаются)
    да, и желательно в файле не просто указать имя поля, а типа конструкции <field|default value|description[example]> - вот это сильно усложнит задачу прямой замены ;) (оператору упрощает - он использует только ворд)
    Ответственный за ворд шаблон это заполняет, в нотусне это разносится (при загрузке файла) по полям дока docfield
    пакет может формироваться за один проход, а может только договор или допник

    вот и предствьте свой реплэйс с 200-ми заменами(в цикле), да по нескольким РТФ

    Добавлено: ну так, для информации, добавлю XSLT кот. выдергивает "поля" из FO (отрабатывает меньше секунды, договор на 52 страницы, полметра):<!--shcode--><pre><code class='xml'><?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:eek:utput method="text" indent="no"/>
    <!-- <xsl:strip-space elements="fo:inline"/>-->
    <!-- <xsl:strip-space elements="fo:*"/>-->
    <xsl:template match="fo:root">
    <xsl:apply-templates select="descendant::fo:inline"/>
    </xsl:template>

    <xsl:template match="fo:inline">
    <xsl:call-template name="getparams">
    <xsl:with-param name="string" select="text()"/>
    </xsl:call-template>
    </xsl:template>
    <xsl:template name="getparams">
    <xsl:param name="string"/>
    <xsl:param name="lsep"><</xsl:param>
    <xsl:param name="rsep">></xsl:param>
    <xsl:if test="string-length(normalize-space($string))>0">
    <xsl:if test="contains($string, $lsep) and contains($string, $rsep)">
    <xsl:variable name="after">
    <xsl:value-of select="substring-after($string,$lsep)"/>
    </xsl:variable>
    <xsl:variable name="before">
    <xsl:value-of select="substring-before($after,$rsep)"/>
    </xsl:variable>
    <xsl:variable name="next">
    <xsl:value-of select="substring-after($after,$rsep)"/>
    </xsl:variable><xsl:value-of select="$before"/><xsl:text>
    </xsl:text>
    <xsl:if test="string-length(normalize-space($next))>0">
    <xsl:call-template name="getparams">
    <xsl:with-param name="string" select="$next"/>
    </xsl:call-template>
    </xsl:if>
    </xsl:if>
    </xsl:if>
    </xsl:template>
    </xsl:stylesheet>[/CODE]

    Добавлено: движок форума похачил lt и gt обозначения, в xml
     
  14. Gandliar

    Gandliar Well-Known Member

    Регистрация:
    16 фев 2004
    Сообщения:
    222
    Симпатии:
    0
    Кусочек кода

    With docReportTemplate
    Set rtitem = .GetFirstItem( "Files" )
    Set object = rtitem.GetEmbeddedObject(.FileName(0))
    Let pathname = "C:\Temp\"+Left(.FileName(0),Len(.FileName(0))-4)+" "+Format(Cstr(Now),"yyyy-mm-dd_hhnnss")+Right(.FileName(0),4)
    Call object.ExtractFile(pathname)
    End With

    Set stream = session.CreateStream
    If Not stream.Open(pathname) Then
    Messagebox pathname,, "Open failed"
    Exit Sub
    End If

    txt = stream.ReadText()

    With doc

    ...
    keyName = "fldRequestNumber"
    keyValue = Cstr(.EntNumber(0))
    txt = Replace(txt,keyName,keyValue)
    ...

    End With

    Call stream.Truncate
    Call stream.WriteText(txt)
    Call stream.Close

    Set wda=CreateObject("Word.Application")
    With wda
    .documents.Open pathname
    .visible=True
    End With




    Добавлено: А зачем поля тащить из ртф?

    Ведь есть данные в базе (список полей).
    Есть документ в котором названия полей из базы сопостовляются (если хочется) более внятным названиям и ставится префикс (например ~) перед названием.
    И оператор отчетов формируя шаблон оперирует полями из базы (или сопоставленными), а не наоборот.

    А замена происходит быстро, вообще можно менять массив на массив.

    А вообще надо описать типичную задачу а потом реализацию думать :)

    У Вас может специалист лазит по договору, обозначает слова и фразы как поля, потом список полей подтягивается в лотус а дальше кто то сопоставляет реальным полям?
    Ну все равно потом реплэйсом чик и все ;)


    Наверное правильно дать оператору список возможных полей
    и пусть вставляет в документ ;) а программа заменит все что заменяется.
     
  15. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    -что можно написать код - я не сомневаюсь, сомнение в его скорости и обработке "больших" потоков данных (плохо с этим у LS, особливо для стрингов)
    -поля тащить за тем - что бы не делать их в нотес
    -типичная задача выше изложена - генерация договоров по шаблонам (шаблоны хранятся в БД), договора для сотен клиентов. Шаблоны меняются/создаются новые (операторами). Генерят конечный док сэйлзы (для многочисленных клиентов)
    -ну вот сложно операторам создавать всё в 2-ух приложениях (и оно понятно), достаточно ворда
    -нет у вас генерации ПДФ, а РТФ - это УГ (ну как вам ещё объяснить ;) )

    -работа с сложностуктурированным текстом (каковым является РТФ) - это граздо хуже, чем с XML
    -отображение РТФ, и тем более - вордом - это хуже чем отображение ПДФ (ибо отображается везде одинаково)
    -в РТФ нет всяких фич по секурити
    -и ваш алгоритм не проще, чем выше изложенный (не увидел простоты) - шагов больше
    -ваш алгоритм не применим для использования - если текст контракта перенести в нотус (придётся писать генератор РТФ). Для FO - пишем табицу трансформации из DXL

    В дополнении - представьте задачу замены стиля документа (шрифтов, цветов, отступов) - как вы будете решать задачу в РТФ (только не говорите, что реплэйс вас спасёт ;) ). Для FO - достаточно простая XSLT (никаких изменений в коде LS)

    я не вижу "проще" в вашей схеме (исключая ваше восприятие)
    и опять же использование вашего алгоритма обязывает к использованию МСО или виндового вордпад (и то - не факт, что РТФ созданный МСО адекватно отобразиться в вордпад)

    Добавлено: забыл упомянуть, что уже есть принтера (да и др. устройства вывода), кот. могут выводить ПДФ без посредников (аки компьютер/МСО/драйвер и прочая шняга, так привычная для виндоюзера :) )
     
  16. Gandliar

    Gandliar Well-Known Member

    Регистрация:
    16 фев 2004
    Сообщения:
    222
    Симпатии:
    0
    Для того чтобы дальше обсуждать, предлагаю обозначить более точные условия задачи.

    В частности при обсуждении появляются новые задачи ;) (типа автоформатирования)

    И я до сих пор не понял как данные из базы данных связываются с отчетом. когда оператор генерит начальный вордовский файл?


    Оператор знает точные названия полей в базе данных? или знает специальные заранее предопределенные названия? или как?

    rtf в pdf специально поищу программку


    а по скорости выложите тестовый файл в ворде с нужным количеством полей и затестим ;)
     
  17. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    он их сам придумывает (по соглашениею о префиксах), в базе их нет (изначально)
    префикс - связь имени файла и имени поля, например <SA_Number||номер договора[356]> в файле SA_Соглашение о поставке.doc
    SA - и есть префикс
    CM - префикс, кот. может встречаться в нескольких документах, для одного клиента (и соот. в любом файле)
    например <CM_Client_Name||название клиента, краткая форма[ЧП Пупкин]>
    кроме CM, префиксы на усмотрение оператора (как и названия полей), для системы это несущественно, главное - описание поля (именно его будет видеть сэйлз)
    между пайпами || может быть занесено дефолтное значение (ну например название нашей фирмы, кот. меняется редко) типа <CM_We_are|Наша фирма|название компании>
    при "импорте" ворд-файла, в БД, все поля попадают в поля шаблона (спец. документы, респонсы к доку шаблона), попутно отслеживается уникальность, т.к. файл м.б. не один
    всё вышеописанное - это рабочая система (на протяжении >8 лет)
    в данном варианте, для импорта полей, используется КОМ от МСО (что крайне ущербно)
    в варианте с FO - КОМ пропадет и останется только XSLT (кот. выше)
    не забудьте, что она д.б. бесплатной, кроссплатформенной (что автоматически "отрезает" все GDI костыли) и легко интегрироваться в LDN (т.е. не только в Нотес, но и Домино, подразумевая работу в бэкэнде)
    когда у меня будет готовый код - да, но для начала вам нужно найти РТФ-ПДФ конвертор (по указанным хар-кам) :)
     
Загрузка...
Похожие Темы - Шаблоны на основе
  1. ДокторТуамОсес2
    Ответов:
    3
    Просмотров:
    2.146
  2. Edip
    Ответов:
    1
    Просмотров:
    1.039
  3. late
    Ответов:
    0
    Просмотров:
    1.325
  4. Whatka
    Ответов:
    2
    Просмотров:
    1.369
  5. dimanwv
    Ответов:
    2
    Просмотров:
    1.575

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