За последние 24 часа нас посетили 21683 программиста и 1029 роботов. Сейчас ищут 765 программистов ...

HTML2PDF

Тема в разделе "Решения, алгоритмы", создана пользователем Psih, 5 июл 2009.

  1. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Есть зверская мысль сделать конвертатор из HTML & CSS в PDF. Работал с такой штукой в живую, я скажу это просто ахренительная штуковина. К сожалению позаимствовать не мог, т.к. собственность компании.

    Работало оно так - составляем полный HTML документ с любой комбинацией CSS - всё это парсится (внешние стили, inline css), формируется структура документа, обсчитывается позиционирование элементов по W3.org спецификации.

    Это подразумевает следующие части приложения:
    1). HTML и CSS парсеры
    2). Генератор PDF на основе tcpdf или Zend_PDF.

    Цель? Самообразование, шевеление мозгами, опыт. Прославимся в конце концов на хабре :D

    Что нужно учесть сразу (или точнее говоря - чем болела та тулза).
    1). Memory usage. Из-за того, что писалось оно под PHP4 ещё и классы не отчищали данные, у меня получалось что каждый PDF долкумент жрал по 4.5 дополнительных мега памяти, что в итоге через 20-30 документов, генерируемых последовательно упирало меня в memory limit.
    2). Процесс это не быстрый, так что стоит заложить зарание возможность генерировать много документов из одного HTML подстановкой данных в нужные места, что бы не парсить HTML каждый раз.

    Тем, кому интересно - отпишитесь. Через каких 3-4 дня можно будет связаться со всеми и обсудить что да как, и стоит ли игра свеч вообще.
     
  2. стандартный вопрос - чем будет лучше существующих аналогов? :)
     
  3. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    флоппик
    Ответ таков: найди мне хоть один HTML2PDF на PHP. Я искал в гугле когда надо было. Часа 2. Не нашел ни одного. Всё или какие-то варианты через промежуточные форматы, либо та же TCPDF, в которой тебе в ручную надо рисовать грёбанный PDF - сваять шаблон на HTML куда быстрее :)

    В PDF при генерации будут и картинки автоматом вставлятся, через самый обычный <img> тег. Т.е. мысль в том, что бы полностью перевести HTML документ в PDF (исключение разве что <object>, который в PDF бессмыслены). Выглядеть в браузере будет немного не так как в документе, особенно в IE, но очень близко к тому, что в HTML в FireFox получается. Мне пришлось буквально чуть-чуть допилить после FF что бы в PDF получилось тютелька в тютельку.

    В чем круть идеи: опять же, в скорости выполнения задания. Не надо считать сколько pt надо отсчитать от верха, что бы правильно разместить элемент - парсер читает CSS и расчитывает позиции элементов в потоке.
     
  4. Ах, да, я кстати, очень даже за написание, вообще-то. Просто для начала пытаюсь внести долю здоровой и не очень, критики.
     
  5. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    С ходу что вижу:

    • * Не полная поддержка CSS - margin, padding - отсутствуют
      * PHP4 всё ещё саппортит, следовательно не очень хорошо работает с памятью.
      * Не юзает встроенную в PHP поддержку PDF (что может быть куда быстрее чем pure PHP implementation)
      * Код - каша. Я прелагаю структурированный набор классов сделать.
    Я знаю, задача впринципе может и изобретение велосипеда, однако я не вижу достойных продуктов, которые были современными и достаточно продвинутыми.

    В конце концов можно продавать продукт если очень круто сделаем :)))
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ээ, ты хочешь написать полноценный парсер HTML на php?
    Ты маньяк!

    а нельзя как-нибудь дёргать какой-нить броузер и скиншотить результат?
     
  7. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Psih, велосипеды есть двигаталем прогресса, потому дерзай. Стоит попробовать. Но..
    Что требуется от нас? Нужна критика, моральная поддержка, существенная помощь в написании 80% кода, или ты написал на форуме для того, чтобы мы тебя отговорили?
     
  8. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    я так понимаю, цель сделать не псевдо-пдф документ, а основательно подойти и сделать документ именно в разметке пдф.

    Раз уж такой серьезный подход, то стоит действительно сделать какой то общий интерфейс, и независимый генератор - чтобы работа была расширяемой и легко потом можно было переквалифицировать на конвертирование и в другие форматы.

    PS. Я уже даже знаю, где это можно будет применить. Главное - будет ли он отображать background-image в css ?

    и под какой лицензией собираешься выпускать в свет?
     
  9. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Очень интересная тема, я бы взял участие, но времени нету вообще...
     
  10. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    TheShock
    Да, background-image тоже должен показывать. Т.е. идея в том, что бы полностью повторить HTML документ со всеми фишками CSS (ну ок, почти всеми - некоторые вещи в PDF просто не могут быть переведены).

    Mr.M.I.T.
    HTML парсеры и так написаны людьми, так что инфу надыбать и улучшить имплементацию - не сложно. Сложнее сделать все расчёты и правильно определить позиции :)

    2all
    От вас нужно полноценное участие, т.к. такой проект мне одному не по силам, учитывая кол-во свободного времени. Скажем так, у меня есть идея по имплементации, как построить это внутренее, как оно должно работать, примерный API + я видел такую тулзу в действии. От вас - равноправное участие в проекте, т.е. написание самого кода, патчи, обсуждение реализаций и структуры приложения.
     
  11. Psih, count me in. =)
    Обсудим?
     
  12. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    флоппик
    Давай подождём кто ещё подключится и тогда организуем всё действо, ок? :) Или у тебя другие предложения есть? :)
     
  13. Нет, чем больше народу, тем больше шансов, что получится что то толковое.

    Меня искушает возможность все эти классы сделать малосвязными, и это пригодится не только для пдф, ящитаю. Опять таки, можно аккуратненький интерфейсик сделаьт, и генерить пдф или встроенными, или пхпшными альтернативами.. это тоже было бы вкусно.
     
  14. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    флоппик
    У меня идея такова - есть два компонента - HTML и CSS парсер и PDF генератор. HTML & CSS парсер генерирует структуру, на подобие дерева или структуру вложенных классов, которые потом берёт PDF генератор и по своему обрабатывает. Таким образом потом можно тогда прикрутить какую угодно генерацию вместо PDF - хоть картинки рисуй :)

    Да, и интерфейс тоже гут - если нету php_pdf, то юзать скажем TCPDF :)
     
  15. дадада, я тоже именно об этом.
     
  16. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    флоппик
    Так как-бы логично делать, иначе без разделения этих друх частей может получится полная бредятина, на подобие того линка, что ты выше давал. Каша там ещё та я бы сказал. Заодно можно ещё и сам HTML парсер заюзать будет для разобра данных от всяких WYSIWYG - потоковый HTML парсер это то, чего я тоже найти никак не мог. Вечно BBcode делаются через костыли :)
     
  17. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Какие причины выбора PHP кроме "самообразования"?
     
  18. kostyl

    kostyl Guest

    а можно и я что-нибудь попробую - в целях самообразования и, если получиться, вы потом где-нибудь внизу в углу напишите - Ах, забыли сказать - так есть такая штучка простенькая, так вот ее сделал тот-то...
     
  19. По какой причине твой блог написан на PHP ? =)
     
  20. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Мой блог - веб-приложение, написанный на языке, предназначенном для веб-приложений.
    Обработка же HTML+CSS по стандартам есть в исходниках мозиллы, писанных на си, которые можно было бы использовать.

     
  21. Ну так и нас, как бы, интересует широкодоступное использование для веба.
    Опять таки, никто не говорит про исключительно решение на PHP - каждый из компонентов может быть заменен, с написанием обертки, соответствующей интерфейсу.
     
  22. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Я думаю причина в том, что PHP здесь большая часть людей знает лучше других языков.

    флоппик, Psih, а Вам быдлокодер в команду нужен? Я бы взялся.
     
  23. akrinel, я думаю, мы его в любом случае на гуглокод засунем, желающие внесут посильный вклад, да. Но психу и карты в руки =)
     
  24. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    vasa_c
    Потому что генерировать из HTML PDF документы в Веб приложении удобнее на том-же языке, что и приложение. Не всегда это можно сделать на C++. Хотя как вариант можно сделать для проекта ещё и C++ вариант - вопрос только в том, кто будет это делать? Я с С++ не знаком, вообще.
    А когда всё написано, перенести на С++ знающему человеку куда легче, чем писать самому с 0. Прототипировать на PHP самое оно :)