Всем привет, сегодня хочу рассказать немного про библиотеку iTextSharp и PDF-Forms.
Pdf-форма — обыкновенная pdf страница, содержащая в себе классические компоненты ввода данных: текстовые поля, чекбоксы, радиобаттоны, списки, файлаплоадеры и поля ввода паролей.
Все как у всех, только на странице в PDF формате, да, именно в тех самых страницах, которые акробат-ридером читаются.
Для меня это было поначалу дико, типа как же так, я делаю сайт, а мне тут вручают договора, и говорят, что их нужно делать в формате PDF, не только как результат работы, но и как формы для ввода данных! Типа так удобнее пользоватеям понять, что и где находится.
Если честно, то убил я на поиски решения пару дней.
Первым делом нашел хорошую и удобную в работе библиотечку для работы с PDFбиблиотечку iTextSharp (пишу на C#, но думаю можно заюзать и для VB, c++, а также видел сборку для Java). Эта библиотека просто находка, до этого предполагалось использованиеAspose, но он платен, и ему подобные библиотеки тоже не бесплатны. Таким образом, потратив пол дня, я наткнул на iTextSharp, весит чуть боле 3-х метров, бесплатна, мануала полно, и удобна в работе.
Что же, создавать PDF я научился, что же делать с формами? Еще пол дня убил на поиск приложений, по созданию PDF-форм. AcrobatReader Pro не подходит, слишком весомый, и не бесплатен. Нашел FoxitReader, прикольная весч, но как оказалось она не может отсылать данные формы в виде XML, а в виде HTML, не больно хотелось, думаю что уж слишком сильно от риадеров различаться будет код. В виде FDF –фоксит русские коряво отсылал, да и забил я на него, хотя достаточно компактный реадер.
Было много вего, но оставился на Nitro Pdf Professional, прога платная, но есть тестовый период, да и отдать за нее бабло не жалко. Но пока еще тестирую J.
Итак, поставил я себе последнюю прогу, и создал в ворде такую таблу:
| |
Фамилия | |
Имя | |
Отчество |
Конвертнул в PDF, открыл в Nitro Pdf Professional, и добавил 3 поля:

Обратите внимание, что добавляю только элементы для ввода информации, кнопки «Отправить» или «Сохранить» не имеется, их я добавлю во время отдачи пользователю, ибо если нужно будет менять адрес сайта на сабмиттбатоне (а это пришлось бы делать при каждом выкладывании шаблона), то было бы слишком геморно.
Чтож, теперь можно проступать к работе.
Все поля поступают в виде:
Их мы сохранять будем в базу, а можно и вовсе не сохранять нигде (у нас же есть готовая PDf!), но что если на сайте пользователя будут в таком удобном виде вносить свои данные, и они будут в виде PDF храниться на сервере, то у нас места не хватит и ппц сайту. Или если у нас несколько клиентских приложения, которые будут эти данные использовать, а формы для ввода данных очень уж сложные, то PDF Forms это реально выхо из положения, минимум кода, максимум прекрасного, инет у многих сейчас дешевый, а то и халявный, можно юзать и PDF.
Для общения с базой я решил заюзать Linq To SQL (или так пишется LinqToSql, уж не придерайтесь J)
Код совсем копактный становится, нам сложные выборки не нужны, потому и линк генерить ужастные запросы не будет.
Проект прилагаю, посмотрите на примере, кот в блог кидать не буду, скачайте, не много весит.
Описания файлов:
Default.aspx – тут есть ссылка на файл, который выводит PDF с формой
testPDF.aspx – выводит файл PDF Form и заполняет поля форы из базы, если они там присутствовали
PdfHandler.ashx – принимает POST запрос из PDF формы (запрос я посялаю в виде XML)
DbData – прокси классы для работы с базой
itextsharp.dll – библиотека для работы с PDF документами
папка PdfForms – тут лежит форма
папка PDF – сюда кладуться сгенеринные PDf-ки (на самом деле, их оттуда нужно удалять, но для наглядности оставил)
не забудьте в web.config connectionstring поменять
база как всегда, сами знаете где
кста, у меня стоит MsSql 2008, на случай если у вас возникнут траблы с присоединением базы, прилагаю скрипт, сгенерированный для Sql 2005.
<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve" >
<fields >
<field name="Family" ><value >Петров</value ></field >
<field name="MiddleName" ><value >Сергеевич</value >
</field ><field name="Name" ><value >Иван</value ></field >
<field name="submit" />
</fields >
<ids original="322283908D0996D9DC1BF1742F125C16 modified="BD68D6FF5B1E10580F22B4C2AB00FFCC" />
<f href="http://localhost:1176/testPDF.aspx?requestId=1" />
</xfdf >
скачать проект можно тут, а скрипт для создания таблицы в базе тут
писал не подробно, думаю в коде разобраться будет несложно, всего две функции!
но если будут вопросы, то прошу в комменты :)