コードスニペットは、質問フライングソーサー/ iTextのPDFファイル
の一番下にある私は正常にサーブレットとフライングソーサーを使用して、クライアントのブラウザでPDFをレンダリングすることができています/ iText。しかし、私はスタイルシートをPDFレンダリングに含める方法を理解できません。
私は次のことを試してみたし、どれもこれまで働いていない:
- のgetServletContext()getRealPath( "/ PDFservlet.css")とWebのルートディレクトリ で "PDFservlet.css" を入れています。
buf.append("<head><link rel='stylesheet' type='text/css' href='PDFservlet.css' /></head>")
を入れ、webルートディレクトリに "PDFservlet.css"を入れてください。サーブレットクラスファイルがあり、 "classes"ディレクトリの直下にあるディレクトリhref='\PDFservlet.css'
を除いて上記と同じですし、 "PDFservlet.css"私のウェブのルートディレクトリの下に
ここで何を試してみるべきか、PDFがクライアントのブラウザでレンダリングされたときにこのCSSシートを認識させる方法がわかりません。
ここで間違っていることを教えていただけますか?
また、私はjava.io.IOException: Stream closed
を取得しています。なぜなら、PDFがレンダリングされた後、どこから来たのかわからないからです。
これはローカルで実行中のWebLogic Server 10.3.3をテストしています。代替として私のために働いている文字列の中に、サーバー側のコードのCSSファイルの内容を読み込む
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws javax.servlet.ServletException, java.io.IOException
{
resp.setContentType("application/pdf");
StringBuffer buf = new StringBuffer();
buf.append("<html>");
// put in some style
buf.append("<head><link rel='stylesheet' type='text/css' href='PDFservlet.css' /></head>");
// generate the rest of the HTML...
buf.append("<body>");
buf.append(" <div id='container'>");
buf.append(" <div id='check_num'>1000</div>");
buf.append(" <div id='address'><b>Estate Of JAMES SMITH</b><br />35 Addison Avenue<br />New York, NY 00000<br />(123)456-7890</div>");
buf.append(" <div id='date'><i>Date</i> <u>02/08/2012</u></div>");
buf.append(" <div id='void_message'><b>VOID 180 DAYS FROM CHECK DATE</b></div>");
buf.append(" <div id='pay_line_container'>");
buf.append(" <div id='pay_line_message'><i>Pay To The Order Of:</i></div>");
buf.append(" <div id='pay_line'></div>");
buf.append(" <div id='pay_line_pay_to'>Richard Richards XXIII</div>");
buf.append(" <div id='pay_line_amount'>$ 5.00</div>");
buf.append(" </div>");
buf.append(" <div id='pay_line2_container'>");
buf.append(" <div id='pay_line2'></div>");
buf.append(" <div id='pay_line2_amount_description'>Five and 00/100</div>");
buf.append(" <div id='pay_line2_dollars'>DOLLARS</div>");
buf.append(" </div>");
buf.append(" <div id='void_stamp'><b>VOID</b></div>");
buf.append(" <div id='for_line'><i>For:</i> <u>test</u></div>");
buf.append(" <div id='bank_info'><b>TD BANKNORTH</b><br />MAINE</div>");
buf.append(" <div id='signature_line'></div>");
buf.append(" <div id='bank_numbers'><b>c1000c a123456789a 987654321c</b></div>");
buf.append(" </div>");
buf.append("</body>");
buf.append("</html>");
System.out.println(buf.toString());
// parse our markup into an xml Document
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(new StringBufferInputStream(buf.toString()));
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(doc, null);
renderer.layout();
OutputStream os = resp.getOutputStream();
renderer.createPDF(os);
os.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
編集I
は(readFile
方法はでジョンスキートの記事をベースにしていHow do I create a Java string from the contents of a file?):
buf.append("<head><style>");
buf.append(readFile(getServletContext().getRealPath("/PDFservlet.css"), "UTF-8"));
buf.append("</style></head>");
これは、代替としてOKのアプローチのように見えるのか?
編集II
私はあなたのいくつかは、すべて一度しばらくの間でで見てみること望んでいるiTextのためのチャットルームを作成しました。 iText/flying-saucerにはいくつかの問題がありましたが、あなたの専門家の助けを借りて解決するのが簡単かもしれないと思います。チャンスがあり、iTextの問題に役立つ可能性のある資料を投稿してください。http://chat.stackoverflow.com/rooms/8945/itext
"2番目のパラメータはドキュメントのURLです" - 私のドキュメントはOutputStreamでレンダリングされるので、これが何であるか分かりません。今は、サーブレットからiframeにOutputStreamが返されています。 –
Flying Saucerには、相対URLを特定するためのベースURLとして何を使用するかを伝えています。 (私はこの情報で私の答えを更新しました) – Adam