Подтвердить что ты не робот

"name" web pdf для лучшего сохранения имени файла в Acrobat?

Мое приложение создает PDF файлы для пользовательского потребления. Http-заголовок "Content-Disposition" установлен как указано здесь. Он установлен в значение "inline; filename = foo.pdf", которого должно хватить для Acrobat, чтобы дать "foo.pdf" в качестве имени файла при сохранении pdf.

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

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

Обновление 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: Джулиан Рещке привносит в это дело реальное понимание и строгость. Пожалуйста, поддержите его ответ. Это похоже на нарушение FF (https://bugzilla.mozilla.org/show_bug.cgi?id=433613) и IE, но они работают в Opera, Safari и Chrome. http://greenbytes.de/tech/tc2231/#inlwithasciifilenamepdf

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Я использую 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

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

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

В ASP.NET 2.0 измените URL-адрес из

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

to

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

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

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

Ответ 5

Apache 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.

Ответ 7

Если вы используете asp.net, вы можете контролировать имя файла pdf через имя файла (url). Как и другие пользователи, Acrobat немного... когда он выбирает имя файла pdf при нажатии кнопки "Сохранить": он берет имя страницы, удаляет расширение и добавляет ".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

Ответ 8

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

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

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

Ответ 9

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

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

/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-адресе, я просто передаю запрошенный файл. (обратите внимание, что я не могу просто перенаправить на запрошенный файл - иначе я бы закончил бесконечный цикл)

Ответ 10

Диалоговое окно загрузки файла (PDF) с возможностью сохранения и открытия

Баллы для запоминания:

  • Возврат потока с правильным размером массива из службы
  • Прочитайте байтовый поток из потока с правильной длиной байта на основе длины потока.
  • установить правильный тип контента

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

Ответ 11

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

Ответ 12

Я был перенаправлен сюда, потому что у меня такая же проблема. Я также попробовал обходное решение Troy Howard, но оно, похоже, не работает.

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

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

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

Ответ 13

Способ, которым я решил это (с 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'] и т.д.

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

Ответ 14

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

Ответ 15

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

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

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

Но это работает. Сервер игнорирует имя файла .pdf, а программа чтения PDF игнорирует "get.cgi"

Dan