- PR -

PDFの出力とページの表示変更を一度のレスポンスで行いたいです。

投稿者投稿内容
やよい
常連さん
会議室デビュー日: 2007/03/31
投稿数: 22
投稿日時: 2007-04-10 14:47
こんにちは。
返答が遅くなってしまってすみません。
ご紹介して頂いた方法を使ってやってみました。

>私であれば、まず登録ボタンなどを押したタイミングで PostBack し、DB
>への登録とページの内容を書き換えて新しいページを出力までを行います。
>
>そしてその PostBack 後の新しいページに RegisterClientScript メソ
>ッドなりを利用して、JavaScript で page の onload あたりに新しいウ
>ィンドウを開くスクリプトを追加します。
>
>新しいウィンドウは PDF を出力するための別の aspx ファイルを開くよう
>にしておいて、その aspx ファイル内では登録済みの DB の内容を読み
>込んで PDF を出力する、といった感じです。

そうしたら、PDF出力のダイアログが表示されるのですが、
開くを選択すると、「ファイルが見つかりません」とのエラーになってしまいます。
開くを選択せず、保存を選択し、一旦保存した後、そのファイルを開くと正しく表示されます。(ですので、PDFそのものは出来ているということ?)
出力の部分のコードは、前述の通り、
With m_page
 .Response.Clear()
 .Response.ClearHeaders()
 .Response.ClearContent()
 .Response.ContentType = "application/pdf"
 .Response.AddHeader("content-disposition", "attachment; filename=abc.pdf")
 objPdf.Export(pdffile.Document, objStream)
 .Response.BinaryWrite(objStream.ToArray)
 .Response.End()
End With
といった具合です。
何がいけないのでしょうか。



ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-04-10 15:06
いまさらながらですが、私がとった方法は別ウィンドウに PDF を表示させ
やり方でした。PDF をダウンロードさせる場合とは少し事情が違うかもし
れません。
ただ、その場合は新しいウィンドウを開かずに、PDF を出力するための
aspx ファイルへリダイレクトしてやるなどの処理にすれば、なんとかなりそ
うな気もします。えーとこの辺は手元に環境がないのでちょっと試せないの
ですが(申し訳ないです)。

引用:

やよいさんの書き込み (2007-04-10 14:47) より:

そうしたら、PDF出力のダイアログが表示されるのですが、
開くを選択すると、「ファイルが見つかりません」とのエラーになってしまいます。
開くを選択せず、保存を選択し、一旦保存した後、そのファイルを開くと正しく表示されます。(ですので、PDFそのものは出来ているということ?)


保存すれば大丈夫ということは、ファイル自体は正しく作成できていると思
われます。
気になるのは、Response.BinaryWrite のあとですぐに
Response.End() を呼んでいるところでしょうか。
その前に Reponse.Flush() を入れてみてください。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2007-04-10 15:39
ちょっと気になったのですが、
「objStream.ToArray」には、正しい値が入っていますか?
やよい
常連さん
会議室デビュー日: 2007/03/31
投稿数: 22
投稿日時: 2007-04-10 15:56
ありがとうございます。
>Reponse.Flush() を入れてみてください。
やってみたのですが、うまくいきませんでした。
>「objStream.ToArray」には、正しい値が入っていますか?
他のページではこのコードでちゃんとPDFが出力されるので、
正しい値が入っていると思うのですが・・・。
他のページとの違いを考えてみると、
他のページの印刷ボタンは、PDFの出力だけを行っていて(なので、画面の更新の必要がない)、このページの印刷ボタンでは、画面の更新とPDFの出力を同時に行おうとしています。そこでサブウィンドウを表示させて、そのLoadイベントでPDF出力をさせようとしています。そうすると、ページの出力が終わる前に、PDFの出力を行っている状態になっているのではないのかなと考えています。
で、どうすればよいかまでは、考えが及ばないのでが・・・。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2007-04-10 16:20
引用:

やよいさんの書き込み (2007-04-10 15:56) より:

>「objStream.ToArray」には、正しい値が入っていますか?
他のページではこのコードでちゃんとPDFが出力されるので、
正しい値が入っていると思うのですが・・・。
他のページとの違いを考えてみると、
他のページの印刷ボタンは、PDFの出力だけを行っていて(なので、画面の更新の必要がない)、このページの印刷ボタンでは、画面の更新とPDFの出力を同時に行おうとしています。そこでサブウィンドウを表示させて、そのLoadイベントでPDF出力をさせようとしています。そうすると、ページの出力が終わる前に、PDFの出力を行っている状態になっているのではないのかなと考えています。
で、どうすればよいかまでは、考えが及ばないのでが・・・。



「正しい値が入っていると思う」では、うまく動かないと思いませんか?
まずは1つずつ確認していき、原因を特定するのがデバッグではありませんか?

>開くを選択すると、「ファイルが見つかりません」とのエラーになってしまいます。

という状態では、まず最初に
「.Response.BinaryWrite(objStream.ToArray)」
を確認すると思いますが・・・
やよい
常連さん
会議室デビュー日: 2007/03/31
投稿数: 22
投稿日時: 2007-04-10 16:42
すいません。
>「正しい値が入っていると思う」では、うまく動かないと思いませんか?
Lengthとかを見て、中身が入っていることは確認しているのでうが、
それが正しい内容なのかどうかを、どうやって判断すればよいのかわからず、
入っていると思うとの返答になってしまいました。

どうも、一旦ページが表示されないとダメなようです。
サブウィンドウに隠しボタンを付けて、bodyのonLoadイベントで、
Javascriptを使ってそのボタンを押してやり、
ボタン押下イベントでPDFを出力するとうまく表示されます。
でも、それだと、そのサブウィンドウが消せなくなってしまいます・・・。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2007-04-10 17:16
ActiveReports は使ったことが無いので、トライアル版をインストールしてみました。

サンプルを見ると、
コード:
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim p As New DataDynamics.ActiveReports.Export.Pdf.PdfExport()
    Dim m_stream As New System.IO.MemoryStream()
    Dim rpt As New rptCustEx()

    rpt.Run()
    p.Export(rpt.Document, m_stream)
    m_stream.Position = 0
    Response.ContentType = "application/pdf"
    Response.BinaryWrite(m_stream.ToArray())
    Response.End()
End Sub


とあります。

コード:
  objStream.Position = 0

  .Response.BinaryWrite(objStream.ToArray()) ← カッコがない


この辺が気になりました。
やよい
常連さん
会議室デビュー日: 2007/03/31
投稿数: 22
投稿日時: 2007-04-10 17:53
ありがとうございます。
わざわざインストールまでして頂いて、感謝と恐縮です。
確かに、()が抜けてました。
見落としていて、情けないです。
ただ、残念ながら、結果は変わらずです。

スキルアップ/キャリアアップ(JOB@IT)