适用于飞碟/ iText的pdf风景和肖像

时间:2009-03-05 08:28:35

标签: pdf itext

有没有办法用Flying Saucer / iText设置不同的页面样式?我需要在横向显示前几页,然后在某个页面切换到肖像,然后输出。

有什么想法吗?

3 个答案:

答案 0 :(得分:22)

没关系,找到了答案。对于任何感兴趣的人,你就是这样做的:

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

瞧!

答案 1 :(得分:13)

对于仍然坚持Derek提到的问题的人,我发现我需要在切换其布局的元素上明确设置宽度。所以使用示例div

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

它将正确格式化纵向页面,后跟横向页面,但横向页面中的内容将仅与纵向页面一样宽,即使 @page land 声明包含宽度。我需要的是直接在应用了相关类的div上设置宽度,因此声明更像是

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

请注意,宽度应考虑通过@page声明块应用的任何边距或填充。

答案 2 :(得分:1)

您可以在运行时动态处理页面大小。请按照以下步骤进行操作

  1. 为pageType param
  2. 添加页面类型的额外参数,例如landscape或portrait
  3. 在服务器端生成html时,在样式标记中添加以下代码,例如
  4. 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);