И пейзаж, и портрет в формате PDF с помощью Flying Saucer/iText.

StackOverflow https://stackoverflow.com/questions/613971

  •  03-07-2019
  •  | 
  •  

Вопрос

Есть ли способ установить разные стили страницы с помощью Flying Saucer/iText?Мне нужно, чтобы первые пару страниц были в альбомной ориентации, затем на определенной странице переключились на книжную ориентацию и вышли из нее.

Есть идеи?

Это было полезно?

Решение

Ничего, нашел ответ.Кому интересно, вот как это сделать:

@page land { size:landscape; }
@page port { size:portrait; }
.landscapePage { page:land; }
.portraitPage { page:port; }

вуаля!

Другие советы

Для тех, кто все еще сталкивается с проблемой, упомянутой Дереком, я обнаружил, что мне нужно явно установить ширину элемента, который меняет макет.Итак, в примере div

<div class="portraitPage">
    <p>Some page content in portrait</p>
</div>
<div class="landscapePage">
    <p>Some page content in landscape</p>
</div>

он правильно отформатирует страницу с книжной ориентацией, за которой следует страница с альбомной ориентацией, но содержимое на странице с альбомной ориентацией будет иметь такую ​​же ширину, как и страница с книжной ориентацией, даже если @page земля объявление содержит ширину.Мне нужно было установить ширину непосредственно в элементе div, к которому применен соответствующий класс, поэтому объявление больше похоже на

.landscapePage { page:land; width: 29.7cm; }

Однако будьте осторожны: ширина должна учитывать любые поля или отступы, применяемые через блок объявлений @page.

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

<Ол>
  • Добавить дополнительный параметр для типа страницы, например, ландшафт или портрет в параметре pageType
  • Добавьте следующий код в тег стиля, когда вы создаете HTML-код на стороне сервера, например,
  • FileOutputStream fos = new FileOutputStream(file);
    ITextRenderer renderer = new ITextRenderer();
    StringBuilder htmls = new StringBuilder();
    htmls.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
    htmls.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">");
    htmls.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
    htmls.append("<head><style type=\"text/css\">");
    htmls.append("@page{ size: "+request.getParameter("pageType")}");
    htmls.append("</style></head>");
    htmls.append("<body><div>dynamic pdf data</div></body></html>");
    renderer.getFontResolver().addFont("C:\\Windows\\Fonts\\Calibri.ttf","UTF-8",BaseFont.NOT_EMBEDDED);
    renderer.setDocumentFromString(htmls.toString());
    renderer.layout();
    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + ".pdf\"");
    renderer.createPDF(outputStream);
    renderer.createPDF(fos);
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top