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 land宣言に幅が含まれていても、横向きのページのコンテンツは縦向きのページと同じ幅しかありません。私が必要としたのは、関連するクラスが適用されている 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);