使用hiqpdf将html转换为带有图像的pdf

时间:2015-03-04 09:30:52

标签: c# pdf pdf-generation html-to-pdf hiqpdf

我正在使用HiQPdf 8.0转换包含图片和css文件的html。我在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中尝试了它,它不再起作用了。我之前以同样的方式使用它,没有任何错误,但现在它不起作用。

2 个答案:

答案 0 :(得分:5)

找到一些您可能喜欢的文档here

  

生成的PDF文档中缺少图像和样式   转换器和脚本不会执行,因为这些元素是   我转换的HTML代码中的相对URL引用。我怎么能给   转换器用来解析这些元素的基本URL?

     

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

     

例如,如果您转换的HTML代码中引用了图像   with和图像可以从中访问   然后是http://www.example.com/Images/image.png完全限定的网址   您必须将http://www.example.com/设置为您的基本网址   应用代码。类似于引用的样式和脚本文件   您转换的HTML代码。

因此看起来您必须使用完全限定名称才能使其正常工作

答案 1 :(得分: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"/>