none
PDFについて RRS feed

  • 質問

  • こんにちは。

    この間この質問と同じ様な質問をしたのですが、自分でいろいろ調べてみてもわからなかったので

    もう一度質問することに致しました。

     

    ではさっそく質問させて頂きたいと思います。

     

    帳票を印刷する機能を追加するため、PDFをストリームして出力し、ブラウザに表示したいのですが、うまく動いてくれません。

     

     Response.AppendHeader("Content-Disposition", "attachment;filename=test.pdf")

     

     を使って『ファイルのダウンロード』ダイアログを表示し『開く』を選択しPDFを表示させようとしていました。

    しかし、PDFを表示する時にAdobe Readerでエラーが出てしまいます。

    エラーの内容は以下の通りです↓↓

    AdobeReaderで「Test[1].pdf」を開けませんでした。

    ファイルの種類がサポートされていないか、またはファイルが破損している可能性があります。

    例えば電子メールの添付文書として送信され、正しくデコードされなかったことなどが考えられます。 

     

    上記のエラーの原因または解決法がわかりません。

     

    また、自分なりに調べてみたのですが、『ファイルのダウンロード』でPDFファイルを『保存』し、そのファイルのプロパティを見てみたのですが、ちょっと疑問をもった点があったのでこれも合わせて質問させて頂きます。

    プロパティの『PDFタブ』なのですが、

    Web表示用に最適化→いいえ

    PDFのバージョン→0.0

    となっていました。この内容に問題があるのではないかと思ったのですがどうでしょう?

     

    以上の2つについて皆様のお力をお借りできればと思っております。

    わかる方がいらっしゃれば教えて頂きたいと思いますのでよろしくお願い致します。

     

     

     

     

    2007年8月30日 4:27

回答

  • 遅くなって申し訳ありません。

     

    外池様がご提案してくださったアイデアを試してみたいと思います。

     

    ありがとうございました。

    2007年9月3日 0:09

