1

我正在使用HiQPdf 8.0. 我已经做过很多次了MVC 4。现在我正在工作MVC 5HiQPdf 8.0问题是HiQPdf 8.0没有加载外部文件,如 css 文件和图像。我通过在页面中的样式标签中扭动样式解决了 css 文件的问题,但不知道如何处理图像。这是我的解决方案:

byte[] pdf = RenderPdf(contractId.Value, personId.Value, addressId.Value, transportId.Value, peacockeryNumber, peacockeryDate);
System.IO.File.WriteAllBytes(path, pdf);

public byte[] RenderPdf(int contractId, int personId, int addressId, int transportId, string peacockeryNumber, string peacockeryDate)
{
    PdfPageViewModel model = new PdfPageViewModel();
    model.Contract = contractRepo.GetContract(contractId);
    model.Person = personRepo.GetPerson(personId);
    model.Supplier = supplierRepo.GetSupplier(model.Contract.SupplierCode, 1);
    model.Customer = customerRepo.GetCustomer(model.Contract.CustomerCode);
    model.Address = customerRepo.GetAddress(addressId);
    model.Transport = transportRepo.Detail(transportId);
    model.Header = settingRepo.GetSetting(Model.Settings.SettingType.Header);
    model.FooterAddress = settingRepo.GetSetting(Model.Settings.SettingType.Address);
    model.Sign = settingRepo.GetSetting(Model.Settings.SettingType.Sign);
    model.Stamp = settingRepo.GetSetting(Model.Settings.SettingType.Stamp);
    model.PeacockeryDate = peacockeryDate;
    model.PeacockeryNumber = peacockeryNumber;
    string htmlToConvert = RenderPdfAsString("HtmlPdf", model);
    String thisPageUrl = this.ControllerContext.HttpContext.Request.Url.AbsoluteUri;
    String baseUrl = thisPageUrl.Substring(0, thisPageUrl.Length - "Home/ConvertThisPageToPdf".Length);
    HtmlToPdf htmlToPdfConverter = new HtmlToPdf();
    htmlToPdfConverter.HiddenHtmlElements = new string[] { "#convertThisPageButtonDiv" };
    byte[] pdfBuffer = htmlToPdfConverter.ConvertHtmlToMemory(htmlToConvert, baseUrl);
    byte[] b = pdfBuffer;
    return b;
}

public string RenderPdfAsString(string viewName, object model)
{
    PdfPageViewModel pdfPage = (PdfPageViewModel)model;
    StringWriter stringWriter = new StringWriter();
    ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName, null);
    ViewContext viewContext = new ViewContext(
    ControllerContext,
    viewResult.View,
    new ViewDataDictionary(model),
    new TempDataDictionary(),
    stringWriter
    );
    viewResult.View.Render(viewContext, stringWriter);
    return stringWriter.ToString();
}

这是HtmlPdf视图:

