2016-05-24 11 views
0

私はWEBコンテキストアプリケーションでiTextPdfを使用する際に問題があります。iTextPDFで編集したPDFがWebサーブレットコンテキストで壊れているのはなぜですか?

実行時に編集したPDFをダウンロードするWebサーブレットがあります。

私はNON-WEBコンテキストアプリケーションでPDFを作成し、私のメソッドを呼び出す場合は、PDFは完全にを作成し、それは問題なく開きます。

しかしWEB-コンテキストアプリケーションに、ファイルが作成されますが、私は私のテストページからダウンロードを行うとき、それがを破損しています:私はダウンロードしたファイルを開いたとき、それは画像なしだとに関するエラーメッセージが表示されます見つからないフォント。私は「クリーン」ファイルとテキストエディタで「壊れた」ファイルを開くと

、彼らは同じ行数を持っていますが、実際には内容が異なる表示されます。

私は問題がWebレスポンスやそれに類するものでコンテンツタイプのレンダリングであると思われます。

私は、このマニュアルに従っている: http://developers.itextpdf.com/examples/itext-action-second-edition/chapter-9

これは、Spring MVCのコントローラの実装です:

@RequestMapping(path = "/downloadPDF", method = RequestMethod.GET) 
public void downloadPDF(HttpServletResponse response){ 
    try{ 
     response.setContentType("application/pdf;charset=UTF-8");  
     ByteArrayOutputStream baos = myPDFHandler.getPdf('filetest.pdf'); 
     OutputStream outputStream = response.getOutputStream(); 
     baos.writeTo(outputStream); 
     outputStream.flush(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

これらはレスポンスヘッダです:

Response Headers 

view source 
Cache-Control:no-store 
Cache-Control:no-cache 
Content-Type:application/pdf;charset=UTF-8 
Date:Tue, 24 May 2016 10:20:56 GMT 
Expires:Thu, 01 Jan 1970 00:00:00 GMT 
Pragma:no-cache 
Server:Apache-Coyote/1.1 
Strict-Transport-Security:max-age=31536000 ; includeSubDomains 
Transfer-Encoding:chunked 
X-Content-Type-Options:nosniff 
X-Frame-Options:DENY 
X-XSS-Protection:1; mode=block 

問題が "ではありませんmyPDFHandler.getPdf "メソッドを使用します。これは、NON-WEBコンテキストでは完全に機能するためです。

おかげさまで

+1

ファイルが 'UTF-8'でエンコードされていることを確認してください。 –

+0

私はcharset = UTF-8を試してみたが、結果は同じだった。 NON-WEBの文脈で試してみると、それを指定する必要はありません... –

+0

'charset = UTF-8'はそれにもかかわらず間違っています。それは、ブラウザがそれを受け取ると一度、そして一度サーバーに保存されると、PDFを共有できますか? – mkl

答えて

0

解決策が見つかりました。

問題は、から@ResponseBody byte[]に変更した@Controllerの戻り値の型です。

「charset = UTF-8」も削除し、ヘッダー「content-disposition」を追加しました。

@RequestMapping(path = "/downloadPDF", method = RequestMethod.GET) 
public @ResponseBody byte[] downloadPDF(HttpServletResponse response){ 
    try{ 
     response.setContentType("application/pdf"); 
     response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=somefile.pdf");  
     ByteArrayOutputStream baos = myPDFHandler.getPdf('filetest.pdf'); 
     return baos.toByteArray(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
関連する問題