• html转pdf


    直接将html转换成pdf,用过其他的几种方式效果相当的不理想。最后找到wkhtmltopdf转换pdf效果还比较好,以下是解决方案。

    第一步:下载wkhtmltopdf,加压并找到wkhtmltopdf.exe文件,可以将wkhtmltopdf.exe文件放到任意位置,建议放到程序的根目录中。

    第二步:通过c#进程调用wkhtmltopdf.exe将html转换成pdf文件。以下是转换方法。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using System.IO;
    using System.Diagnostics;
    using System.Configuration;
    
    namespace GH.TechnicalSupervision.BLL2
    {
        public class PdfHelper
        {
            /// <summary>
            /// HTML转换为PDF
            /// </summary>
            /// <param name="htmlPath">可以是本地路径,也可以是网络地址</param>
            /// <param name="savePath">PDF文件保存的路径</param>
            /// <returns></returns>
            public bool HtmlConvertToPdf(string pdfExePath,string htmlPath, string savePath)
            {
                bool flag = false;
                CheckFilePath(savePath);
    
                ///这个路径为程序集的目录,因为我把应用程序 wkhtmltopdf.exe 放在了程序集同一个目录下
                //string exePath = AppDomain.CurrentDomain.BaseDirectory.ToString() + "wkhtmltopdf.exe";"";
                //string exePath = "C:\Program Files (x86)\wkhtmltopdf\bin\wkhtmltopdf.exe";
                string exePath = pdfExePath;
                if (!File.Exists(exePath))
                {
                    throw new Exception("No application wkhtmltopdf.exe was found.");
                }
    
                try
                {
                    ProcessStartInfo processStartInfo = new ProcessStartInfo();
                    processStartInfo.FileName = exePath;
                    processStartInfo.WorkingDirectory = Path.GetDirectoryName(exePath);
                    processStartInfo.UseShellExecute = false;
                    processStartInfo.CreateNoWindow = true;
                    processStartInfo.RedirectStandardInput = true;
                    processStartInfo.RedirectStandardOutput = true;
                    processStartInfo.RedirectStandardError = true;
                    processStartInfo.Arguments = GetArguments(htmlPath, savePath);
    
                    Process process = new Process();
                    process.StartInfo = processStartInfo;
                    process.Start();
                    process.WaitForExit();
    
                    ///用于查看是否返回错误信息
                    //StreamReader srone = process.StandardError;
                    //StreamReader srtwo = process.StandardOutput;
                    //string ss1 = srone.ReadToEnd();
                    //string ss2 = srtwo.ReadToEnd();
                    //srone.Close();
                    //srone.Dispose();
                    //srtwo.Close();
                    //srtwo.Dispose();
    
                    process.Close();
                    process.Dispose();
    
                    flag = true;
                }
                catch
                {
                    flag = false;
                }
                return flag;
            }
    
            /// <summary>
            /// 获取命令行参数
            /// </summary>
            /// <param name="htmlPath"></param>
            /// <param name="savePath"></param>
            /// <returns></returns>
            private string GetArguments(string htmlPath, string savePath)
            {
                if (string.IsNullOrEmpty(htmlPath))
                {
                    throw new Exception("HTML local path or network address can not be empty.");
                }
    
                if (string.IsNullOrEmpty(savePath))
                {
                    throw new Exception("The path saved by the PDF document can not be empty.");
                }
    
                StringBuilder stringBuilder = new StringBuilder();
                //stringBuilder.Append(" --page-height 100 ");        //页面高度100mm
                //stringBuilder.Append(" --page-width 100 ");         //页面宽度100mm
                //stringBuilder.Append(" --header-center 我是页眉 ");  //设置居中显示页眉
                //stringBuilder.Append(" --header-line ");         //页眉和内容之间显示一条直线
                //stringBuilder.Append(" --footer-center "Page [page] of [topage]" ");    //设置居中显示页脚
                //stringBuilder.Append(" --footer-line ");       //页脚和内容之间显示一条直线
                stringBuilder.Append(" " + htmlPath + " ");       //本地 HTML 的文件路径或网页 HTML 的URL地址
                stringBuilder.Append(" " + savePath + " ");       //生成的 PDF 文档的保存路径
                return stringBuilder.ToString();
            }
    
            /// <summary>
            /// 验证保存路径
            /// </summary>
            /// <param name="savePath"></param>
            private void CheckFilePath(string savePath)
            {
                string ext = string.Empty;
                string path = string.Empty;
                string fileName = string.Empty;
    
                ext = Path.GetExtension(savePath);
                if (string.IsNullOrEmpty(ext) || ext.ToLower() != ".pdf")
                {
                    throw new Exception("Extension error:This method is used to generate PDF files.");
                }
    
                fileName = Path.GetFileName(savePath);
                if (string.IsNullOrEmpty(fileName))
                {
                    throw new Exception("File name is empty.");
                }
    
                try
                {
                    path = savePath.Substring(0, savePath.IndexOf(fileName));
                    if (!Directory.Exists(path))
                    {
                        Directory.CreateDirectory(path);
                    }
                }
                catch
                {
                    throw new Exception("The file path does not exist.");
                }
            }
        }
    }
    

      

    注意:转换的网页的字体有可能wkhtmltopdf不识别,导致转换后的pdf文件出现乱码。比如“宋体”不识别,但是“新宋体”能识别。

  • 相关阅读:
    杨辉三角
    手动实现md5加密
    戳气球
    重构字符串
    四数相加 II
    背包问题 II
    组合总和 IV
    背包问题 V
    背包问题
    Win 10安装Python及环境变量配置
  • 原文地址:https://www.cnblogs.com/guohu/p/8460907.html
Copyright © 2020-2023  润新知