Все мы, программисты, хоть раз сталкивались с задачей, где нужно сформировать отчёт для своего приложения. Я занимаюсь подобными заданиями постоянно, причем генерирую отчёты в формате PDF.
Раньше худо-бедно это реализовывалось путём использования сторонних библиотек, давно потерявших актуальность (да и работоспособность, учитывая, что они были написаны под .NET 1.1). В один прекрасный момент, после очередного апгрейда серверов/windows/фреймворка (нужное подчеркнуть), всё это накрылось медным тазом. Пришлось искать решение, как быстро для всех проектов можно эту ситуацию исправить. Нам, конечно, было понятно, что гнать нужно эту стороннюю библиотеку вон из проектов. Мало того, что она работоспособна только в 32-битной среде и под управлением .NET.1.1, так она ещё и требует установки J# redistributive package.
Теперь самое интересное: как, используя эту медленно, но верно, умирающую библиотеку, мы раньше создавали отчёт в формате PDF:
1) Создавали XML с данными.
2) Писали XSL-трансформу («иксэселтушка» в простонародье), которая бы описывала, как эти данные, красиво и с картинками, должны быть расположены в PDF-файле.
3) «Скармливали» библиотеке XML и XSLT, и она нам радостно «выплёвывала» PDF-файл, как результат.
Сейчас же встала задача избавиться от библиотеки из пункта № 3. Оказалось, что никакого ее апгрейда под более поздние версии .NET и, уж тем более, под кроссплатформенные решения — нет. Можно было использовать широко известную библиотеку iTextSharp, которая позволяет создавать PDF-файлы, но она совсем не умеет этого делать, используя XSL. Переписывание сорока проектов из-за этого энтузиазма не добавляло. К тому же, такое решение оставило бы нас в рамках .NET, что «не айс».
Ну что ж, дело было к вечеру, делать было нечего. Пришлось разбираться, а что же эта старая волшебная библиотечка делала: как она генерировала PDF, используя только данные (XML) и разметку (XSLT), и почему ей нужен был J# redistributive package или, по-русски говоря, Java. Как всегда всё оказалось до банального просто: эта библиотека была адаптером для Apache FOP, а значит — это Java. Именно для этого и требовался j# redist, а ещё это значит что:
1) Эта технология в свободном распространении — это плюс.
2) Кроссплатформенность — это плюс (поправьте меня, если я не прав).
3) Я терпеть не могу Java — это минус.
Apache у нас на сервере стоит, потому как наши приложения сложные и умудряются одновременно работать с двумя веб-серверами — и IIS, и Apache. Библиотеку под .NET было решено отправить на заслуженную пенсию и, переборов свою лень и нелюбовь к Java, написать на ней сервлет, который бы её заменил. В результате я сделал простой сервлет, который на входе всё так же ждёт XML и XSLT, а на выходе всё так же радостно выплёвывает PDF-файл. (Да-да! С картинками!)
Всё, что теперь делают мои приложения — отправляют данные (XML) и разметку (XSLT) на сервлет (например, http://localhost:8080/pdfgen/makePDF) и получают на выходе готовый PDF.
Профит:
1) Минимальное изменение в коде всех проектов, так как вместо вызова метода библиотечки мы просто постим данные на URL, указанный в web.config и забираем PDF.
2) Из всех проектов исключён большой и не нужный «атавизм» в виде J# redistributive package и привязка к .NET 1.1.
3) Универсальный метод генерации PDF не зависит от среды разработки/исполнения. Главное, чтобы был доступ к сервлету.
Конечно же, код можно «пощупать» в нашем репозитории.