43

私のアプリは、ユーザーが使用するために PDF を生成します。「Content-Disposition」http ヘッダーは、ここで説明したように設定されます。これは「inline; filename=foo.pdf」に設定されています。これは、Acrobat が PDF を保存するときにファイル名として「foo.pdf」を指定するのに十分なはずです。

ただし、ブラウザに埋め込まれた Acrobat の [保存] ボタンをクリックすると、保存するデフォルトの名前はそのファイル名ではなく、スラッシュをアンダースコアに変更した URL になります。巨大で醜い。Adobe でこのデフォルトのファイル名に影響を与える方法はありますか?

URL にはクエリ文字列があり、これは交渉不可能です。これは重要かもしれませんが、URL の末尾に「&foo=/title.pdf」を追加しても、デフォルトのファイル名には影響しません。

更新 2: 両方を試しました

content-disposition  inline; filename=foo.pdf
Content-Type         application/pdf; filename=foo.pdf

content-disposition  inline; filename=foo.pdf
Content-Type         application/pdf; name=foo.pdf

(Firebug で確認済み) 残念ながら、どちらも機能しませんでした。

サンプルURLは

/bar/sessions/958d8a22-0/views/1493881172/export?format=application/pdf&no-attachment=true

これは、デフォルトの Acrobat の保存ファイル名に変換されます。

http___localhost_bar_sessions_958d8a22-0_views_1493881172_export_format=application_pdf&no-attachment=true.pdf

