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

lmike

нет, пердело совершенство
Премиум
27.08.2008
6 567
263
#1
анонс "цикла" изысканий
http://codeby.net/forum/threads/43087.html?vi...st&p=210819
будет код ;), насколько полный - не знаю (зависит от времени)
преобразование схематично выглядит так:
Word-> загрузка в LDN -> генерация FO файла + получение полей для заполнения -> заполнение полей -> подстановка значений и получение PDF
создание Word файла и заполнение полей "лежат на плечах" юзеров :)
остальное делается кодом
 

Gandliar

Lotus team
16.02.2004
341
8
#2
анонс "цикла" изысканий
http://codeby.net/forum/threads/43087.html?vi...st&p=210819
будет код ;), насколько полный - не знаю (зависит от времени)
преобразование схематично выглядит так:
Word-> загрузка в LDN -> генерация FO файла + получение полей для заполнения -> заполнение полей -> подстановка значений и получение PDF
создание Word файла и заполнение полей "лежат на плечах" юзеров :)
остальное делается кодом
Я видел вот какую реализацию

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

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

lmike

нет, пердело совершенство
Премиум
27.08.2008
6 567
263
#3
реализаций и разных подходов много..., но форматы отличные от ПДФ плохо подходят для печати и отображения на разных "устройствах" (фактически - ПДФ в т.ч. и для этого создавался)

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

Gandliar

Lotus team
16.02.2004
341
8
#4
реализаций и разных подходов много..., но форматы отличные от ПДФ плохо подходят для печати и отображения на разных "устройствах" (фактически - ПДФ в т.ч. и для этого создавался)

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

lmike

нет, пердело совершенство
Премиум
27.08.2008
6 567
263
#5
А что такое FO можно ссылочку?
- это XML, предназначеный для обработки apache fop
ну по самому FO


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

Gandliar

Lotus team
16.02.2004
341
8
#6
- это XML, предназначеный для обработки apache fop
ну по самому FO


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

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

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

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

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

lmike

нет, пердело совершенство
Премиум
27.08.2008
6 567
263
#7
нет - не проще
список:
-откуда берём РТФ
-в схеме выше - вообще ничего с на диск выгружать не придётся, кроме результата (ну если тока самому захотелось)
-каким инструментом проводим замену
-
запускает некую програмку конвертации rtf в pdf
какую, не подскажите ;) уиндоуз GDI принтер не предлагать
FO - это обычный XML и средств работы с ним тонны (XSLT как минимум)

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

Gandliar

Lotus team
16.02.2004
341
8
#8
нет - не проще
список:
-откуда берём РТФ
-в схеме выше - вообще ничего с на диск выгружать не придётся, кроме результата (ну если тока самому захотелось)
-каким инструментом проводим замену
-какую, не подскажите ;) уиндоуз GDI принтер не предлагать
FO - это обычный XML и средств работы с ним тонны (XSLT как минимум)

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

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

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

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

lmike

нет, пердело совершенство
Премиум
27.08.2008
6 567
263
#9
ну из вышеизложенного сами видите :newconfus: - не проще
да ещё и за деньги, да еще и парсеры писать (для получения списка полей и для замены)
да и много ещё чего нахардкодить...
 
7

777DEN777

#10
получение PDF

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

lmike

нет, пердело совершенство
Премиум
27.08.2008
6 567
263
#11
во-первых нет, во-вторых как бум на не уиндоуз платформе делать :), а если без МСО...
я понимаю что корпорейт сидит на иглевинде, но это не вечно и есть масса вменяемых фирм, у кот. нет ни винды ни МСО, в частности
под каждый бздёх проприетарщины (в данном случае МС) подстраиваться нет ни желания ни времени (на борьбу с "реализациями") ни охоты тратить неоправданные деньги (в данном контексте - МСО)

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

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

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

Gandliar

