2008-09-29 1 views
40

Мое приложение создает PDF-файлы для пользовательского потребления. Заголовок http-контента «Content-Disposition» установлен как указано here. Устанавливается значение «inline; filename = foo.pdf», которого должно хватить для Acrobat, чтобы дать «foo.pdf» в качестве имени файла при сохранении pdf.«имя» web pdf для лучшего по умолчанию сохранения имени файла в Acrobat?

Однако при нажатии кнопки «Сохранить» в встроенном браузере Acrobat имя для сохранения по умолчанию не совпадает с именем файла, но вместо этого URL с косой чертой изменился на символы подчеркивания. Огромный и уродливый. Есть ли способ повлиять на это имя по умолчанию в Adobe?

В URL-адресах есть строка запроса, и это не подлежит обсуждению. Это может быть значительным, но добавление «& foo =/title.pdf» в конец URL-адреса не влияет на имя файла по умолчанию.

Update 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

Update 3: Джулиан Reschke приносит фактическое понимание и строгость в этом случае. Пожалуйста, поддержите его ответ. Это, кажется, сломано в FF (https://bugzilla.mozilla.org/show_bug.cgi?id=433613) и IE, но работает в Opera, Safari и Chrome. http://greenbytes.de/tech/tc2231/#inlwithasciifilenamepdf

ответ

10

Часть проблемы заключается в том, что в соответствующем RFC 2183 не указано, что делать с типом размещения «inline» и имени файла.

Кроме того, насколько я могу судить, единственным UA, который фактически использует имя файла для type = inline, является Firefox (см. test case).

И, наконец, не очевидно, что API-интерфейс плагина фактически делает эту информацию доступной (возможно, кто-то, знакомый с API, может разработать).

Это, как говорится, я отправил указатель на этот вопрос человеку Adobe; возможно, правильные люди будут смотреть.

См. Также: попытка прояснить Content-Disposition в HTTP в draft-reschke-rfc2183-in-http - это ранняя работа в процессе, отзывы оцениваются.

Обновление: я добавил test case, что, по-видимому, указывает, что плагин чтения Acrobat не использует заголовки ответов (в Firefox), хотя API-интерфейс плагина предоставляет им доступ.

0

У вас всегда может быть две ссылки. Один, который открывает документ внутри браузера, а другой - для загрузки (с использованием неправильного типа содержимого). Это то, что делает Gmail.

+0

Прошу прощения, но я считаю, что это было бы хуже (с точки зрения пользователя), чем ничего не делать. Переименование файла - это не огромная сделка, просто раздражающая. – 2008-09-29 23:42:38

+0

Достаточно честно. Gmail делает это с изображениями, и мне это очень нравится лично. Удачи в любом случае :-) – 2008-09-30 00:00:03

7

Установите файл в ContentType. Это должно решить проблему.

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

После установки заголовка Content-Disposition, а также добавить заголовок длины содержимого, а затем использовать BinaryWrite в потоковом формате PDF.

context.Response.AddHeader("Content-Length", fileBytes.Length.ToString()); 
context.Response.BinaryWrite(fileBytes); 
+1

Он уже сделал это. Acrobat Reader игнорирует это, или так кажется. – 2008-09-30 01:52:56

+1

Предложение состоит в том, чтобы установить ContentType = "application/pdf; name = foo.pdf", который он не говорит, что попробовал. – Vivek 2008-09-30 02:35:26

+0

У меня были большие надежды, но это, похоже, не влияет на Acrobat Reader 8.0 в IE или FF. Вопрос обновлен. – 2008-09-30 18:17:46

1

Вместо крепления вы можете попробовать инлайн:

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

Я использовал встроенный в предыдущем веб-приложения, создавшего Crystal Reports вывод в PDF и послал, что в браузере для пользователя.

9

Как и вы, я попытался и попытался заставить это работать. Наконец я отказался от этой идеи и просто решил использовать обходной путь.

Я использую ASP.NET MVC Framework, поэтому я изменил маршруты для этого контроллера/действия, чтобы удостовериться, что поданный PDF-файл является последней частью части местоположения URI (перед строкой запроса) , и передать все остальное в строке запроса.

Например:

Старый URI:

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

Новый URI:

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

Результирующий заголовок выглядит точно так же, как то, что вы описали (содержание-тип application/pdf, disposition inline, имя файла бесполезно входит в заголовок). Acrobat показывает его в окне браузера (без сохранения в диалоговом окне) и имя файла, которое автоматически заполняется, если пользователь нажимает кнопку «Сохранить Acrobat», это имя файла отчета.

Несколько соображений:

Для того, чтобы имена файлов, чтобы выглядеть прилично, они не должны иметь экранированные символы (т.е. без пробелов и т.д.) ... который немного ограничивает. Мои имена файлов автоматически генерируются в этом случае, и раньше в них были пробелы, которые отображались как «% 20 в полученном файле диалога диалога сохранения». Я просто заменил пробелы символами подчеркивания, и это сработало.

