Плагин рендеринга Grails не отображает изображения при развертывании - PullRequest
3 голосов
/ 21 ноября 2011

Я создаю PDF с помощью плагина рендеринга Grails. В процессе разработки я включаю изображения с помощью тега src в изображение на сервере. Он отлично работает, но не больше, когда приложение развернуто. Изображения просто исчезают.

Я выполняю рендеринг через шаблон, поэтому, когда я вызываю этот шаблон в gsp, это нормально (т.е. я вижу html-версию pdf с изображениями), но при вызове в моем контроллере с использованием renderPdf, без изображений.

Опять только в развернутом приложении (война), но не в разработке.

Есть подсказки?

РЕДАКТИРОВАТЬ: Под популярным запросом здесь код:

Файл _pdf.gsp может быть простым, как

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
  <head/>
  <body>
    <img src="path/to/image.jpg"/>
  </body>
</html>

соответствующая часть контроллера

def pdf={
     renderPdf(template: "/file/pdf", filename: "myfile.pdf")
}

Ответы [ 3 ]

7 голосов
/ 20 декабря 2011

Я смотрел на это в течение двух разочаровывающих дней и перепробовал много вещей.Мой совет, и это совет, который они дают в документации: придерживаться встроенных изображений .Под этим я подразумеваю определение изображения в его байтовой форме.Вы не пожалеете об этом, и вы будете уверены, что плагин рендеринга будет хорошо играть с другими плагинами, такими как пользовательский интерфейс и ресурсы.

Сначала создайте объект файла следующим образом:

def paid = new File(ApplicationHolder.application.parentContext.servletContext.getRealPath("/images/paid.jpg"))

, затем передайте байты файла в модель

renderPdf(template:invoiceTemplate, model:[paidBytes:paid.bytes])

Теперь в вашем шаблоне pdf используйте следующееtag:

<rendering:inlineJpeg bytes="${paidBytes}" />

Если у вас нет проблем с зависимостями, то вам следует установить.Если вы сталкиваетесь с проблемами зависимости, как я и отмечал ЗДЕСЬ , то посмотрите версию iText, которую вы используете.

3 голосов
/ 22 ноября 2011

Это, безусловно, связано с тем, что указано в документации для плагина рендеринга:

"Все ссылки на ресурсы (например, изображения, CSS) должны быть доступны приложению. Это связано сдоступ к ресурсам осуществляется приложением, а не браузером. В зависимости от конфигурации вашей сети в процессе работы это может потребовать особого внимания. "

Возможный совет: если вы используете Linux на своем сервере, добавьте имя домена вашего сайта/ etc / hosts, поэтому он разрешается до 127.0.0.1.Если другие ОС делают соответственно.

0 голосов
/ 07 января 2015

Как говорит wwwclaes, речь идет о ресурсах, доступных приложению .

Но если вы используете конвейер активов, вы можете сделать его немного проще.

Контроллер:

def assetResourceLocator ... def myAction() { ... renderPdf(template:invoiceTemplate, model:[rl:assetResourceLocator]) } ...

Тогда в вашем шаблоне:

<rendering:inlineJpeg bytes="${rl?.findAssetForURI('paid.jpg').byteArray}" />

Теперь вы можете использовать rl для любого количества изображений в вашем шаблоне, не запутывая модель в контроллере элементами презентации.

...