Лирическое вступление.
Последнее время я все чаще задавался вопросом, "что, из созданного мной, могло бы, заинтересовать читателя" (надеюсь программиста или верстальщика) и, быть может, даже сэкономить ему немного "рутинного времени" или по крайней мере на поиск нужного решения для достижения результата.
В конце-концов, в этом сама суть сети интернет - в обмене информацией.
Учитывая род моей деятельности последние годы (web-разработчик) я заметил, что часто даже интернет "молчит" в поисках решения, в итоге создается ощущение, что "такого еще никто не делал" :). Однако, даже если я просто плохо ищу - все равно я очень надеюсь я кому-нибудь помогу выложив свое решение).
Данный абзац не следует относить строго к этому топику, здесь я просто высказываю свою позицию к "блоггингу" в будущем.
Итак, собственно, пример...
Проблема
В данный момент в организации где я работаю (вкраце - в банке, в управлении банковских карт), мы реализовывали возможность выполнения произвольного платежа физическими лицами (клиентами - держателями карт), ест-но, мне необходимо было вывести на экран сформированное платежное поручение как на шаге подтверждения выполнения операции так и после ее выполнения, что самое неприятное - еще было бы очень неплохо если бы пользователь мог его распечатать и сохранить.
Более детально излагаю TODO ;-)
1. Сверстать используя html-бланк платежного поручения для того, чтобы в дальнейшем использовать его для демонстрации пользователю, в понятном виде, отправляемых данных
2. Все тоже самое, что написано в п.1, кроме целевого "формата верстки" ( :) любопытное словосочетание) - PDF.
Все это, я, естественно, делал на "уровне серверного бизнес приложения" (в не в Adobe PageMaker / Acrobat (Professional) или Иллюстраторе)
Реализация
Итак, что мне надо было сверстать:

Вот, что у меня вышло в плане HTML
1. Таблица стилей:
2. Сам html-код:
3. XSL-FO
Ниже я поясняю как использовать FOP (хотя, думаю, что все, кого эта "зарисовка" заинтересует прекрасно знают что делать с XSL-FO, но на всякий случай я все-таки расскажу об этом).
Итак, для того, чтобы сформировать из последнего PDF файл необходимо используя Apache FOP сформировать XML-файл (строку) наподобие (изначально, было взято из примера):
и выполнить преобразование XML->[xslt]->PDF (взято из примера Apache):
Крмое того, т.к. нам нужно интегрировать кириллицу - придется сформировать файлы метрики для шрифтов Courier и добавить в файл конфигурации
Последнее время я все чаще задавался вопросом, "что, из созданного мной, могло бы, заинтересовать читателя" (надеюсь программиста или верстальщика) и, быть может, даже сэкономить ему немного "рутинного времени" или по крайней мере на поиск нужного решения для достижения результата.
В конце-концов, в этом сама суть сети интернет - в обмене информацией.
Учитывая род моей деятельности последние годы (web-разработчик) я заметил, что часто даже интернет "молчит" в поисках решения, в итоге создается ощущение, что "такого еще никто не делал" :). Однако, даже если я просто плохо ищу - все равно я очень надеюсь я кому-нибудь помогу выложив свое решение).
Данный абзац не следует относить строго к этому топику, здесь я просто высказываю свою позицию к "блоггингу" в будущем.
Итак, собственно, пример...
Проблема
В данный момент в организации где я работаю (вкраце - в банке, в управлении банковских карт), мы реализовывали возможность выполнения произвольного платежа физическими лицами (клиентами - держателями карт), ест-но, мне необходимо было вывести на экран сформированное платежное поручение как на шаге подтверждения выполнения операции так и после ее выполнения, что самое неприятное - еще было бы очень неплохо если бы пользователь мог его распечатать и сохранить.
Более детально излагаю TODO ;-)
1. Сверстать используя html-бланк платежного поручения для того, чтобы в дальнейшем использовать его для демонстрации пользователю, в понятном виде, отправляемых данных
2. Все тоже самое, что написано в п.1, кроме целевого "формата верстки" ( :) любопытное словосочетание) - PDF.
Все это, я, естественно, делал на "уровне серверного бизнес приложения" (в не в Adobe PageMaker / Acrobat (Professional) или Иллюстраторе)
Реализация
Оговорюсь сразу - я все-таки не верстальщик, а программист (хотя с версткой сталкиваюсь последние 10 лет постоянно) и поэтому строго не судите (особенно это касается XSL-FO).
Итак, что мне надо было сверстать:

Вот, что у меня вышло в плане HTML
1. Таблица стилей:
- #PAYMENT_FORM_PRINTABLE { width:210mm;/* border:solid 1px #333; */ }
- .pay_form { margin-left:20mm;width:18cm;padding:0; }
- .pnt { width:5mm;height:5mm;line-height:0.65em;font-size:0.55em;text-align:center; color: #fff;}
- tr.head { height:5px; }
- table.pay_form td { font-size:0.65em; line-height:0.85em; height:10mm;margin:0;padding:0; }
- .cntr { text-align:center; }
- .outYR { border:solid 1px #F90; }
- .bordbot { border-bottom:solid 1px #333 }
- .bordtop { border-top:solid 1px #333 }
- .bordrg { border-right:solid 1px #333 }
- .bordlf { border-left:solid 1px #333 }
- .allbr { border-right: solid 1px #333;border-bottom: solid 1px #333;border-top: solid 1px #333; }
- .padleft { padding-left:1mm; }
- .padbottom { padding-bottom:1mm; }
- @media print {
- body {margin:0;padding:0;}
- #PAYMENT_FORM_PRINTABLE { border: none; width:180mm;padding:0;margin:0;}
- #PAYMENT_FORM_PRINTABLE table { margin:0; }
- }
2. Сам html-код:
- <table cellpadding="0" cellspacing="0" border="0" class="pay_form">
- <thead>
- <tr>
- <th class="pnt">5</th>
- <th class="pnt">10</th>
- <th class="pnt">15</th>
- <th class="pnt">20</th>
- <th class="pnt">25</th>
- <th class="pnt">30</th>
- <th class="pnt">35</th>
- <th class="pnt">40</th>
- <th class="pnt">45</th>
- <th class="pnt">50</th>
- <th class="pnt">55</th>
- <th class="pnt">60</th>
- <th class="pnt">65</th>
- <th class="pnt">70</th>
- <th class="pnt">75</th>
- <th class="pnt">80</th>
- <th class="pnt">85</th>
- <th class="pnt">90</th>
- <th class="pnt">95</th>
- <th class="pnt">00</th>
- <th class="pnt">05</th>
- <th class="pnt">10</th>
- <th class="pnt">15</th>
- <th class="pnt">20</th>
- <th class="pnt">25</th>
- <th class="pnt">30</th>
- <th class="pnt">35</th>
- <th class="pnt">40</th>
- <th class="pnt">45</th>
- <th class="pnt">50</th>
- <th class="pnt">55</th>
- <th class="pnt">60</th>
- <th class="pnt">65</th>
- <th class="pnt">70</th>
- <th class="pnt">75</th>
- <th class="pnt">80</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td colspan="7" class="cntr">
- _____________________<br/>
- Поступ. в банк плат.
- </td>
- <td> </td>
- <td colspan="7" class="cntr">
- _____________________<br/>
- Списано со сч. плат.
- </td>
- <td colspan="16"> </td>
- <td colspan="4">
- <div style="width:100%;height:5mm;text-align:center; font-weight:bold;border:solid 1px #666;padding-top:1mm;">
- 0401060
- </div>
- </td>
- <td > </td>
- </tr>
- <tr>
- <td colspan="12" style="font-weight:bold;padding-top:3mm;">
- ПЛАТЕЖНОЕ ПОРУЧЕНИЕ N <span id="payment_use_id">###</span>
- </td>
- <td colspan="7" class="cntr">
- <div style="width:35mm;position:absolute;height:4mm;overflow:hidden" id="payment_use_date">####.##.##</div>
- _____________________<br/>
- Дата
- </td>
- <td> </td>
- <td colspan="7" class="cntr">
- <div style="width:35mm;position:absolute;height:4mm;overflow:hidden" id="doctype"> </div>
- _____________________<br/>
- Вид платежа
- </td>
- <td colspan="6"> </td>
- <td colspan="3">
- <div class="allbr bordlf" id="paytype" style="margin: 1mm 5mm 1mm 5mm;height:8mm;"> </div>
- </td>
- </tr>
- <tr>
- <td colspan="36" style="line-height:0.2em;height:0.2em"> </td>
- </tr>
- <tr>
- <td class="bordbot bordrg" style="height:15mm;text-align:right" colspan="4">
- <span style="padding-top:2mm;padding-right:1mm;">
- Сумма <br/>
- прописью
- </span>
- </td>
- <td colspan="32" class="bordbot">
- <div id="amount_string" style="text-align:left;padding-left:1mm;"> </div>
- </td>
- </tr>
- <tr>
- <td colspan="10" class="bordbot bordrg" valign="middle"><span class="padleft">ИНН</span> <span id="payment_use_payer_inn">000000000000</span></td>
- <td colspan="10" class="bordbot bordrg" valign="middle"><span class="padleft">КПП</span> <span id="payment_use_payer_kpp"> </span></td>
- <td colspan="3" class="bordbot bordrg" rowspan="2"><span class="padleft">Сумма</span></td>
- <td colspan="13" class="bordbot" rowspan="2"><span class="padleft" id="payment_use_amount">####,##</span></td>
- </tr>
- <tr>
- <td colspan="20" class="bordrg" style="line-height:0.2em;height:5mm">
- <div id="payment_use_p_full_name" style="position:absolute;width:10cm;overflow:hidden;height:10mm;/*background-color:#cfd;*/padding-left:1mm;line-height:10px;"> 
- </div> 
- </td>
- </tr>
- <tr>
- <td colspan="20" class="bordbot bordrg" valign="bottom">
- <span class="padleft padbottom">Плательщик</span>
- </td>
- <td colspan="3" class="bordbot bordrg"><span class="padleft">Сч. N</span></td>
- <td colspan="13"><span class="padleft" id="payment_use_source_acc">####################</span></td>
- </tr>
- <tr>
- <td colspan="20" class="bordbot bordrg" valign="bottom" rowspan="2">
- <div id="payerBankName" style="width:98mm;overflow:hidden;height:15mm;">
- </div>
- <span class="padleft padbottom">Банк плательщика</span></td>
- <td colspan="3" class="bordbot bordrg"><span class="padleft">БИК</span></td>
- <td colspan="13"><span class="padleft" id="payment_use_p_b_bik"> </span></td>
- </tr>
- <tr>
- <td colspan="3" class="bordbot bordrg"><span class="padleft">Сч. N</span></td>
- <td colspan="13" class="bordbot"><span class="padleft" id="payment_use_b_corr">30101810400000000700</span></td>
- </tr>
- <!-- -->
- <tr>
- <td colspan="20" class="bordbot bordrg" valign="bottom" rowspan="2">
- <div id="payment_use_b_full_name" style="width:98mm;overflow:hidden;height:15mm;">
- </div>
- <span class="padleft padbottom">Банк получателя</span></td>
- <td colspan="3" class="bordbot bordrg"><span class="padleft">БИК</span></td>
- <td colspan="13"><span class="padleft" id="payment_use_b_bik">#######</span></td>
- </tr>
- <tr>
- <td colspan="3" class="bordbot bordrg"><span class="padleft">Сч. N</span></td>
- <td colspan="13"><span class="padleft" id="payment_use_b_korr">####################</span></td>
- </tr>
- <!-- -->
- <tr>
- <td colspan="10" class="bordbot bordrg"><span class="padleft">ИНН</span> <span id="payment_use_inn">0000000000</span></td>
- <td colspan="10" class="bordbot bordrg"><span class="padleft">КПП</span></td>
- <td colspan="3" class="bordbot bordrg"><span class="padleft">Сч. N</span></td>
- <td colspan="13" class="bordbot"><span class="padleft" id="payment_use_rash">####################</span></td>
- </tr>
- <tr>
- <td colspan="20" class="bordrg" style="height:15mm" rowspan="3">
- <div id="payment_use_full_name" style="width:10cm;overflow:hidden;height:25mm;">
- </div>
- <span class="padleft padbottom">Получатель</span>
- </td>
- <td colspan="3" class="bordrg bordbot" style="height:5mm;"><span class="padleft">Вид. оп.</span></td>
- <td colspan="4"><span class="padleft">01</span></td>
- <td colspan="4" class="bordlf bordrg bordbot"><span class="padleft">Срок плат.</span></td>
- </tr>
- <tr>
- <td colspan="3" class="bordrg bordbot" style="height:5mm;"><span class="padleft">Наз. оп.</span></td>
- <td colspan="4"><span class="padleft"> </span></td>
- <td colspan="4" class="bordlf bordrg bordbot"><span class="padleft">Очер. плат.</span></td>
- <td colspan="4"><span class="padleft">6</span></td>
- </tr>
- <tr>
- <td colspan="3" class="bordrg" style="height:5mm;"><span class="padleft">Код</span></td>
- <td colspan="4"><span class="padleft"> </span></td>
- <td colspan="4" class="bordlf bordrg"><span class="padleft"> </span></td>
- </tr>
- <tr>
- <td colspan="9" class="allbr"> </td>
- <td colspan="6" class="allbr"> </td>
- <td colspan="2" class="allbr"> </td>
- <td colspan="5" class="allbr"> </td>
- <td colspan="7" class="allbr"> </td>
- <td colspan="5" class="allbr"> </td>
- <td colspan="2" class="bordbot bordtop"> </td>
- </tr>
- <tr>
- <td colspan="36" valign="bottom" class="bordbot" style="height:30mm">
- <div style="height:25mm" class="out" id="payment_use_assignment">#######</div>
- <span class="padleft padbottom">Назначение платежа</span></td>
- </tr>
- <tr>
- <td colspan="10" style="height:15mm;"> </td>
- <td colspan="12" align="center" class="bordbot" valign="top"><div style="margin-top:1mm">Подписи</div>
- </td>
- <td colspan="14" align="center" valign="top"><div style="margin-top:1mm">Отметки банка</div></td>
- </tr>
- <tr>
- <td colspan="10" style="height:15mm;text-align:center;" valign="middle">М.П.</td>
- <td colspan="12" align="center" class="bordbot"> </td>
- <td colspan="14" align="center"> </td>
- </tr>
- <tr>
- <td colspan="36"> </td>
- </tr>
- </tbody>
- </table>
3. XSL-FO
- <?xml version="1.0" encoding="UTF-8"?>
- <xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
- <xsl:output method="pdf" version="1.0" omit-xml-declaration="no" indent="yes"/>
- <xsl:template match="projectteam">
- <fo:root xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <fo:layout-master-set>
- <fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="1cm" margin-bottom="2cm" margin-left="2cm" margin-right="1cm">
- <fo:region-body/><!-- margin-top="0.79in" margin-bottom="0.79in" -->
- </fo:simple-page-master>
- </fo:layout-master-set>
- <!-- fo:page-sequence master-reference="default-page" initial-page-number="1" format="1" -->
- <fo:page-sequence master-reference="simpleA4">
- <fo:flow flow-name="xsl-region-body">
- <!-- fo:block>
- <fo:block margin="0pt">
- <fo:block -->
- <fo:table table-layout="fixed" font-family="Courier New" font-size="0.68em" width="100%" border-spacing="0" margin="0" padding="0">
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <fo:table-column column-width="proportional-column-width(1)"/>
- <!-- fo:table-header start-indent="0pt" >
- <fo:table-row>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >5</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >10</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >15</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >20</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >25</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >30</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >35</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >40</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >45</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >50</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >55</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >60</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >65</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >70</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >75</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >80</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >85</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >90</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >95</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >00</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >05</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >10</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >15</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >20</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >25</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >30</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >35</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >40</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >45</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >50</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >55</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >60</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >65</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >70</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >75</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" height="6" display-align="center">
- <fo:block>
- <fo:inline >80</fo:inline>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- </fo:table-header -->
- <!-- proofing 2009.04.29 -->
- <fo:table-body start-indent="0pt" >
- <fo:table-row height="21mm">
- <fo:table-cell number-columns-spanned="7">
- <fo:block height="21mm" padding-top="11.6mm">
- <fo:block border-bottom="solid 1pt #444444" width="35mm" text-align="center" vertical-align="bottom" height="15mm"><xsl:value-of select="doc/date1"/></fo:block>
- <fo:inline>Поступ. в банк плат.</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0"><fo:block/></fo:table-cell>
- <fo:table-cell number-columns-spanned="7">
- <fo:block height="21mm" padding-top="11.6mm">
- <fo:block border-bottom="solid 1pt #444444" width="35mm" height="15mm" text-align="center"><xsl:value-of select="doc/date2"/></fo:block>
- <fo:inline>Списано со сч. плат.</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="17" padding="0" display-align="center">
- <fo:block>
- <fo:inline > </fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="4" padding="0" display-align="center">
- <fo:block>
- <fo:block border="#333 1pt solid" font-weight="bold" height="5mm" padding-top="1.5mm" padding-bottom="1.5mm" text-align="center" width="100%" margin-right="100% - 100%" margin="0pt">
- <fo:block>
- <fo:inline >0401060</fo:inline>
- </fo:block>
- </fo:block>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- <!-- proofing 2009.04.29 : ^._ row done just under 15:37 _.^ -->
- <fo:table-row>
- <fo:table-cell number-columns-spanned="12" font-weight="bold" padding-top="3mm" padding="0" display-align="center">
- <fo:block>
- ПЛАТЕЖНОЕ ПОРУЧЕНИЕ N <xsl:value-of select="doc/id"/>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="7">
- <fo:block height="12mm" margin-top="4mm">
- <fo:block border-bottom="solid 1pt #444444" width="35mm" text-align="center">
- <xsl:value-of select="doc/docdate"/></fo:block>
- <fo:block width="100%" text-align="center">Дата</fo:block>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell padding="0" display-align="center">
- <fo:block>
- <fo:inline > </fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="7">
- <fo:block height="12mm" margin-top="4mm">
- <fo:block border-bottom="solid 1pt #444444" width="35mm" text-align="center">
- <xsl:value-of select="doc/doctype"/></fo:block>
- <fo:block width="100%" text-align="center">Вид платежа</fo:block>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="8" padding="0" display-align="center">
- <fo:block>
- <fo:inline > </fo:inline>
- </fo:block>
- </fo:table-cell>
- <!-- fo:table-cell number-columns-spanned="3" padding="0" display-align="center">
- <fo:block>
- <fo:block height="8 mm" margin="1mm 3mm">
- <fo:block>
- <fo:inline > </fo:inline>
- </fo:block>
- </fo:block>
- </fo:block>
- </fo:table-cell -->
- <fo:table-cell number-columns-spanned="1" padding="0" display-align="center">
- <fo:block>
- <fo:block border="#333 1pt solid" font-weight="bold" height="5mm" padding-top="1.5mm" padding-bottom="1.5mm" text-align="center" width="100%" margin-right="100% - 100%" margin="0pt">
- <xsl:if test="string-length(doc/param_top_right_unknown_field_name)=0">
-  
- </xsl:if>
- <xsl:if test="string-length(doc/param_top_right_unknown_field_name) > 0">
- <xsl:value-of select="doc/param_top_right_unknown_field_name"/>
- </xsl:if>
- </fo:block>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- <!-- proofing 2009.04.29 : ^._ row done just under 16:30 _.^ -->
- <!-- fo:table-row background-color="#ccf">
- <fo:table-cell number-columns-spanned="36" height="0.2em" line-height="0.2em" padding="0" display-align="center">
- <fo:block>
- <fo:inline > </fo:inline>
- </fo:block>
- </fo:table-cell>
- </fo:table-row -->
- <fo:table-row height="15mm">
- <fo:table-cell number-columns-spanned="4" height="15mm" text-align="right" border-right="solid 1pt #333" border-bottom="solid 1pt #333" display-align="center">
- <fo:block margin-left="2mm" margin-right="2mm">Сумма прописью</fo:block>
- </fo:table-cell>
- <fo:table-cell border-bottom="solid 1pt #333" number-columns-spanned="32" padding="0" display-align="center" text-align="left">
- <fo:block margin-left="2mm" margin-right="2mm">
- <xsl:value-of select="doc/amount_string"/>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- <!-- proofing 2009.04.29 : ^._ row done just under 17:02 _.^ -->
- <fo:table-row height="10mm">
- <fo:table-cell number-columns-spanned="10" padding="0" display-align="center" border-right="solid 1pt #333" border-bottom="solid 1pt #333">
- <fo:block>
- <fo:inline padding="1mm">ИНН</fo:inline>
- <fo:inline padding="1mm">
- <xsl:call-template name="fill_on_empty">
- <!-- xsl:with-param name="defaultValue" select="'000000doc/owner_inn"/ -->
- <xsl:with-param name="item" select="string(doc/owner_inn)"/>
- </xsl:call-template>
- <!-- xsl:value-of select="doc/owner_inn"/ -->
- </fo:inline>
- <fo:inline > </fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="10" padding="0" display-align="center" border-bottom="solid 1pt #333" border-right="solid 1pt #333">
- <fo:block>
- <fo:inline padding="1mm">КПП</fo:inline>
- <fo:inline > </fo:inline>
- <fo:inline padding="1mm"><xsl:value-of select="doc/owner_kpp"/></fo:inline>
- <fo:inline > </fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="3" number-rows-spanned="2" display-align="center" border-bottom="solid 1pt #333" border-left="solid 1pt #333" border-right="solid 1pt #333">
- <fo:block>
- <fo:inline padding="1mm">Сумма</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="13" number-rows-spanned="2" display-align="center" border-bottom="solid 1pt #333" border-left="solid 1pt #333">
- <fo:block>
- <fo:inline padding="1mm"><xsl:value-of select="translate(doc/amount,',','-')"/></fo:inline>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="5mm">
- <fo:table-cell number-columns-spanned="20" border-right="solid 1pt #333">
- <fo:block-container height="15mm" width="100mm" absolute-position="absolute" vertical-align="top">
- <fo:block padding="1mm"><xsl:value-of select="doc/owner_bank"/></fo:block>
- </fo:block-container>
- <fo:block/>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="15mm">
- <fo:table-cell number-columns-spanned="20" border-bottom="solid 1pt #333" border-right="solid 1pt #333" display-align="after">
- <fo:block padding="1mm">Плательщик</fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="3" border-bottom="solid 1pt #333" border-left="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="1mm">Сч. N</fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="13" border-left="solid 1pt #333" display-align="center">
- <!-- source account -->
- <fo:block><fo:inline padding="1mm"><xsl:value-of select="doc/owner_source_account"/></fo:inline></fo:block>
- </fo:table-cell>
- </fo:table-row>
- <!-- proofing 2009.04.29 : ^._ row done just under 19:49 _.^ -->
- <fo:table-row height="5mm">
- <fo:table-cell number-columns-spanned="20" border-right="solid 1pt #333">
- <fo:block-container height="10mm" width="100mm" absolute-position="absolute" vertical-align="top">
- <fo:block padding="1mm"><xsl:value-of select="doc/owner_bank"/></fo:block>
- </fo:block-container>
- <fo:block/>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="3" border-bottom="solid 1pt #333" border-left="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="1mm">БИК</fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="13" border-left="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="1mm"><xsl:value-of select="doc/owner_bank_bik"/></fo:inline></fo:block>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="10mm">
- <fo:table-cell number-columns-spanned="20" border-bottom="solid 1pt #333" border-right="solid 1pt #333" display-align="after">
- <fo:block padding="1mm">Банк плательщика</fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="3" border-left="solid 1pt #333" border-bottom="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="1mm">Сч. N</fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="13" border-left="solid 1pt #333" border-bottom="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="1mm"><xsl:value-of select="doc/owner_bank_account"/></fo:inline></fo:block>
- </fo:table-cell>
- </fo:table-row>
- <!-- proofing 2009.04.29 : ^._ row done just under 20:08 _.^ -->
- <!-- next is the receiver fields -->
- <fo:table-row height="5mm">
- <fo:table-cell number-columns-spanned="20" border-right="solid 1pt #333">
- <fo:block-container height="10mm" width="100mm" absolute-position="absolute" vertical-align="top">
- <fo:block padding="1mm"><xsl:value-of select="doc/b_full_name"/></fo:block>
- </fo:block-container>
- <fo:block/>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="3" border-bottom="solid 1pt #333" border-left="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="1mm">БИК</fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="13" border-left="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="1mm"><xsl:value-of select="doc/b_bik"/></fo:inline></fo:block>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="10mm">
- <fo:table-cell number-columns-spanned="20" border-bottom="solid 1pt #333" border-right="solid 1pt #333" display-align="after">
- <fo:block padding="1mm">Банк получателя</fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="3" border-left="solid 1pt #333" border-bottom="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="1mm">Сч. N</fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="13" border-left="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="1mm"><xsl:value-of select="doc/b_korr"/></fo:inline></fo:block>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="10mm">
- <fo:table-cell number-columns-spanned="10" padding="0" display-align="center" border-right="solid 1pt #333" border-bottom="solid 1pt #333">
- <fo:block>
- <fo:inline padding="1mm">ИНН</fo:inline>
- <fo:inline > </fo:inline>
- <fo:inline padding="1mm"><xsl:value-of select="doc/inn"/></fo:inline>
- <fo:inline > </fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="10" padding="0" display-align="center" border-bottom="solid 1pt #333" border-right="solid 1pt #333">
- <fo:block>
- <fo:inline padding="1mm">КПП</fo:inline>
- <fo:inline > </fo:inline>
- <fo:inline padding="1mm"><xsl:value-of select="doc/kpp"/></fo:inline>
- <fo:inline > </fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="3" number-rows-spanned="2" display-align="center" border-bottom="solid 1pt #333" border-left="solid 1pt #333" border-right="solid 1pt #333">
- <fo:block>
- <fo:inline padding="1mm">Сч. N</fo:inline>
- </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="13" number-rows-spanned="2" display-align="center" border-bottom="solid 1pt #333" border-left="solid 1pt #333">
- <fo:block>
- <fo:inline padding="1mm"><xsl:value-of select="doc/rash"/></fo:inline>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="5mm">
- <fo:table-cell number-columns-spanned="20" border-right="solid 1pt #333">
- <fo:block-container height="15mm" width="100mm" absolute-position="absolute" vertical-align="top">
- <fo:block padding="1mm"><xsl:value-of select="doc/full_name"/></fo:block>
- </fo:block-container>
- <fo:block/>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="5mm">
- <fo:table-cell number-columns-spanned="20" border-right="solid 1pt #333" display-align="after">
- <fo:block/>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="3" border-bottom="solid 1pt #333" border-left="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="1mm">Вид оп.</fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="4" border-left="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="1mm">01<!--xsl:value-of select="doc/pay_type"/--></fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="4" border-bottom="solid 1pt #333" border-left="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="1mm">Срок плат.</fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="5" border-left="solid 1pt #333" display-align="center" overflow="hidden">
- <fo:block><fo:inline padding="1mm"><xsl:value-of select="doc/pay_period"/></fo:inline></fo:block>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="5mm">
- <fo:table-cell number-columns-spanned="20" border-right="solid 1pt #333" display-align="after">
- <fo:block/>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="3" border-bottom="solid 1pt #333" border-left="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="0.4mm">Наз. пл.</fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="4" border-left="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="1mm"><xsl:value-of select="doc/pay_naz"/></fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="4" border-bottom="solid 1pt #333" border-left="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="0.3mm">Очер. плат.</fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="5" border-left="solid 1pt #333" display-align="center" overflow="hidden">
- <fo:block><fo:inline padding="1mm"><xsl:value-of select="doc/pay_queue"/></fo:inline></fo:block>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="5mm">
- <fo:table-cell number-columns-spanned="20" border-right="solid 1pt #333" border-bottom="solid 1pt #333" display-align="after"><!-- padding-bottom="1mm" padding-left="1mm" -->
- <fo:block padding-bottom="1mm" padding-left="1mm">Плательщик</fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="3" border-bottom="solid 1pt #333" border-left="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding-bottom="1mm" padding-left="1mm">Код</fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="4" border-bottom="solid 1pt #333" border-left="solid 1pt #333" display-align="center">
- <fo:block><fo:inline padding="1mm"><xsl:value-of select="doc/pay_code"/></fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="4" border-bottom="solid 1pt #333" border-left="solid 1pt #333" display-align="center">
- <fo:block/>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="5" border-left="solid 1pt #333" border-bottom="solid 1pt #333" display-align="center" overflow="hidden">
- <fo:block/>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="5mm">
- <fo:table-cell number-columns-spanned="9" border-right="solid 1pt #333" border-bottom="solid 1pt #333" display-align="center">
- <fo:block padding="1mm"> <xsl:value-of select="doc/tax_field1"/> </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="6" border-right="solid 1pt #333" border-bottom="solid 1pt #333" display-align="center">
- <fo:block padding="1mm"> <xsl:value-of select="doc/tax_field2"/> </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="2" border-right="solid 1pt #333" border-bottom="solid 1pt #333" display-align="center">
- <fo:block padding="1mm"> <xsl:value-of select="doc/tax_field3"/> </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="5" border-right="solid 1pt #333" border-bottom="solid 1pt #333" display-align="center">
- <fo:block padding="1mm"> <xsl:value-of select="doc/tax_field4"/> </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="7" border-right="solid 1pt #333" border-bottom="solid 1pt #333" display-align="center">
- <fo:block padding="1mm"> <xsl:value-of select="doc/tax_field5"/> </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="5" border-right="solid 1pt #333" border-bottom="solid 1pt #333" display-align="center">
- <fo:block padding="1mm"> <xsl:value-of select="doc/tax_field6"/> </fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="2" border-bottom="solid 1pt #333" display-align="center">
- <fo:block padding="1mm"> <xsl:value-of select="doc/tax_field7"/> </fo:block>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="25mm">
- <fo:table-cell number-columns-spanned="36">
- <fo:block padding="1mm">Плательщик: <xsl:value-of select="doc/owner_fullname"/> № СКС <xsl:value-of select="doc/source_acc"/>.<fo:block/>
- <xsl:value-of select="doc/assignment"/>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="5mm">
- <fo:table-cell number-columns-spanned="36" border-bottom="solid 1pt #333" display-align="center">
- <fo:block padding-bottom="1mm" padding-left="1mm"> Назначение платежа </fo:block>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="15mm">
- <fo:table-cell number-columns-spanned="10" display-align="center">
- <fo:block/>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="12" border-bottom="solid 1pt #333" text-align="center">
- <fo:block padding="2mm"><fo:inline>Подписи</fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="14" text-align="center">
- <fo:block padding="2mm"><fo:inline>Отметки банка</fo:inline></fo:block>
- <fo:block-container height="40mm" width="60mm" absolute-position="absolute" vertical-align="top">
- <!-- fo:block padding="1mm"><xsl:value-of select="doc/owner_fullname"/></fo:block -->
- <fo:block width="40mm" height="20mm">
- <fo:external-graphic width="40mm" height="20mm" src="file:///opt/apache-tomcat-5.5.20/webapps/content/WEB-INF/config/fop/stamp.svg"/>
- </fo:block>
- <!-- fo:block / -->
- </fo:block-container>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="15mm">
- <fo:table-cell number-columns-spanned="10" text-align="center">
- <fo:block padding="2mm"><fo:inline>М.П.</fo:inline></fo:block>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="12" border-bottom="solid 1pt #333" text-align="center">
- <fo:block/>
- </fo:table-cell>
- <fo:table-cell number-columns-spanned="14" text-align="center">
- <fo:block/>
- </fo:table-cell>
- </fo:table-row>
- <fo:table-row height="10mm">
- <fo:table-cell number-columns-spanned="36" >
- <fo:block/>
- </fo:table-cell>
- </fo:table-row>
- </fo:table-body>
- </fo:table>
- </fo:flow>
- </fo:page-sequence>
- </fo:root>
- </xsl:template>
- <xsl:template name="fill_on_empty">
- <xsl:param name="item" select="'000000000000'"/>
- <xsl:param name="defaultValue" select="'000000000000'"/>
- <xsl:if test="not(string-length($item) = string-length($defaultValue))">
- <xsl:value-of select="$defaultValue"/>
- </xsl:if>
- <xsl:if test="string-length($item) = string-length($defaultValue)">
- <xsl:value-of select="$item"/>
- </xsl:if>
- </xsl:template>
- </xsl:stylesheet>
Ниже я поясняю как использовать FOP (хотя, думаю, что все, кого эта "зарисовка" заинтересует прекрасно знают что делать с XSL-FO, но на всякий случай я все-таки расскажу об этом).
Итак, для того, чтобы сформировать из последнего PDF файл необходимо используя Apache FOP сформировать XML-файл (строку) наподобие (изначально, было взято из примера):
<?xml version="1.0" encoding="UTF-8"?>
<projectteam>
<doc>
<date1>2008.12.12</date1>
<date2>2009.12.12</date2>
<param_top_right_unknown_field_name>02</param_top_right_unknown_field_name>
<number>12</number>
...
</doc>
</projectteam>
и выполнить преобразование XML->[xslt]->PDF (взято из примера Apache):
- try {
- FopFactory fopFactory = FopFactory.newInstance();
- if (userConfPath!=null && userConfPath.length()>0)
- fopFactory.setUserConfig(userConfPath);
-
- FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
- // configure foUserAgent as desired
-
- // Setup output
- OutputStream out = new java.io.BufferedOutputStream(output);
-
- try {
- // Construct fop with desired output format
- Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
- //fop.
- // Setup XSLT
- TransformerFactory factory = TransformerFactory.newInstance();
- Transformer transformer = factory.newTransformer(stylesheet);
-
- // Set the value of a <param> in the stylesheet
- transformer.setParameter("versionParam", "2.0");
-
- // Setup input for XSLT transformation
- //Source src = new StreamSource(xmlfile);
-
- // Resulting SAX events (the generated FO) must be piped through to FOP
- Result res = new SAXResult(fop.getDefaultHandler());
- // Start XSLT transformation and FOP processing
- transformer.transform(source, res);
- } finally {
- out.close();
- }
- } catch (Exception e) {
- is_err = true;
- e.printStackTrace(System.err);
- }
Крмое того, т.к. нам нужно интегрировать кириллицу - придется сформировать файлы метрики для шрифтов Courier и добавить в файл конфигурации

0 коммент.:
Отправить комментарий