ShellCl Ответов: 1

Получить мой выбор edit|PDF, чтобы перейти непосредственно на страницу pdf - документа, чтобы распечатать его?


Прямо сейчас у меня есть index.cshtml, который имеет html.actionLink для предварительного просмотра html-таблицы, которая извлекает данные из формы, чтобы подготовиться к ее печати. Затем, когда я нажимаю на ссылку, она переходит к предварительному просмотру PDFOnePage.cshtml с html-кодом. Затем есть кнопка, чтобы получить его в метод abcpdf для печати. Я хотел бы получить оба действия в один шаг от index.cshtml. Я довольно новичок в веб-приложениях, поэтому немного запутался, как это делается.

Это часть моего index.cshtml со ссылкой:


<td>
                @Html.ActionLink("Edit", "Edit", new { id = item.ID }) |
                
                @Html.ActionLink("PDF", "PDFOnePage", new { id = item.ID }) 
       </td>


Затем, когда я нажимаю на ссылку PDF, она показывает html-код до того, как он будет напечатан.

PDFOnePage.cshtml выглядит следующим образом:


<table frame="box" style="width:100%; border-collapse:separate">
            <tr>
                <td colspan="3"> BlahBlahBlahLotsOfStuff</td>
            </tr>
       </table>
   

    <button>
        <a href="@Url.Action("HmtltoPDF2","Applicant")">Export PDF</a>
    </button>



Поэтому, когда мы нажимаем эту кнопку, она показывает PDF, а когда я нажимаю ctrl-p, она вызывает графический интерфейс печати.

Эта кнопка обращается к моему методу ApplicantController.cs:


public FileStreamResult HmtltoPDF2()
            {
                //getting the url to convert to pdf
                String PreviousPage = System.Web.HttpContext.Current.Request.UrlReferrer.AbsoluteUri;
    
    
                //abcpdf was annoying for not accepting the Url directly 
                //so just make a string variable to assign the value of the url
                // DO NOT delete this and use PreviousPage directly
                //it will break the PDF Convertion.
                String HtmlToPDFConvertion = PreviousPage;
                MemoryStream m = new MemoryStream();
                Doc theDoc = new Doc();
                theDoc.MediaBox.String = "A4";
                theDoc.FontSize = 8;
                //theDoc.Rect.Inset(114, 162);
                theDoc.Rect.Inset(15, 1);
    
                theDoc.HtmlOptions.Engine = EngineType.Chrome;
                theDoc.HtmlOptions.UseScript = true; // enable JavaScript
                theDoc.HtmlOptions.Media = MediaType.Print; // Or Screen for a more screen oriented output
                theDoc.HtmlOptions.InitialWidth = 800; // In case we have a responsive site which is non-specific on good widths
                                                       //theDoc.HtmlOptions.RepaintDelay = 500; // Only required if you have AJAX or animated content such as graphs
                                                       //theDoc.HtmlOptions.IgnoreCertificateErrors = false; // Disabled for ease of debugging
                                                       //theDoc.HtmlOptions.FireShield.Policy = XHtmlFireShield.Enforcement.Deny; // Disabled for ease of debugging
    
                
                theDoc.Page = theDoc.AddPage();
                int theID;
                
                theID = theDoc.AddImageUrl(HtmlToPDFConvertion);
    
                while (true)
                {
                    theDoc.FrameRect(); // add a black border
                    if (!theDoc.Chainable(theID))
                        break;
                    theDoc.Page = theDoc.AddPage();
                    theID = theDoc.AddImageToChain(theID);
                }
    
                for (int i = 1; i <= theDoc.PageCount; i++)

                {

                    theDoc.PageNumber = i;

                    theDoc.Flatten();

                }

                theDoc.Save(Server.MapPath(Path));

    

    

    

    

                byte[] theData = theDoc.GetData();

                Response.Clear();

                Response.ContentType = "application/pdf";

                Response.AddHeader("content-disposition", "inline; filename=MyPDF.PDF");

                Response.AddHeader("content-length", theData.Length.ToString());

                Response.BinaryWrite(theData);

                Response.End();

    

                return File(m, "application/pdf", "test.pdf");

                //theDoc.Clear();

            }


Все вместе это схема того, что представляют собой шаги:

Edit|PDF (из index.cshtml)
|
|
в
BlahBlahBlahLotsOfStuff
Кнопка ExportPDF (из PDFOnePage.cshtml для получения содержимого)
|
|
в
BlahBlahBlahLotsOfStuff
Экспорт в PDF файл (/заявителя/HtmltoPDF2) (когда нажмите ссылку "экспорт в PDF" идет
ApplicantController.в CS)
|
|
в
принтер интерфейс (после нажмите сочетание клавиш Ctrl-P см интерфейс принтера )

Как мне избавиться от промежуточного шага, когда я дважды просматриваю PDF/html перед печатью? Как поставить HTML.actionlink панели (в формате PDF) вместе с url.href, что Действие htmltoPDF2? Я не хочу печатать кнопку с содержимым страницы или полосу прокрутки.

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

Что я уже пробовал:

Я попытался поместить код кнопки в index.cshtml, где у меня есть ссылка PDF, но мне нужна ссылка, подобная той, что есть в редактировании. Я не уверен, что мне нужен промежуточный шаг создания предварительного просмотра и просмотра кнопки html, прежде чем я нажму кнопку экспорта PDF и сделаю ctrl-p. Я не могу правильно использовать синтаксис для использования ссылки в index.cshtml, и тогда я буду видеть то, что вижу, когда нажимаю кнопку экспорта PDF.

ShellCl

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

<a href="@*Url.Action("HmtltoPDF2","заявитель"), new { id = item.Идентификатор })>в формате PDF&ЛТ;/а&амп;ГТ

1 Ответов

Рейтинг:
1

Richard Deeming

Измените свой HtmltoPDF2 действие по принятию PreviousPage в качестве необязательного параметра:

public FileStreamResult HmtltoPDF2(string PreviousPage = null)
{
    if (string.IsNullOrEmpty(PreviousPage))
    {
        PreviousPage = System.Web.HttpContext.Current.Request.UrlReferrer.AbsoluteUri;
    }
    ...

Измените свою ссылку, чтобы вызвать это действие, передав URL предыдущей страницы:
<a href="@Url.Action("HmtltoPDF2", "Applicant", new { PreviousPage = Url.Action("PDFOnePage", null, new { id = item.ID }, Request.Url.Scheme) })">PDF</a>

NB: Вам нужно передать схему во внутренний мир Url.Action вызовите так, чтобы он генерировал полный URL-адрес:
Абсолютные URL-адреса с использованием MVC (без методов расширения)[^]

Если вы хотите сделать это немного яснее:
@{
    string previousPath = Url.Action("PDFOnePage", null, new { id = item.ID }, Request.Url.Scheme);
    string exportPdfLink = Url.Action("HmtltoPDF2", "Applicant", new { PreviousPage = previousPage });
}
<a href="@exportPdfLink">PDF</a>