Pdf转换(笔记)

环境

  • .Net Framework 4.5.1
  • iTextSharp 5.5.13
  • itextsharp.xmlworker 5.5.13
  • Aspose.Cells 19.3.0
  • Aspose.Words 19.3.0
  • O2S.Components.PDFRender4NET 4.5.1.2

代码

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.UI.WebControls.WebParts;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;
using O2S.Components.PDFRender4NET;
using Font = iTextSharp.text.Font;
using TextDocument = iTextSharp.text.Document;
using TextParagraph = iTextSharp.text.Paragraph;
using Aspose.Words;
using AsposeDocument = Aspose.Words.Document;
using Aspose.Cells;
using Aspose.Pdf.Generator;
using PageSize = iTextSharp.text.PageSize;

namespace PdfDemo.Class
{
    public class PdfConvert
    {
        public enum Definition
        {
            One = 1, Two = 2, Three = 3, Four = 4, Five = 5, Six = 6, Seven = 7, Eight = 8, Nine = 9, Ten = 10
        }

        /// <summary>
        /// 创建第一个PDF文档
        /// </summary>
        public static void GenerateFirstPdf()
        {
            var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "first.pdf");

            TextDocument document = new TextDocument();

            PdfWriter writer = PdfWriter.GetInstance(document,new FileStream(filePath,FileMode.Create));

            document.Open();

            document.Add(new TextParagraph("Hello Word!"));

            document.Close();
        }

        /// <summary>
        /// html转换为pdf
        /// </summary>
        /// <param name="pHtml"></param>
        /// <returns></returns>
        public static byte[] HtmlToPdfFile(string pHtml)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                StringReader sr = new StringReader(pHtml);

                TextDocument pdfDoc = new TextDocument(PageSize.A4,10f,10f,10f,10f);
                
                PdfWriter writer = PdfWriter.GetInstance(pdfDoc,stream);

                pdfDoc.Open();

                XMLWorkerHelper.GetInstance().ParseXHtml(writer,pdfDoc,sr);

