Как объяснялось во введении HTML-учебника , HTMLWorker
устарели много лет назад. Он не предназначен для преобразования полных HTML-страниц. Он не знает, что на странице HTML есть раздел и
; он просто разбирает весь контент. Он предназначен для анализа небольших фрагментов HTML, и вы можете определять стили с помощью класса
StyleSheet
; Настоящий CSS не поддерживался.
Затем появился XML Worker. XML Worker предназначался как универсальная среда для анализа XML. В качестве доказательства концепции мы решили написать некоторые функциональные возможности XHTML для PDF, но мы не поддерживали все теги HTML. Например: формы вообще не поддерживались, и было очень сложно поддерживать CSS, который используется для размещения контента. Формы в HTML очень сильно отличаются от форм в PDF. Также существует несоответствие между архитектурой iText и архитектурой HTML + CSS. Постепенно мы расширили XML Worker, в основном на основе запросов от клиентов, но XML Worker стал монстром со многими щупальцами.
В конце концов, мы решили переписать iText с нуля, с требованиями для преобразования HTML + CSS в разум. Это привело к iText 7 . В дополнение к iText 7 мы создали несколько надстроек, наиболее важным из которых является pdfHTML .
Использование в последней версии iText (iText 7.1.0 + pdfHTML 2.0.0) код для преобразования HTML из вопроса в PDF сводится к этому фрагменту:
public static final String SRC = "src/main/resources/html/sample.html";
public static final String DEST = "target/results/sample.pdf";
public void createPdf(String src, String dest) throws IOException {
HtmlConverter.convertToPdf(new File(src), new File(dest));
}
Результат выглядит следующим образом:
Как вы можете видеть, это в значительной степени результат, которого вы ожидаете. Так как iText 7.1.0 / pdfHTML 2.0.0, шрифтом по умолчанию является Times-Roman. CSS уважается: изображение теперь плавает справа.
Разработчики часто не возражают против перехода на новую версию iText, когда я даю совет обновить до iText 7 / pdfHTML 2. Разрешить мне ответить на три основных аргумента, которые я слышу:
Мне нужно использовать бесплатный iText, а iText 7 не является бесплатным / файл pdfHTML add -on является закрытым источником.
iText 7 выпущен с использованием AGPL, так же как iText 5 и XML Worker. AGPL позволяет бесплатное использование в смысле бесплатно в контексте проектов с открытым исходным кодом. Если вы распространяете закрытый исходный / проприетарный продукт (например, используете iText в контексте SaaS), вы не можете использовать iText бесплатно; в этом случае вам необходимо приобрести коммерческую лицензию. Это уже было верно для iText 5; это все еще верно для iText 7. Что касается версий до iText 5: , вы не должны использовать их вообще . Что касается pdfHTML: первые версии действительно были доступны только в виде программного обеспечения с закрытым исходным кодом. У нас была тяжелая дискуссия в iText Group: с одной стороны, были люди, которые хотели избежать массового злоупотребления со стороны компаний, которые не слушают своих разработчиков, когда те разработчики сообщают, что это открытый источник не является так же как и бесплатно. Разработчики рассказывали нам, что их босс заставил их поступать не так, и что они не смогли убедить своего босса приобрести коммерческую лицензию. С другой стороны, были люди, которые утверждали, что мы не должны наказывать разработчиков за неправильное поведение их боссов. В конце концов, люди в пользу open sourcing pdfHTML, то есть разработчики iText, выиграли этот аргумент. Убедитесь, что они не ошибаются и правильно используют iText: соблюдайте AGPL, если вы используете iText бесплатно ; убедитесь, что ваш босс покупает коммерческую лицензию, если вы используете iText в контексте с закрытым исходным кодом.
Мне нужно поддерживать устаревшую систему, и мне нужно использовать старую версию iText.
Серьезно? Техническое обслуживание также предполагает применение обновлений и переход на новые версии программного обеспечения, которое вы используете. Как вы можете видеть, код, необходимый при использовании iText 7 и pdfHTML, очень прост и менее подвержен ошибкам, чем тот, который нужен ранее. Проект миграции не должен занять слишком много времени.
Я только что начал, и я не знал о iText 7; Я узнал только после того, как закончил свой проект.
Вот почему я отправляю этот вопрос и отвечаю. Подумайте о себе как о программисте eXtreme. Отбросьте весь свой код и начните заново. Вы заметите, что это не так много работы, как вы себе представляли, и вы будете лучше спать, зная, что вы сделали ваш проект надежным, потому что iText 5 постепенно прекращается. Мы по-прежнему предлагаем поддержку для оплаты клиентов, но в конечном итоге мы прекратим поддерживать iText 5 вообще.
Некоторые модули Python, такие как lxml
, имеют требуемые компоненты в C. Они не будут работать в Jython.
Большинство пакетов Python будут работать нормально, и вы можете установить их, используя те же инструменты, что и вы используете в CPython. Это , описанное в Приложении A книги Jython :
Чтобы получить setuptools, загрузите ez_setup.py из http://peak.telecommunity.com/dist /ez_setup.py. Затем перейдите в каталог, в который вы покинули загруженный файл, и выполните:
$ jython ez_setup.py
[Сценарий easy_install] будет установлен в каталог bin установки Jython (
blockquote>/home/lsoto/jython2.5.0/bin
в приведенном выше примере) , Если вы часто работаете с Jython, рекомендуется добавить этот каталог к переменной среды PATH, поэтому вам не нужно вводить весь путь каждый раз, когда вы хотите использовать easy_install или другие скрипты, установленные в этом каталоге.Проверяя это самостоятельно, после установки setuptools в Jython, pip установлен правильно:
$ sudo /usr/bin/jython2.5.2b1/bin/easy_install pip Searching for pip [...] Installing pip-2.5 script to /usr/bin/jython2.5.2b1/bin Installing pip script to /usr/bin/jython2.5.2b1/bin Installed /usr/bin/jython2.5.2b1/Lib/site-packages/pip-1.0.2-py2.5.egg Processing dependencies for pip Finished processing dependencies for pip $ sudo /usr/bin/jython2.5.2b1/bin/pip install bottle Downloading/unpacking bottle Downloading bottle-0.9.6.tar.gz (45Kb): 45Kb downloaded Running setup.py egg_info for package bottle Installing collected packages: bottle Running setup.py install for bottle Successfully installed bottle Cleaning up... $ jython Jython 2.5.2b1 (Release_2_5_2beta1:7075, Jun 28 2010, 07:44:20) [Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_26 Type "help", "copyright", "credits" or "license" for more information. >>> import bottle >>> bottle <module 'bottle' from '/usr/bin/jython2.5.2b1/Lib/site-packages/bottle$py.class'> >>>
В соответствии с v2.7b4, дистрибутив Jython включает модуль обеспечения памяти , который упрощает установку пунктов pip и setuptools:
jython -m ensurepip
Остерегайтесь sys.platform == 'win32' issue , который поможет вам использовать пакеты PyPI, которые полагаются на этот метод для определения платформы хоста.
Являюсь Jython, хотя у вас есть возможности библиотек Java, а не ограничение того, что вы не можете установить несколько библиотек C. python.
Например, вам лучше использовать Jsoup вместо Beautiful soup или пойти на полное решение, например Jtidy .
Используйте Jaxp вместо lxml.
Также другой вариант, который подходит для ваших повторений: NekoHTML
У меня установлены как CPython, так и Jython. Вот что я делаю, если я хочу установить пакет в Jython через pip.
jython -m pip install <package_name>
Например, для установки рамки робота в jython (поскольку я хочу писать библиотеки ключевых слов в Java), я сделал
jython -m pip install robotframework