Это ни в коем случае не лучшее решение, но оно действительно работает. Это также означает, что вы должны иметь доступное имя файла, чтобы сделать его частью исходного URI, что может испортить рабочий процесс вашей программы. Если он в настоящее время создается или извлекается из базы данных во время вызова на стороне сервера, который генерирует PDF, вам может потребоваться переместить код, который генерирует имя файла в javascript, как часть представления формы или если он поступает из базы данных, быстрый вызов ajax для получения имени файла при создании URL-адреса, в результате которого создается встроенный PDF-файл.

Если вы берете имя файла из пользовательского ввода в форме, то это должно быть проверено, чтобы не содержать экранированные символы, что будет раздражать пользователей.

Надеюсь, что помогает.

0

Я был перенаправлен сюда, потому что у меня такая же проблема. Я также попробовал обходной путь Троя Говарда, но он, похоже, не работает.

Подход, который я сделал на этом, - это НЕ ДОЛЖЕН использовать объект ответа для записи файла на лету. Поскольку PDF уже существует на сервере, я сделал, чтобы перенаправить мою страницу, указывающую на этот файл PDF. Прекрасно работает.

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

Я надеюсь, что мое расплывчатое объяснение дал вам идею.

-1

Попробуйте это, если ваш исполняемый "get.cgi"

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

Да, это совершенно безумным. На сервере нет файла с именем «filename.pdf», существует каталог вообще под исполняемым get.cgi.

Но, похоже, сработает. Сервер игнорирует filename.pdf и читатель PDF игнорирует «get.cgi»

Dan

1

Я считаю, что это уже упоминалось в одном аромате или другой, но я попытаюсь указать это в моей слова.

Вместо этого:

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

Я использую это:

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

Вместо того, процесс "экспорта" запрос, когда приходит запрос, я смотрю в URL для GeneratePDF = 1. Если он найден, я запускаю любой код, запущенный в «export», а не позволяя моей системе пытаться выполнить поиск и обслуживание PDF в местоположении /bar/sessions/958d8a22-0/views/1493881172/NameThatIWantPDFToBe.pdf. Если GeneratePDF не найден в URL-адресе, я просто передаю запрошенный файл. (обратите внимание, что я не могу просто перенаправить на запрошенный файл, иначе я бы оказался в бесконечном цикле)

2

Если вы используете asp.net, вы можете управлять именем файла pdf через имя файла (url). Как и другие пользователи, Acrobat немного ... когда он выбирает имя файла pdf при нажатии кнопки «Сохранить»: он принимает имя страницы, удаляет расширение и добавляет «.pdf». So /foo/bar/GetMyPdf.aspx дает GetMyPdf.pdf.

Единственное решение, которое я нашел, чтобы управлять «динамические» имена страниц через обработчик asp.net:

  • создать класс, который реализует IHttpHandler
  • карту обработчик в Интернете.конфигурации ограничен к классу

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

0

Способ, которым я решил это (с PHP), выглядит следующим образом:

Предположим, что ваш URL-адрес SomeScript.php?id=ID&data=DATA и файл, который вы хотите использовать, - TEST.pdf.

Изменить URL-адрес на SomeScript.php/id/ID/data/DATA/EXT/TEST.pdf.

Важно, что последний параметр - это имя файла, который вы хотите использовать Adobe («EXT» может быть о чем угодно). Убедитесь, что в приведенной выше строке нет специальных символов. BTW.

Теперь в верхней части 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'] и т. д.

И Adobe будет использовать ваше желаемое имя файла в качестве по умолчанию для сохранения или отправки по электронной почте при отправке его в очередь.

0

Для тех, кто все еще смотрит на это, я использовал решение here, и оно отлично работало. Спасибо, Фабрицио!

1

загрузка файла диалогового окно (PDF) с сохранением и открытым вариантом

Очки Помнить:

  1. возврат поток с правильным размером массива от службы
  2. Прочитайте байты arrary из потока с нужной длиной байта на основе длины потока.
  3. набор правильно ТипСодержимого

Вот код для потока чтения и открыть диалог загрузки файла для 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(); 
    } 
} 
4

В ASP.NET 2.0 изменить URL из

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

в

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

Это работает для Acrobat 8 ​​и SaveAs умолчанию имя файла теперь MySaveAsFileName.pdf.

Тем не менее, вы должны ограничить допустимые символы в MySaveAsFileName (без периодов и т. Д.).

4

Apache's mod_rewrite может решить эту проблему.

У меня есть веб-сервис с конечной точкой в ​​/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, так что я бил правильную конечную точку веба-службу, но Acrobat считает, что сохранит свой файл как filename.pdf.

Смежные вопросы