有没有办法使用 Flying Saucer/iText 设置不同的页面样式?我需要将前几页设为横向,然后在某个页面切换到纵向并退出。
有任何想法吗?
没关系,找到答案了。对于任何感兴趣的人,这就是您的操作方式:
@page land { size:landscape; }
@page port { size:portrait; }
.landscapePage { page:land; }
.portraitPage { page:port; }
瞧!
对于仍然坚持 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 土地声明包含宽度。我需要的是直接在应用了相关类的 div 上设置宽度,所以声明更像
.landscapePage { page:land; width: 29.7cm; }
请注意,宽度应考虑通过 @page 声明块应用的任何边距或填充。
您可以在运行时动态处理页面大小。请按照以下步骤
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);