- PR -

FDFを作りたいのですが(再掲)

1
投稿者投稿内容
もりぞう
会議室デビュー日: 2004/04/01
投稿数: 15
投稿日時: 2004-04-07 00:00
こんばんは。いつもお世話になっております。
ASP.NETのWebフォームに入力された内容を印刷用としてPDFに書き出したいと思っています。そこで、固定のPDFにフォームを埋め込み、ASP.NET側でFDFを生成したいと思っています。そんなわけで、下のようなコードを書きました。
Private Sub Page_Load()
Response.Charset = ""
Response.ContentType = "application/vnd.fdf"
Dim pdfpath As String = "【既存のPDFファイル】.pdf"
With Response
.Write("%FDF-1.2" & vbCrLf)
.Write("1 0 obj" & vbCrLf)
.Write("<<" & vbCrLf)
.Write("/FDF <</Fields [<</V (" & Request.Params("★★★") & ")/T (PDFフォームの名前)>>" & vbCrLf)
.Write("]" & vbCrLf)
.Write("/Encoding/Shift-JIS/F (" & pdfpath & ")>>" & vbCrLf)
.Write(">>" & vbCrLf)
.Write("endobj" & vbCrLf)
.Write("trailer" & vbCrLf)
.Write("<<" & vbCrLf)
.Write("/Root 1 0 R" & vbCrLf)
.Write(">>" & vbCrLf)
.Write("%%EOF")
End With
Response.End()
End Sub
(★★★はQueryStringで送った文字です。)
これを実行しますと、Acrobatが前面で立ち上がって、「ファイルが見つからない」旨のエラーが出てしまいます。PDFファイルはこのコードの書かれたaspxファイルと同じ階層にいます。変数pdfpathをURLや絶対パスなどを付けて試してみましたが、いずれも同じ結果でした。
通常のPDFファイルを表示させるように、Acrobatが隠れた状態でブラウザの中に表示させたいのですが、単純にaspxから吐き出される形をFDFの形式にするだけではだめなのでしょうか?
ご享受いただきますよう、お願い申し上げます。
WindowsXP Pro・Acrobat5.0.5・VS.netで、VBです。
なお、問題の趣旨とは違う板にスレッドを立ててしまいましたので、そちらを削除し、こちらに再掲させていただきました。申し訳ございません。
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2004-04-09 14:53
こんにちは。
当方環境では掲示されたソースでVS.NET上でデバッグ実行して正常に動作しましたので、方向性は間違ってないと思います。ご報告まで。
ファイルパスは
Dim pdfpath As String = "http://localhost/FDFTest/FDFtest.pdf"
としました。\wwwroot\FDFTest下にソリューション、aspxとFDFtest.pdfがあります。

[当方環境]
WindowsXP Pro / Adobe Reader6.0 / VS.NET2003(VB.NET)

[参考:FDF Toolkit]
http://partners.adobe.com/asn/acrobat/forms.jsp
もりぞう
会議室デビュー日: 2004/04/01
投稿数: 15
投稿日時: 2004-04-09 23:07
まるくさん、ご返答ありがとうございました。
方向性は間違っていないとの励ましをいただいて、半ば諦めてはいたんですがもう少しがんばってみました。
その結果、なんとなくできなかった理由が分かりましたのでお知らせいたします。
原因はどうやら文字コードにあったみたいです。
web.configのglobalizationでエンコーディングをutf-8にしていましたが、Shift-JISにすることで解決しました。
逆にglobalizationはutf-8のままで、FDF内のエンコーディング記述もutf-8にすると開きはするのですが、文字が化けます。
ということは、おそらくQueryStringに日本語が含まれた場合、化けた状態でFDF生成aspxのほうに送られたんだと思います。それがFDFにとっては邪魔な文字(<>とか&とか)になったのではないかと…。だからFDFの構造が崩れてファイルを見つけるまでにいたらなかったんだと思います。
文字コードのことをあまり理解していないのであまりうまく言えませんが…。
まるくさん、本当にありがとうございました。

ところでもう一つ質問なのですが、QueryStringの中に日本語を使いたい場合、グローバルエンコーディングがutf-8だったらどのようにすればうまく渡せるのでしょうか?
ヘルプなど色々参照してみたのですが、よくわかりません…。
例えば文字列を引数として他の文字コードに変換してくれる関数なんてものはあるのでしょうか?
よろしくご享受いただけますよう、お願い申し上げます。

まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2004-04-10 19:52
こんばんは。
方向性については「技術的には可能」という意味で書きましたが、生産性を考えるとFDF Toolkitを利用される方が手っ取り早いと思いますけど。エンコードの問題も気にしなくて済むと思います。どうしても自前で実装されるのであれば、

1.Shift-JIS化

Dim enc As System.Text.Encoding = _
System.Text.Encoding.GetEncoding("Shift_JIS")
Dim b() As Byte = enc.GetBytes(text)

2.PostScriptフォーマット対応(Shift-JISコードの8進化→Oct関数を用いて作りこみ)

[参考サイト]
http://www1.kcn.ne.jp/~k-tm/KTworld/tandt/fdf-format.html

辺りで行けるのではないかと思います。


[ メッセージ編集済み 編集者: まるく 編集日時 2004-04-10 20:00 ]
もりぞう
会議室デビュー日: 2004/04/01
投稿数: 15
投稿日時: 2004-04-12 20:29
まるくさん、ご返答ありがとうございました。
教えていただいた方法やリンクを見させていただきました。が、文字コードの変換は小生には敷居が高すぎるようです…(せっかく教えていただいたのに申し訳ございません)
そこで、ご指摘いただいたようにFDFToolKitの方向でやってみました。今まで存在は知ってはいたもののそれこそ敷居が高いように思えてなかなか手を出せませんでしたが、http://www.asahi-net.or.jp/~ym3y-oksm/nt/asp/asp3.htmを参考にしていざやってみるととてもスムーズに動きました。
以下コードです。

Private Sub Page_Load()
Response.ContentType = "application/vnd.fdf"
Response.AppendHeader("Content-Disposition", "inline")
Response.AppendHeader("Content-Transfer-Encoding", "base64")
Dim FdfAcx = Server.CreateObject("FdfApp.FdfApp")
Dim Mypath = Server.MapPath("既存のFDFの名前")
Dim resFDF As FdfDoc = FdfAcx.FDFOpenFromFile(Mypath)
'resFDF.FDFSetEncoding("SHIFT-JIS")
resFDF.FDFSetValue("フィールド名", Request.QueryString("QueryStringの名前"), False)
resFDF.FDFSetFile("表示させたいPDFのURL")
Response.BinaryWrite(resFDF.FDFSaveToBuf)
resFDF.FDFclose()
resFDF = Nothing
FdfAcx = Nothing
Response.End()
End Sub

VBではFDFSetEncodingはサポートされていないんですね。でもグローバルエンコーディングで何を指定してもきちんとPDFには日本語が表示されます。
もっと早く手をつければよかった…。
まるくさん、本当にありがとうございました。おかげさまで一段落です。
1

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