                pdfDoc.Close();
                return stream.ToArray();
            }
        }

        /// <summary>
        /// HTML转成PDF
        /// </summary>
        /// <param name="pHtml"></param>
        /// <returns></returns>
        public static byte[] HtmlToPdfBytes(string pHtml)
        {
            if (string.IsNullOrEmpty(pHtml))
            {
                return null;
            }

            var outputStream = new MemoryStream(); //要把PDF写入的流
            var data = Encoding.UTF8.GetBytes(pHtml); //把要转换的字符串转成bytes
            var msInput = new MemoryStream(data);
            var pdfDoc = new TextDocument(); //使用A4大小构建要写的PDF文件,默认也是A4

            var writer = PdfWriter.GetInstance(pdfDoc, outputStream);

            //为PDF文件添加页脚
            PageEventHelper pageEventHelper = new PageEventHelper();
            writer.PageEvent = pageEventHelper;


            var pdfDest = new PdfDestination(PdfDestination.XYZ, 0, pdfDoc.PageSize.Height, 1f);
            //开启Document文件
            pdfDoc.Open();

            //使用XMLWorkerHelper把HTML内容parse到PDF文档里
            //XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, msInput, null, Encoding.UTF8);
            XMLWorkerHelper.GetInstance()
                .ParseXHtml(writer, pdfDoc, msInput, null, Encoding.UTF8, new UnicodeFontFactory());

            //将pdfDest的设定写入PDF文档里
            var action = PdfAction.GotoLocalPage(1, pdfDest, writer);
            writer.SetOpenAction(action);
            pdfDoc.Close();
            msInput.Close();
            outputStream.Close();
            return outputStream.ToArray();
        }

        /// <summary>
        /// 将PDF文档转换为图片的方法
        /// </summary>
        /// <param name="pdfInputPath">PDF文件路径</param>
        /// <param name="imageOutputPath">图片输出路径</param>
        /// <param name="imageName">生成图片的名字</param>
        /// <param name="startPageNum">从PDF文档的第几页开始转换</param>
        /// <param name="endPageNum">从PDF文档的第几页开始停止转换</param>
        /// <param name="imageFormat">设置所需图片格式</param>
        /// <param name="definition">设置图片的清晰度,数字越大越清晰</param>
        public static void ConvertPDF2Image(string pdfInputPath, string imageOutputPath,
            string imageName, int startPageNum, int endPageNum, ImageFormat imageFormat, Definition definition)
        {
            PDFFile pdfFile = PDFFile.Open(pdfInputPath);
            if (!Directory.Exists(imageOutputPath))
            {
                Directory.CreateDirectory(imageOutputPath);
            }
            // validate pageNum
            if (startPageNum <= 0)
            {
                startPageNum = 1;
            }

            if (endPageNum > pdfFile.PageCount || endPageNum <= 0)
            {
                endPageNum = pdfFile.PageCount;
            }

            if (startPageNum > endPageNum)
            {
                int tempPageNum = startPageNum;
                startPageNum = endPageNum;
                endPageNum = startPageNum;
            }
            // start to convert each page
            for (int i = startPageNum; i <= endPageNum; i++)
            {
                Bitmap pageImage = pdfFile.GetPageImage(i - 1, 56 * (int)definition);
                pageImage.Save(imageOutputPath + imageName + i.ToString() + "." + imageFormat.ToString(), imageFormat);
                pageImage.Dispose();
            }
            pdfFile.Dispose();
        }

        public static string ConvertPDF2Image(string pdfInputPath,  Definition definition)
        {
            Stream res = null;
            using (var client = new HttpClient())
            {
                var response = client.GetAsync(pdfInputPath).Result;
                if (response.IsSuccessStatusCode)
                {
                     res = response.Content.ReadAsStreamAsync().Result;
                }
            }
            PDFFile pdfFile = PDFFile.Open(res);
            Bitmap pageImage = null;
            MemoryStream ms = null;
            try
            {
                pageImage = pdfFile.GetPageImage(0, 56 * (int)definition);
                if (pageImage != null)
                {
                    ms = new MemoryStream();
                    pageImage.Save(ms,ImageFormat.Png);
                    var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "PDF", "1.png");
//                    pageImage.Save(filePath);
                    byte[] arr = new byte[ms.Length];
                    ms.Position = 0;
                    ms.Read(arr, 0, (int) ms.Length);
                    ms.Close();
//                    return Convert.ToBase64String(arr);
                    var mms = new MemoryStream(arr);
                    FileStream fs = new FileStream(filePath,FileMode.CreateNew);
                    mms.WriteTo(fs);
                    return null;
                }

                return null;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return null;
            }
            finally
            {
                pageImage?.Dispose();
                pdfFile.Dispose();
            }

        }

        /// <summary>
        /// 使用Aspose插件把word或者excel转成pdf
        /// </summary>
        /// <param name="fileStream"></param>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static string OfficeToPdf(Stream fileStream,string fileName)
        {
            var index = fileName.LastIndexOf(".", StringComparison.Ordinal);
            var name = fileName.Substring(0, index + 1);
            var extension = fileName.Substring(index + 1);
            var pdfName = Path.Combine("PDF", name + ".pdf");
            var pdfPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, pdfName);
            switch (extension.ToLower())
            {
                case "docx":
                case "wps":
                    var doc = new AsposeDocument(fileStream);
                    doc.Save(pdfPath, Aspose.Words.SaveFormat.Pdf);
                    break;
                case "xlsx":
                case "xls":
                    var excel = new Workbook(fileStream);
                    excel.Save(pdfPath,Aspose.Cells.SaveFormat.Pdf);
                    break;
                case "pdf":
                    var pdf = new Aspose.Pdf.Document(fileStream);
                    pdf.Save(pdfPath, Aspose.Pdf.SaveFormat.Pdf);
                    break;
                    //case "pptx":
                    //    var pptx = new Aspose.Slides.Presentation(fileStream);
                    //    pptx.Save(pdfPath,Aspose.Slides.Export.SaveFormat.Pdf);
                    //    break;
            }
            
            return pdfName;
        }

        public static void Test(string pHtml)
        {
            var pdf = new Aspose.Pdf.Generator.Pdf();
            Aspose.Pdf.Generator.Section section = pdf.Sections.Add();
            Aspose.Pdf.Generator.Text text = new Text(section, pHtml);
            text.IsHtml5Supported = true;
            text.IfHtmlTagSupportedOverwriteHtmlFontNames = true;
            text.IfHtmlTagSupportedOverwriteHtmlFontSizes = true;

            section.Paragraphs.Add(text);
            pdf.HtmlInfo.BadHtmlHandlingStrategy = BadHtmlHandlingStrategy.TreatAsPlainText;
            pdf.HtmlInfo.ShowUnknownHtmlTagsAsText = true;
            //pdf.BindHTML(pHtml);
            var name = "pdfhaha";
            var pdfName = Path.Combine("PDF", name + ".pdf");
            var pdfPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, pdfName);
            pdf.Save(pdfPath);
        }
    }

    /// <summary>
    /// 自定义字体类
    /// </summary>
    public class UnicodeFontFactory : FontFactoryImp
    {
        private static readonly string _fontPath = Environment.GetFolderPath(Environment.SpecialFolder.Fonts);

        //宋体
        private static readonly string StFontPath = Path.Combine(_fontPath, "simsun.ttc,0");

        public override Font GetFont(string fontName, string encoding, bool embedded, float size, int style,
            BaseColor color, bool cached)
        {
            BaseFont baseFont = BaseFont.CreateFont(StFontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            return new Font(baseFont, size, style, color);
        }
    }

    public class PageEventHelper : PdfPageEventHelper
    {
        PdfContentByte cb;
        PdfTemplate template;


        public override void OnOpenDocument(PdfWriter writer, TextDocument document)
        {
            cb = writer.DirectContent;
            template = cb.CreateTemplate(100, 50);
        }

        public override void OnStartPage(PdfWriter writer, TextDocument document)
        {
            base.OnStartPage(writer, document);
        }

        public override void OnEndPage(PdfWriter writer, TextDocument document)
        {
            base.OnEndPage(writer, document);

            String text = "第" + writer.PageNumber.ToString() + "页";

            UnicodeFontFactory info = new UnicodeFontFactory();
            //float len = 10;
            float len = (document.PageSize.Width - document.LeftMargin - document.RightMargin) / 2;
            iTextSharp.text.Rectangle pageSize = document.PageSize;
            cb.SetRGBColorFill(100, 100, 100);

            string fontPath = Environment.GetFolderPath(Environment.SpecialFolder.Fonts);
            string stFontPath = Path.Combine(fontPath, "simsun.ttc,0");
            BaseFont baseFont = BaseFont.CreateFont(stFontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

            cb.BeginText();
            cb.SetFontAndSize(baseFont, 10);
            cb.SetTextMatrix(document.LeftMargin + len - 20, pageSize.GetBottom(document.BottomMargin));
            cb.ShowText(text);

            cb.EndText();

            cb.AddTemplate(template, document.LeftMargin + len, pageSize.GetBottom(document.BottomMargin));
        }

        public override void OnCloseDocument(PdfWriter writer, TextDocument document)
        {
            base.OnCloseDocument(writer, document);

            string fontPath = Environment.GetFolderPath(Environment.SpecialFolder.Fonts);
            string stFontPath = Path.Combine(fontPath, "simsun.ttc,0");
            BaseFont baseFont = BaseFont.CreateFont(stFontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

            template.BeginText();
            template.SetFontAndSize(baseFont, 10);
            template.SetTextMatrix(12, 0);
            template.ShowText("共" + writer.PageNumber + "页");
            template.EndText();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值