Pretty Print XML, возвращающий ValueError [дубликат]

Почему ваш код не работает

Как объяснялось во введении 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 вообще.

17
задан Prometheus 5 April 2013 в 10:37
поделиться

2 ответа

Вам придется закодировать его, а затем принудительно ввести в синтаксис одну и ту же кодировку:

from lxml import etree
from lxml.etree import fromstring

if request.POST:
    xml = request.POST['xml'].encode('utf-8')
    parser = etree.XMLParser(ns_clean=True, recover=True, encoding='utf-8')
    h = fromstring(xml, parser=parser)

    return HttpResponse(h.cssselect('delivery_reciept status').text_content())
30
ответ дан Pavel Anossov 25 August 2018 в 13:05
поделиться

Для меня работало следующее решение из kernc :

>>> from lxml import etree
>>> xml = u'<?xml version="1.0" encoding="utf-8" ?><foo><bar/></foo>'
>>> xml = bytes(bytearray(xml, encoding='utf-8'))  # ADDENDUM OF THIS LINE (when unicode means utf-8, e.g. on Linux)
>>> etree.XML(xml)
<Element html at 0x5b44c90>
9
ответ дан Aykut Kllic 25 August 2018 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: