Летающая тарелка не распознает html-объекты - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь использовать html-файл в качестве шаблона для pdf, но Flying Saucer не распознает сущности HTML5 (& trade, & nbsp и т. Д.). Если я заменю их на их шестнадцатеричные значения, то программа будет работать нормально.

Мой код выглядит следующим образом:

  public static InputStream create(String content) throws PDFUtilException {

try (ByteArrayOutputStream baos = new ByteArrayOutputStream();) {
  ITextRenderer iTextRenderer = new ITextRenderer();
  iTextRenderer.getSharedContext()
               .setReplacedElementFactory(new MediaReplacedElementFactory(iTextRenderer.getSharedContext()
                                                                                       .getReplacedElementFactory()));

  iTextRenderer.setDocumentFromString(closeOutTags(content), null);
  iTextRenderer.layout();
  iTextRenderer.createPDF(baos);
  return new ByteArrayInputStream(baos.toByteArray());
} catch (IOException | DocumentException e) {
  throw new PDFUtilException("Unable to create PDF", e);
}

}

Спасибо

Оливер

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Майкл прав, говоря, что Летающая тарелка нуждается в правильно сформированном XML, но если вашей единственной проблемой являются предопределенные сущности HTML (которые не являются частью XML), то вы можете объявить их самостоятельно в начале вашего документа следующим образом:

<!DOCTYPE html [
  <!ENTITY % htmlentities SYSTEM "https://www.w3.org/2003/entities/2007/htmlmathml-f.ent">
  %htmlentities;
]>
<!-- your XHTML text following here -->

Это извлекает объявления сущностей из их официального URL-адреса в сущность параметра htmlentities, а затем ссылается (например, "исполняет") на извлекаемые объявления.Если вам нужны только trade и nbsp, или если Flying Saucer не позволит вам получить доступ к URL-адресам из сети, вы можете объявить их также вручную:

<!DOCTYPE html [
  <!ENTITY trade "&#x02122;">
  <!ENTITY nbsp "&#x000A0;">
]>
<!-- your XHTML text following here -->

Теперь, если у вас действительно естьправильный файл HTML (не XHTML), тогда вы не сможете напрямую использовать с ним процессор XML, поскольку HTML использует функции разметки, не поддерживаемые XML (например, пустые элементы, такие как элемент img, пропущенные тегии атрибуты сокращений).Но вы можете использовать процессор SGML, чтобы сначала преобразовать HTML в XHTML (XML), а затем использовать Flying Saucer в конечном XML-файле (SGML является надмножеством HTML и XML и исходным языком разметки, на котором основаны HTML и XML).Процесс включает в себя использование грамматики HTML DTD, такой как оригинальный W3C HTML4 DTD (с 1999 года) или мой HTML5 DTD на sgmljs.net плюс процессор SGML.Прежде чем вдаваться в подробности, сначала проверьте, решает ли ваша проблема простое добавление объявлений сущностей, как уже описано.

0 голосов
/ 16 мая 2019

Я никогда не слышал о Flying Saucer до сегодняшнего дня, но в первом предложении документации говорится, что «Flying Saucer - это библиотека на чистом Java для рендеринга произвольного правильно сформированного XML (или XHTML)», что довольно убедительно говорит о том, что он ожидает хороших результатов. XML-ввод, а не HTML.

...