更新 3: Julian Reschke は、このケースに実際の洞察と厳密さをもたらします。彼の答えに賛成してください。これは FF ( https://bugzilla.mozilla.org/show_bug.cgi?id=433613 ) と IE では壊れているようですが、Opera、Safari、および Chrome では機能します。http://greenbytes.de/tech/tc2231/#inlwithasciifilenamepdf

4

16 に答える 16

11

問題の一部は、関連する RFC 2183が、「インライン」の処理タイプとファイル名をどうするかについて実際に述べていないことです。

また、私が知る限り、実際に type=inline のファイル名を使用する UA は Firefox だけです (テスト ケースを参照)。

最後に、プラグイン API が実際にその情報を利用できるようにするかどうかは明らかではありません (API に詳しい人なら詳しく説明できるかもしれません)。

そうは言っても、私はこの質問へのポインタをアドビの人に送りました。適切な人が見てくれるかもしれません。

関連:draft-reschke-rfc2183-in-httpで HTTP の Content-Disposition を明確にする試みを参照してください。これは進行中の初期の作業であり、フィードバックを歓迎します。

更新:テスト ケースを追加しました。これは、Acrobat リーダー プラグインが (Firefox で) 応答ヘッダーを使用していないことを示しているようですが、プラグイン API は応答ヘッダーへのアクセスを提供します。

于 2009-03-21T11:20:48.147 に答える
11

ContentTypeにもファイル名を設定します。これで問題は解決するはずです。

context.Response.ContentType = "application/pdf; name=" + fileName;
// the usual stuff
context.Response.AddHeader("content-disposition", "inline; filename=" + fileName);

content-disposition ヘッダーを設定したら、content-length ヘッダーも追加し、binarywrite を使用して PDF をストリーミングします。

context.Response.AddHeader("Content-Length", fileBytes.Length.ToString());
context.Response.BinaryWrite(fileBytes);
于 2008-09-30T00:28:57.957 に答える
9

あなたのように、私はこれを機能させようとしました。最後に、私はこのアイデアをあきらめ、回避策を選択しました。

ASP.NET MVC フレームワークを使用しているため、そのコントローラー/アクションのルートを変更して、提供された PDF ファイルが URI の場所部分の最後の部分 (クエリ文字列の前) であることを確認し、すべてを渡します。クエリ文字列のelse。

例えば:

古い URI:

http://server/app/report/showpdf?param1=foo¶m2=bar&filename=myreport.pdf

新しい URI:

http://server/app/report/showpdf/myreport.pdf?param1=foo¶m2=bar

結果のヘッダーは、あなたが説明したものとまったく同じように見えます(コンテンツタイプはapplication/pdf、気質はインライン、ファイル名は無駄にヘッダーの一部です)。Acrobat はそれをブラウザー ウィンドウに表示し ([名前を付けて保存] ダイアログはありません)、ユーザーが [Acrobat の保存] ボタンをクリックすると自動入力されるファイル名がレポート ファイル名になります。

いくつかの考慮事項:

ファイル名がまともに見えるようにするには、エスケープ文字 (つまり、スペースなど) を含めないでください... これは少し制限があります。この場合、ファイル名は自動生成されますが、以前はスペースが含まれていたため、結果の保存ダイアログのファイル名に「%20」として表示されていました。スペースをアンダースコアに置き換えただけで、うまくいきました。

これは決して最善の解決策ではありませんが、機能します。また、元の URI の一部にするためにファイル名を使用できるようにする必要があることも意味します。これにより、プログラムのワークフローが混乱する可能性があります。PDF を生成するサーバー側の呼び出し中にデータベースから現在生成または取得されている場合は、ファイル名を生成するコードをフォーム送信の一部として JavaScript に移動する必要がある場合があります。インライン化された PDF を生成する URL を構築するときにファイル名を取得するための ajax 呼び出し。

フォームのユーザー入力からファイル名を取得している場合、エスケープ文字が含まれていないことを検証する必要があります。これはユーザーを悩ませます。

それが役立つことを願っています。

于 2008-12-03T22:47:26.610 に答える
5

ファイル名を URL の最後に配置してみてください。他のパラメータの前に配置してください。これは私にとってはうまくいきました。 http://www.setasign.de/support/tips-and-tricks/filename-in-browser-plugin/

于 2011-12-02T19:12:57.603 に答える
4

Apachemod_rewriteはこれを解決できます。

にエンドポイントを持つWebサービスがあります/foo/getDoc.service。もちろん、Acrobatはファイルを。として保存しますgetDoc.pdf。次の行を追加しましたapache.conf

LoadModule     RewriteModule         modules/mod_rewrite.so
RewriteEngine  on
RewriteRule    ^/foo/getDoc/(.*)$    /foo/getDoc.service     [P,NE]

リクエスト/foo/getDoc/filename.pdf?bar&quxすると、内部でに書き換えられる/foo/getDoc.service?bar&quxため、Webサービスの正しいエンドポイントに到達していますが、Acrobatはファイルをとして保存すると考えていますfilename.pdf

于 2011-07-27T23:36:51.583 に答える
4

ASP.NET 2.0では、URLを次のように変更します。

http://www. server.com/DocServe.aspx?DocId=XXXXXXX

http://www. server.com/DocServe.aspx/MySaveAsFileName?DocId=XXXXXXX

これはAcrobat8で機能し、デフォルトの名前を付けて保存ファイル名はになりMySaveAsFileName.pdfました。

ただし、許可される文字を制限する必要がありますMySaveAsFileName(ピリオドなしなど)。

于 2010-12-26T16:13:20.417 に答える
2

asp.net を使用すると、ページ (url) ファイル名で pdf ファイル名を制御できます。他のユーザーが書いたように、「保存」ボタンを押したときに PDF ファイル名を選択すると、Acrobat は少し s... ページ名を取得し、拡張子を削除して「.pdf」を追加します。したがって、/foo/bar/GetMyPdf.aspx は GetMyPdf.pdf を提供します。

私が見つけた唯一の解決策は、asp.net ハンドラーを介して「動的」ページ名を管理することです。

  • IHttpHandler を実装するクラスを作成する
  • クラスにバインドされた web.config のハンドラーをマップします

Mapping1: すべてのページに共通の基数があります (MyDocument_):

<httpHandlers>  
<add verb="*" path="MyDocument_*.ashx" type="ITextMiscWeb.MyDocumentHandler"/>

Mapping2: 完全にフリーなファイル名 (パスにフォルダーが必要):

<add verb="*" path="/CustomName/*.ashx" type="ITextMiscWeb.MyDocumentHandler"/>

ここにいくつかのヒントがあります (pdf は iTextSharp を使用して動的に作成されます):
http://fhtino.blogspot.com/2006/11/how-to-show-or-download-pdf-file-from.html

于 2009-05-22T14:35:17.197 に答える
1

これはすでに何らかの形で言及されていると思いますが、私自身の言葉で述べようと思います。

これではなく:

/bar/sessions/958d8a22-0/views/1493881172/export?format=application/pdf&no-attachment=true

私はこれを使用します:

/bar/sessions/958d8a22-0/views/1493881172/NameThatIWantPDFToBe.pdf?GeneratePDF=1

リクエストを「エクスポート」で処理するのではなく、リクエストが届いたときに、GeneratePDF=1のURLを調べます。見つかった場合は、システムがその場所でPDFを検索して提供しようとするのではなく、「エクスポート」で実行されていたコードを実行します/bar/sessions/958d8a22-0/views/1493881172/NameThatIWantPDFToBe.pdf。GeneratePDFがURLに見つからない場合は、要求されたファイルを送信するだけです。(要求されたファイルに単純にリダイレクトすることはできないことに注意してください。そうしないと、無限ループに陥ってしまいます)

于 2009-05-14T16:54:24.843 に答える
1

添付ファイルの代わりに、インラインで試すことができます:

Response.AddHeader("content-disposition", "inline;filename=MyFile.pdf");

Crystal Reports の出力を PDF に生成し、それをブラウザーでユーザーに送信する以前の Web アプリケーションでインラインを使用しました。

于 2008-09-30T01:54:04.323 に答える
1

保存して開くオプション付きのファイル ダウンロード ダイアログ (PDF)

覚えておくべきポイント:

  1. サービスから正しい配列サイズでストリームを返す
  2. ストリームの長さに基づいて、正しいバイト長でストリームからバイト配列を読み取ります。
  3. 正しい contenttype を設定する

ストリームを読み取り、PDF ファイルのファイル ダウンロード ダイアログを開くためのコードは次のとおりです。

private void DownloadSharePointDocument()
{
    Uri uriAddress = new Uri("http://hyddlf5187:900/SharePointDownloadService/FulfillmentDownload.svc/GetDocumentByID/1/drmfree/");
    HttpWebRequest req = WebRequest.Create(uriAddress) as HttpWebRequest;
    // Get response   
    using (HttpWebResponse httpWebResponse = req.GetResponse() as HttpWebResponse)
    {
        Stream stream = httpWebResponse.GetResponseStream();
        int byteCount = Convert.ToInt32(httpWebResponse.ContentLength);
        byte[] Buffer1 = new byte[byteCount];
        using (BinaryReader reader = new BinaryReader(stream))
        {
            Buffer1 = reader.ReadBytes(byteCount);
        }
        Response.Clear();
        Response.ClearHeaders();
        // set the content type to PDF 
        Response.ContentType = "application/pdf";
        Response.AddHeader("Content-Disposition", "attachment;filename=Filename.pdf");
        Response.Buffer = true;
        Response.BinaryWrite(Buffer1);
        Response.Flush();
       // Response.End();
    }
}
于 2010-12-18T07:42:50.937 に答える
0

私がこれを(PHPで)解決した方法は次のとおりです。

URLがSomeScript.php?id=ID&data=DATAであり、使用するファイルがであるとしますTEST.pdf

URLをに変更しますSomeScript.php/id/ID/data/DATA/EXT/TEST.pdf

最後のパラメータは、Adobeで使用するファイル名であることが重要です(「EXT」は何でもかまいません)。ところで、上記の文字列に特別な文字が含まれていないことを確認してください。

ここで、の上部にSomeScript.php次を追加します。

$_REQUEST = MakeFriendlyURI( $_SERVER['PHP\_SELF'], $_SERVER['SCRIPT_FILENAME']);

SomeScript.php次に、この関数を(または関数ライブラリ)に追加します。

function MakeFriendlyURI($URI, $ScriptName) {

/* Need to remove everything up to the script name */
$MyName = '/^.*'.preg_quote(basename($ScriptName)."/", '/').'/';
$Str = preg_replace($MyName,'',$URI);
$RequestArray = array();

/* Breaks down like this
      0      1     2     3     4     5
    PARAM1/VAL1/PARAM2/VAL2/PARAM3/VAL3
*/

$tmp = explode('/',$Str);   
/* Ok so build an associative array with Key->value
   This way it can be returned back to $_REQUEST or $_GET
 */
for ($i=0;$i < count($tmp); $i = $i+2){
    $RequestArray[$tmp[$i]] = $tmp[$i+1];
}
return $RequestArray;       
}//EO MakeFriendlyURI

$_REQUESTこれで(または必要$_GETに応じて)通常$_REQUEST['id']のようにアクセスできます$_REQUEST['data']

また、アドビは、ファイルをインラインで送信するときに、デフォルトの名前を付けて保存または電子メール情報として希望のファイル名を使用します。

于 2009-11-26T20:21:49.407 に答える
0

まだこれを見ている人のために、私はここにある解決策を使用しました。ありがとうファブリツィオ!

于 2010-01-06T19:37:51.583 に答える
0

同じ問題があるため、ここにリダイレクトされました。Troy Howard の回避策も試しましたが、うまくいかないようです。

これに対して私が行ったアプローチは、応答オブジェクトを使用してその場でファイルを書き込むことはもうありません。PDFはサーバー上に既に存在するため、私がしたことは、そのPDFファイルを指すページをリダイレクトすることでした。よく働く。

http://forums.asp.net/t/143631.aspx

私の漠然とした説明があなたにアイデアを与えてくれたことを願っています.

于 2009-01-14T01:52:44.460 に答える
0

常に 2 つのリンクを持つことができます。1 つはブラウザー内でドキュメントを開き、もう 1 つはドキュメントをダウンロードします (不適切なコンテンツ タイプを使用)。これがGmailの機能です。

于 2008-09-29T23:35:12.893 に答える
-1

実行可能ファイルが「get.cgi」の場合は、これを試してください

http://server,org/get.cgi/filename.pdf?file=filename.pdf

はい、それは完全に正気ではありません。サーバーには「filename.pdf」というファイルはなく、実行可能 get.cgi の下にディレクトリがまったくあります。

しかし、うまくいくようです。サーバーは filename.pdf を無視し、pdf リーダーは「get.cgi」を無視します。

ダン

于 2009-04-06T22:38:11.847 に答える