HTML в PDF, используя iTextShart, используя asp.net Место загрузки

Я использую приведенный ниже код в asp.net для экспорта HTML в PDF

protected void btnExport_Click(object sender, EventArgs e)
{
    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment;filename=Panel.pdf");
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);
    pnlPerson.RenderControl(hw);
    StringReader sr = new StringReader(sw.ToString());
    Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 100f, 0f);
    HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
    PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
    pdfDoc.Open();
    htmlparser.Parse(sr);
    pdfDoc.Close();
    Response.Write(pdfDoc);
    Response.End();
}

Этот код загрузит файл PDF в папку загрузок. Я хочу загрузить его по определенному пути без запроса на загрузку.

3 ответа

Вы пишете PDF в Response.OutputStream,

Посмотрите здесь: как сохранить PDF на пути к карте сервера, используя iTextsharp

Это не проблема с C# или ASP.NET, это пользовательский агент (то есть браузер), который решает, куда загружать файл, обычно либо после запроса пользователя, либо с помощью каталога по умолчанию, установленного в его конфигурации.

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

1) ИМХО, вы не можете игнорировать браузер, запрашивающий загрузку по соображениям безопасности (это недоступный параметр клиентского приложения для обычных веб-приложений). Вы можете попробовать перенаправить на какой-нибудь онлайн-сервис просмотра PDF или предоставить свой собственный вместо загрузки.

2) Я не рекомендую такой код, как вы показали (btnExport_Click, заполняйте загружаемый контент, используя ответ текущей страницы). Это приводит к тому, что ваша страница перестает отвечать на запросы (в основном не работает) после нажатия кнопки "Экспорт", поскольку страница имеет только один ответ. Я рекомендую создать отдельную страницу или обработчик http для рендеринга PDF (в соответствии с параметрами запроса): просто перенаправьте на эту страницу / обработчик по нажатию кнопки, и вы получите правильное поведение.

3) Я настоятельно рекомендую использовать wkhtmltopdf и некоторые обертки (например, Печкин). Он работает действительно лучше из коробки в 99% реальных сценариев и требует меньше кода для достижения базового html2pdf рендеринга вещей, обрабатывающих ссылки, CSS, изображения, Unicode и т. Д.

Другие вопросы по тегам