Lotus team
16.02.2004
341
8
#12
во-первых нет, во-вторых как бум на не уиндоуз платформе делать :), а если без МСО...
я понимаю что корпорейт сидит на иглевинде, но это не вечно и есть масса вменяемых фирм, у кот. нет ни винды ни МСО, в частности
под каждый бздёх проприетарщины (в данном случае МС) подстраиваться нет ни желания ни времени (на борьбу с "реализациями") ни охоты тратить неоправданные деньги (в данном контексте - МСО)

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

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

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

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

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

lmike

нет, пердело совершенство
Премиум
27.08.2008
6 567
263
#13
Чето не понимаю.

1. Пользователь руками вставляет "поля" в условный шаблон печатного документа (например в ворде) типа @имя_директора, @юридический адрес, ...
2. Сохраняет как .rtf и цепляет в базу
3. на лотусскрипте детачим на диск, читаем как stream в переменную, делаем replace(переменная,"@имя_директора","реальное фио") и записываем назад.
вы серьёзно верите в работоспособность и скорость такого кода? :)
2. Сохраняет как .rtf и цепляет в базу
очень гуманно напоминать оператору, про дополнительные действия ;) (в моей схеме это шаг отсутствует)
и пропущен немаловажный момент - получение переменных в нотус из РТФ - это уже не проще

так же не учтено...
вот у нас по 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
 

Gandliar

Lotus team
16.02.2004
341
8
#14
Кусочек кода

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




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

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

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

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

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


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

lmike

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

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

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

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

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

Gandliar

Lotus team
16.02.2004
341
8
#16
-что можно написать код - я не сомневаюсь, сомнение в его скорости и обработке "больших" потоков данных (плохо с этим у LS, особливо для стрингов)
-поля тащить за тем - что бы не делать их в нотес
-типичная задача выше изложена - генерация договоров по шаблонам (шаблоны хранятся в БД), договора для сотен клиентов. Шаблоны меняются/создаются новые (операторами). Генерят конечный док сэйлзы (для многочисленных клиентов)
-ну вот сложно операторам создавать всё в 2-ух приложениях (и оно понятно), достаточно ворда
-нет у вас генерации ПДФ, а РТФ - это УГ (ну как вам ещё объяснить ;) )

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

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

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

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

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

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


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

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


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

lmike

нет, пердело совершенство
Премиум
27.08.2008
6 567
263
#17
Оператор знает точные названия полей в базе данных?
он их сам придумывает (по соглашениею о префиксах), в базе их нет (изначально)
префикс - связь имени файла и имени поля, например <SA_Number||номер договора[356]> в файле SA_Соглашение о поставке.doc
SA - и есть префикс
CM - префикс, кот. может встречаться в нескольких документах, для одного клиента (и соот. в любом файле)
например <CM_Client_Name||название клиента, краткая форма[ЧП Пупкин]>
кроме CM, префиксы на усмотрение оператора (как и названия полей), для системы это несущественно, главное - описание поля (именно его будет видеть сэйлз)
между пайпами || может быть занесено дефолтное значение (ну например название нашей фирмы, кот. меняется редко) типа <CM_We_are|Наша фирма|название компании>
при "импорте" ворд-файла, в БД, все поля попадают в поля шаблона (спец. документы, респонсы к доку шаблона), попутно отслеживается уникальность, т.к. файл м.б. не один
всё вышеописанное - это рабочая система (на протяжении >8 лет)
в данном варианте, для импорта полей, используется КОМ от МСО (что крайне ущербно)
в варианте с FO - КОМ пропадет и останется только XSLT (кот. выше)
rtf в pdf специально поищу программку
не забудьте, что она д.б. бесплатной, кроссплатформенной (что автоматически "отрезает" все GDI костыли) и легко интегрироваться в LDN (т.е. не только в Нотес, но и Домино, подразумевая работу в бэкэнде)
а по скорости выложите тестовый файл в ворде с нужным количеством полей и затестим
когда у меня будет готовый код - да, но для начала вам нужно найти РТФ-ПДФ конвертор (по указанным хар-кам) :)