2016-03-28 11 views
0

モバイルブラウザでPDFファイルを生成中に次の問題が発生しました。一部のモバイルブラウザでファイルが破損していますが、それはファイル内の画像だけを表示しました。一方、デスクトップブラウザで作業するときにファイルが完全に生成され、ダウンロードされるとファイルコンテンツが完全に表示されました。私はWebアプリケーションの開発においてまったく新しいので、実際の理由はわかりません。モバイルブラウザで作業しているときにpdfファイルを生成中に発生する問題

私が使用するコードを以下に示す:

Document pdfDoc = new Document(PageSize.A4, 10, 10, 10, 10); 
PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc,   Response.OutputStream); 
pdfDoc.Open(); 
string imageUrl = Server.MapPath("~/logo//bcetlogo.jpg"); 
iTextSharp.text.Image ImageLogo = iTextSharp.text.Image.GetInstance(imageUrl); 
ImageLogo.ScaleToFit(80f, 80f); 
pdfDoc.Add(ImageLogo); 
Font f = FontFactory.GetFont("Arial", 15); 
string title = "HelloWorld"; 
Paragraph text1 = new Paragraph(title, f); 
pdfDoc.Add(text1); 
pdfWriter.CloseStream = false; 
pdfWriter.Close(); 
Response.Buffer = true; 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment;filename=Example.PDF"); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Write(pdfDoc); 
Response.End(); 
+0

親愛なる@AbhinandanKumarは、私の答えに何か問題がありましたか?提案されたソリューションを試す機会を得ましたか?それはあなたを助けましたか? –

答えて

1

これは確かに間違っている:

Response.Write(pdfDoc); 

pdfDocオブジェクトタイプDocumentであり、Response.Write()がバイトではなくDocumentオブジェクトを期待します。あなたの主張は、これがうまくいく場合もあります。

あなたはまた、これらの2つの行を削除する必要があります。

pdfWriter.CloseStream = false; 
pdfWriter.Close(); 

はこのラインでそれらを置き換えます

pdfDoc.Close(); 

がここにPDF作成プロセスにおける5つのステップについて詳しく読む: Getting started。どこからコードを取得しましたか?そのドキュメンテーションをもう一度見ないことを約束できますか?常に official web siteを使用してください。

pdfDoc.Close()を実行すると、PDFが完成します。 DocumentをリッスンするすべてのDocListenerインスタンスは閉じられます。あなたのケースでは、pdfDocを聞くDocListenerインスタンスは、内部でのみ使用されているため知らないPdfDocumentインスタンスです。このPdfDocumentインスタンスを閉じることは重要です。なぜなら、close()操作では、多くのコンテンツがフラッシュされるからです。 pdfDocの代わりにpdfWriterを閉じて、この手順をスキップします。

また、コンテンツストリームを開いたままにしておきます。それは悪い考えです。コンテンツストリームを閉じる必要があります。 Response.OutputStreamを直接使用すると、いくつかの既知の問題があります。あなたもこの答えを勉強すればiTextSharp is producing a corrupt PDF with Response

、あなたがこれを参照してくださいよ:

byte[] bytes = memoryStream.ToArray(); 
Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.AddHeader("Content-Disposition", "attachment;filename=ControleDePonto.pdf"); 
Response.Buffer = true; 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.BinaryWrite(bytes); 
Response.End(); 

をあなたはBinaryWrite()方法を必要と見ることができるようにこれは、この質問に対する回答で行われているようMemoryStreamを使用することをお勧めしますその方法では、byte[]が必要です。あなたのコードの他の多くのエラーとは別に、主なエラーはDocumentオブジェクトをWrite()メソッドに渡すことです。

関連する問題