Как распечатать существующий PDF-файл со страницы с выделенным кодом? - PullRequest
3 голосов
/ 03 августа 2009

Я видел несколько таких вопросов вокруг SO, но не смог найти ничего подходящего для меня.Цепочка событий, которые я хотел бы иметь, выглядит следующим образом:

  1. Пользователь нажимает кнопку ASP.NET, элемент управления
  2. Это вызывает событие нажатия кнопки, которое является функцией foo () в коде C #
  3. foo () вызывает некоторую другую (неважную) функцию, которая создает PDF-файл, который в конечном итоге сохраняется на диске сервера.Эта функция возвращает путь к PDF
  4. . Без какого-либо другого взаимодействия с пользователем после создания PDF в браузере пользователя открывается диалоговое окно печати для печати этого PDF

Что делатьМне нужно сделать, чтобы выполнить шаг 4?В идеале это будет что-то, что я могу вызвать в foo (), передавая путь к PDF, которое вызовет диалоговое окно печати в браузере пользователя (печать PDF, а не страницы, с которой сработал onclick).

Я думаю, что я мог бы переадресовать URL-адрес документа PDF и встроить некоторый Javascript в PDF, который автоматически его печатает, но я бы предпочел этого не делать - я не хочу печатать PDFкаждый раз, когда он открывается (в браузере).Любой другой хороший способ сделать это?

Ответы [ 5 ]

1 голос
/ 12 августа 2010

Спасибо за ответ Vdex. Вот версия iText / C #.

PdfAction action = new PdfAction();
action.Put(new PdfName("Type"), new PdfName("Action"));
action.Put(new PdfName("S"), new PdfName("Named"));
action.Put(new PdfName("N"), new PdfName("Print"));

PdfReader reader = new PdfReader(ReportFile.FullFilePath(reportFile.FilePath));

PdfStamper stamper = new PdfStamper(reader, Response.OutputStream);
stamper.Writer.CloseStream = false;
stamper.Writer.SetOpenAction(action);
stamper.Close();
1 голос
/ 04 августа 2009
Response.Clear()
Response.AddHeader("Content-Disposition", "attachment; filename=myfilename.pdf")
Response.ContentType = "application/pdf"
Response.BinaryWrite(ms.ToArray())

Где ms = поток памяти, содержащий ваш файл (вам не нужно записывать его на промежуточный диск).

В противном случае, если вам абсолютно необходимо иметь дело с выходом с жесткого диска, используйте:

Response.WriteFile("c:\pathtofile.pdf")
0 голосов
/ 07 августа 2009

Я пришел к такому решению:

Создайте новую веб-форму ASP.NET (я назвал мою BinaryData.aspx), чтобы служить заполнителем для PDF. В приведенном ниже коде единственным методом должен быть Page_Load, который выглядит следующим образом:

protected void Page_Load(object sender, System.EventArgs e)
{
    //Set the appropriate ContentType.
    Response.ContentType = "Application/pdf";
    Response.AppendHeader("Pragma", "no-cache"); 
    Response.AppendHeader("Cache-Control", "no-cache");
    //Get the physical path to the file.
    string FilePath = (string)Session["fileLocation"];
    if ( FilePath != null )         
    {
        string FileName = Path.GetFileName(FilePath);

        Response.AppendHeader("Content-Disposition", "attachment; filename="+FileName);

        //Write the file directly to the HTTP content output stream.
        Response.WriteFile(FilePath);
        Response.End();
    }
}

PDF передается на страницу через переменную Session с именем "fileLocation". Итак, все, что мне нужно, это установить эту переменную, а затем вызвать Response.Redirect("BinaryData.aspx").

Он не печатается автоматически, но запускает загрузку PDF, не покидая текущей страницы (что для меня достаточно).

0 голосов
/ 03 августа 2009

Если вы хотите пойти по пути печати, как только он откроется:

Существует флаг, который можно вставить в PDF-файл, который заставляет его открывать диалоговое окно печати сразу после открытия PDF-файла. Я делал это давным-давно, используя компонент abcpdf в классическом ASP, код выглядел примерно так:

Set oDoc = Server.CreateObject("ABCpdf4.Doc")
oDoc.SetInfo oDoc.Root, "/OpenAction", "<< /Type /Action /S /Named /N /Print >>"

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

0 голосов
/ 03 августа 2009

Я не пробовал это, но это идея:

Если вы можете прочитать параметры строки запроса в javascript, встроенном в PDF, то внедрите javascript и сделайте функцию печати условной для параметра javascript.

Таким образом, если вы перенаправите, например, на ваш pdf.pdf? Print, он напечатает, а если он будет открыт без параметра печати, он будет вести себя так же, как и любой другой обычный PDF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...