<body id="prt-body" style="font-family: 'B Nazanin'">
    <div class="prt-container">
        <header id="prt-header">
            <div id="prt-header-logo">
                <img src="~/Images/logo.png" />
            </div>
            <ul id="prt-header-information">
                <li><span>تاریخ: </span>
                    <label>@Paristan.Broker.UI.Components.PersianDate.GetDate(DateTime.Now)</label></li>
                <li><span>شماره: </span>
                    <label>93323448/1</label></li>
                <li><span>پیوست:</span><label>......................</label></li>
            </ul>
            <div class="clear"></div>
        </header>
        <div id="prt-main">
            <ul id="prt-main-information">
                <li><span>@Model.Person.Title</span><label></label></li>
                <li><span>@Model.Person.Name</span><label></label></li>
                <li><span>@Model.Supplier.Name</span></li>
            </ul>
            <div class="prt-main-message">@Html.Raw(Model.Header.Value.Replace("#Date", Model.Contract.ContractDate))</div>
            <ul id="prt-main-tables">
                <li>
                    <label>1) مشخصات کالا: </label>
                    <table class="prt-fiveTD">
                        <tr>
                            <th>نام محصول</th>
                            <th>گرید</th>
                            <th>تاریخ قرار داد</th>
                            <th>شماره قرار داد</th>
                            <th>شماره قرار داد جز</th>
                        </tr>
                        <tr>
                            <td>@Model.Contract.CommercialName</td>
                            <td>@Model.Contract.ProductSymbol</td>
                            <td>@Model.Contract.ContractDate</td>
                            <td>@Model.Contract.ContractNumber</td>
                            <td>@Model.Contract.ComponentNumber</td>
                        </tr>
                    </table>
                </li>
                <li>
                    <label>2) مشخصات خریدار: </label>
                    <table class="prt-fourTD">
                        <tr>
                            <th>نام خریدار</th>
                            <th>کدشناسنامه پتروشیمی</th>
                            <th>کد اقتصاد</th>
                            <th>شماره ثبت / محل ثبت</th>
                        </tr>
                        <tr>
                            <td>@Model.Customer.Name</td>
                            <td>@Model.Customer.PetroChemicalCode</td>
                            <td>@Model.Customer.EconomyCode</td>
                            <td>@Model.Customer.RegisterLocation/@Model.Customer.RegisterNumber</td>
                        </tr>
                    </table>
                    <table class="prt-fourTD">
                        <tr>
                            <th>کدشناسنامه ملی</th>
                            <th>کد پستی</th>
                            <th>تلفن</th>
                            <th>نام نماینده / تلفن نماینده</th>
                        </tr>
                        <tr>
                            <td>@Model.Customer.CodeMelli</td>
                            <td>@Model.Customer.PostalCode</td>
                            <td>@Model.Customer.PhoneNumber</td>
                            <td>@Model.Customer.DelegacyPhoneNumber/@Model.Customer.DelegacyName</td>
                        </tr>
                    </table>
                    <table class="prt-twoTD">
                        <tr>
                            <th>آدرس</th>
                        </tr>
                        <tr>
                            <td>@Model.Customer.Address</td>
                        </tr>
                    </table>
                </li>
                <li>
                    <label>3) مشخصات قرار داد (ارقام با ریال): </label>
                    <table class="prt-fiveTD">
                        <tr>
                            <th>نوع معامله</th>
                            <th>حجم (کیلوگرم)</th>
                            <th>قیمت واحد</th>
                            <th>مبلغ کل خرید</th>
                            <th>کارمزد فروش</th>
                        </tr>
                        <tr>
                            @{double totalAmount = int.Parse(Model.Contract.Amount) * int.Parse(Model.Contract.Price);
                              double wage = totalAmount * 0.00278;
                              double settlementAmount = totalAmount * 0.99722;
                              double tax = totalAmount * 0.08;}
                            <td>@Model.Contract.ContractType</td>
                            <td>@Model.Contract.Amount</td>
                            <td>@Model.Contract.Price</td>
                            <td>@totalAmount</td>
                            <td>@wage</td>
                        </tr>
                    </table>
                    <table class="prt-fourTD">
                        <tr>
                            <th>مبلغ واریز به حساب فروشنده</th>
                            <th>مالیات بر ارزش افزوده معامله</th>
                            <th>شماره فیش واریزی vat</th>
                            <th>تاریخ فیش واریز vat</th>
                        </tr>
                        <tr>
                            <td>@settlementAmount</td>
                            <td>@tax</td>
                            <td>@Model.PeacockeryNumber</td>
                            <td>@Model.PeacockeryDate</td>
                        </tr>
                    </table>
                </li>
                <li>
                    <label>4) پیمانکار حمل: </label>
                    <table class="prt-twoTD">
                        <tr>
                            <th>نام پیمانکار</th>
                            <th>کد پیمانکار</th>
                        </tr>
                        <tr>
                            <td>@Model.Transport.Name</td>
                            <td>@Model.Transport.TransportCode</td>
                        </tr>
                    </table>
                </li>
                <li>
                    <label>5) آدرس محل تخلیه: </label>
                    <table class="prt-oneTD">
                        <tr>
                            <th>آدرس مقصد (تخلیه)</th>
                        </tr>
                        <tr>
                            <td>@Model.Address.EvacuationAddress</td>
                        </tr>
                    </table>
                </li>
                <li>
                    <label>6) توضیحات: خوانده شده از فایل معاملات </label>
                </li>
            </ul>
        </div>
        <footer id="prt-footer">
            <div id="prt-footer-img">
                <img src="Files/Sign/@Model.Sign.Value" />
                <img src="Files/Stamp/@Model.Stamp.Value" />
            </div>
            <div id="prt-footer-address">@Html.Raw(Model.FooterAddress.Value)</div>
        </footer>
        <div class="clear"></div>
    </div>
</body>

但是输出pdf中有一些空框而不是图像。是有MVC 5问题HiQPdf还是有其他问题?

更新

我在MVC 4.Net 4 和 4.5 中尝试过,但它不再工作了。我以前以同样的方式使用过它,没有任何问题,但现在它不起作用。

4

2 回答 2

7

在这里找到一些您可能会喜欢的文档

转换器生成的 PDF 文档中缺少图像和样式,并且脚本未执行,因为这些元素被我转换的 HTML 代码中的相对 URL 引用。如何提供转换器使用的基本 URL 来解析这些元素?

转换 HtmlToPdf、HtmlToImage 和 HtmlToSvg 类的 HTML 代码的方法以及 PdfHtml 和 PdfHtmlImage 类的构造函数具有一个 baseUrl 参数,HiQPdf HTML 转换器可以使用该参数来解析在您转换的 HTML 代码中找到的相对 URL。

例如,如果在您转换的 HTML 代码中引用了图像,并且可以从http://www.example.com/Images/image.png完全限定的 URL 访问该图像,那么您必须设置http:/ /www.example.com/作为应用程序代码中的基本 URL。与您转换的 HTML 代码中引用的样式和脚本文件类似。

所以看起来你必须使用完全限定的名称才能让它工作

于 2015-03-08T16:25:21.653 回答
0

我正在添加我的代码片段,因为接受的答案正在解决问题,但它缺少代码示例。文件位于asp net core项目中

wwwroot/images/logo.png

c# 代码

        HtmlToPdf htmlToPdfConverter = new HtmlToPdf();
        htmlToPdfConverter.Document.PageOrientation = PdfPageOrientation.Landscape;

        // razor view to string
        string htmlToConvert = await RenderViewHelper.RenderViewAsync(context, "document_chtml", model);

        // add base url to constructor
        byte[] pdfBuffer = htmlToPdfConverter.ConvertHtmlToMemory(htmlToConvert, $"{this.Request.Scheme}://{this.Request.Host}");

        Response.Headers.Add("Content-Disposition", "inline; filename=document.pdf");
        Response.ContentType = "application/pdf";
        Response.ContentLength = pdfBuffer.Length;

        return new FileContentResult(pdfBuffer, "application/pdf");

剃刀代码

<img alt="logo" src="~/images/logo.png" title="logo"/>
于 2021-01-25T13:01:20.433 回答