すべての返信

  • 外池と申します。

     

    「念のため」の確認ですが、サーバー側で用意されているtest.pdfは、単独では正しく開けるのですね? (そもそものtest.pdfが壊れていたというオチはないですよね?)

     

    その上で、解決策を直接提示できないので恐縮ですが、私が試行錯誤するなら以下のようなことをやってみたり、確認してみたりします。

     

    Response.AppendHeaderをしていますが、この操作以外のところで、別途Content-Dispositionのヘッダーが付け加わっている(つまり、同じ名称のヘッダーが2重以上に重複している)というようなことはないですか? 

     

    PDFファイルではなく、例えば、jpegファイルなら上手く行くか?

     

    IEだとダメなのですが、他のブラウザを使えば、サーバーがどのようなHeaderを送信してきているか表示できるはずなので、そのようなブラウザを使って、意図したとおりの動作が実現できているか確認されながら作業を進められてはいかがでしょうか?(便乗質問:サーバーが応答しているときのHeaderをIEでは見れないのは何故なんでしょう? 簡単に見られる方法が欲しいところです)

     

    すいません、追記です。ヘッダーの表示機能はデフォルトでは無いみたいですね。以下の記事が参考になるかと。

    http://sonic64.com/2005-04-16.html

     

     

     

     

    2007年8月30日 4:43
  •  Chip'nDale さんからの引用

    こんにちは。

    この間この質問と同じ様な質問をしたのですが、自分でいろいろ調べてみてもわからなかったので

    もう一度質問することに致しました。

    ASP.NETでPDFを出力するには?
    http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=2068769&SiteID=7

    ですよね。

     

     Chip'nDale さんからの引用
    教えて頂いたとおり、FileStreamを使いCドライブに保存されたPDFを開いてみたところ、同じエラーが表示されてしまいました。

    なので、比較することもできませんでした・・・。

    これは正しいPDFが作成されていないということですよね・・・。

     

    そもそも元のストリームのPDFデータが正しくないようですね。

    PDFのデータは何を使ってどのように生成していますか。

     

    バージョンが0.0なのはおかしいですが、「Web用に最適化:いいえ」は線形化PDFかどうかというもので、今回はそもそもPDFデータがおかしいようなので無関係です。正しいPDFならば、「Web用に最適化:いいえ」でも開けるはずです。

    2007年8月30日 4:55
  • 外池です。

     

    う゛・・・、やはりこのオチなんですか?

     

    うーん、前にご質問になった後、PDFファイルの生成の部分は解決されて、さらにその上で今回の質問になっていると祈りたいところですが。

     

    2007年8月30日 5:23
  • IIJIMAS様

    データの作成というのはPDFに表示したいものという事でよろしいですか?

    そうであれば、データはデザイン画面(HTML)の方で『Test』と入力してあるだけなのですが・・・。

     

    外池様

    申し訳ありません・・・。外池様のおっしゃるとおりこのオチです・・・。

    前回質問した時には解決できなかったもので・・・。

     

    2007年8月30日 7:44
  •  Chip'nDale さんからの引用

    IIJIMAS様

    データの作成というのはPDFに表示したいものという事でよろしいですか?

    そうであれば、データはデザイン画面(HTML)の方で『Test』と入力してあるだけなのですが・・・。

    どういう状況なのかわかりません。

     

    とりあえずResponse.AppendHeaderの行だけでなくそのあたりのソースコードを見せてください。

    2007年8月30日 7:52
  • おはようございます。

    遅れてすいません。以下がResponse.AddendHeaderのあたりのコードです。

     

    【.aspx】

     Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Response.ContentType = "application/xls"
            Response.AppendHeader("Content-Disposition", "attachment;filename=DWMS1.xls")

      End Sub

     

    【.aspx.vb】

    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="AutoCompleteExtender.aspx.vb" Inherits="AutoCompleteControl"   %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
             Test</div>
        </form>
    </body>
    </html>

     

    お手数お掛けしております・・・。よろしくお願い致します。

    2007年8月30日 23:07
  • 肝心のPDFストリームの出力部分が無いようですが。

    (Response.BinaryWrite() とか内容出力部分がありませんよ。)

     

    HttpResponse.BinaryWrite メソッド

    http://msdn2.microsoft.com/ja-jp/library/system.web.httpresponse.binarywrite(VS.80).aspx

     

    他にも

    >Response.ContentType = "application/xls"

    Excelですか。PDFではなかったのでしょうか。

     

    >【.aspx.vb】

    >【.aspx】

     

    逆ではないでしょうか。

     

    .aspx.vbのソースコードすべてご提示ください。

     

    2007年8月31日 1:06
  • すいません・・・。コードをいろいろ触っているうちにごちゃごちゃになってしまって・・・。

    PDFです。

    Response.ContentType="application/pdf"を追加して行ってみましたが結果は同じでした・・・。

     

    .aspx.vbのコードは前に提示したものですべてです。

    Response.BinaryWrite()がないとPDFには出力されないのですか?

    2007年8月31日 2:23
  • Response.Write()なり、Response.BinaryWrite()なりがないと、クライアントブラウザに何も返していないことになります。

    Webアプリケーションの基本的な仕組みは理解されていますでしょうか。

    MSDNライブラリの関連ページをご参照ください。

     

    検索サイトなどで入門ページを探されるのもよろしいと思います。

    たとえば

    @IT > Insider.NET > カテゴリ別 全記事一覧

    http://www.atmarkit.co.jp/fdotnet/index/all/category.html

    がご参考になるかと思います。

    また、ASP.NETの入門書籍をご購入を検討されてはいかがでしょうか。

     

    前のスレッドで、FileStreamを使って”何か”を出力されたそうですが、一体何を出力したのでしょうか。

    よろしければその時のソースコードも見せてください。

    2007年8月31日 3:34
  • FileStreamで出力した時のコードは以下のとおりです↓

            Dim fs As New FileStream("test.pdf", FileMode.CreateNew)
            Response.Write("abc")
            fs.Close()

    Excelに出力する場合はResponse.Write()がなくても、.aspxに記述したものが表示されます。

    PDFとExcelでは違うのですか?

    2007年8月31日 4:26
  • 外池です。なんとなく状況、理解できました。

     

    要するに、PDFの拡張子がついているファイルを用意しようとしているのですが、空(中身が何もない)のファイルしかできていないわけです。

     

    「FileStreamで出力した時のコード」ですが、fsに対して、まったく何もメソッドを実行しないままfs.Closeしているので、中身はゼロです。Response.Write("abc")となっていますが、これは、ファイルに書き出しているのではなく、サーバーからクライアントへ直接応答してしまっているので、ダメです。

     

    fsに書き込みたいのであれば、fs.Write("abc")とすればよいのですが、この場合、PDFのファイル形式はまったく無視して、単純にテキスト形式で"abc"の3文字が書き込まれるだけですので、PDFファイルとしては機能しません。

     

    --------------

     

    で、アイデアとしてはですね、

     

    何でもいいですから、正しいPDFファイルをテスト用にサーバーの上に置いてみて、そのファイルをクライアントに送るプログラムを書いてみられてはいかがでしょうか?

     

    その上で、PDFファイルを生成する手段を組み込む(たぶん、PDFを生成する専用のツールをサーバーにインストールして、今、作成されているプログラムから呼び出す方法になると思います。)ことを考える、

     

    って感じで。

     

     

     

    2007年8月31日 7:31
  • 外池様、ご回答ありがとうございます。

     

    ExcelやCSVへの出力はやったことがあるのですが、PDFへの出力は初めてなのでわからないことだらけです・・・。

     

    いまいち、FileStreamやResponse.Write等の使い方が把握できません・・・。

     

    外池様からご提案して頂いたアイデアなのですが、私には難しいように思われます。挑戦したいとは思いますが・・・。

     

    私がやっていたやり方ではPDFは絶対に作れないということですよね・・・。

     

    難しいです・・・。

    2007年8月31日 7:58
  • 外池です。

    • サーバーからクライアントへ応答を返すことと、
    • サーバー側だけのデータの処理を

    分けて考えなければいけません。

     

    「PDFのファイルを作る」という操作は後者のサーバー側だけのデータの処理ですので、まず、そこに集中してください。これは、aspだからどうこう、とか、.Net Frameworkだからどうこうという問題ではないのです。頭を切り替えて、ごくごく一般論として、PDFファイルをつくる手段にどんな方法があるのか調べて、次に、その方法をaspからどのように呼び出すのか考えましょう。しかし、繰り返しになりますが、これは、サーバー側だけの問題です。クライアントへのデータの送信とは無関係です。

     

    一方で、サーバー側に既に存在している特定のファイルをクライアント側へ送信する方法についても、別途調べてみるべきでしょう。既に存在している、ということなので、FileStreamを使って特定のバイト数ずつ読み取って、Response.WriteBinaryでクライアントに送るようにすればよいのだと思います。

     

    しかし・・・、「Response.Writeの使い方」は、aspの、ほんとーーーーーーに、最も基本の第一歩のところですから、「把握してください」。是非。難しいことをせずに、単純に平のHTML文とResponse.Writeを組み合わせて、簡単なHTMLを動的に生成する例をいろいろ試してみられてはいかがですか?

     

     

    2007年8月31日 11:06
  • 遅くなって申し訳ありません。

     

    外池様がご提案してくださったアイデアを試してみたいと思います。

     

    ありがとうございました。

    2007年9月3日 0:09