PdfHelper,获取Pdf首图

  • binGe博客
  • 开发笔记
  • 2024/1/25 16:48:13
  • 人已阅读
简介
 
比较靠谱,采用剪裁的方式将AsposePdf的水印剔除。参考:https://www.cnblogs.com/gmval/p/16938931.html

using Aspose.Pdf;
using Aspose.Pdf.Devices;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
using Spire.Pdf;
using System.IO;
using System.Text;
namespace AssessmentTraining.NuGet.Other
{
    /// <summary>
    ///
    /// </summary>
    public class PdfHelper
    {
        /// <summary>
        /// 获取Pdf首图:一样也要依赖gswin64.exe,暂时放弃这么使用
        /// </summary>
        /// <param name="pdfFilePath"></param>
        /// <param name="outputImagePath"></param>
        /// <returns></returns>
        public static async Task<bool> PdfToImage(string pdfFilePath, string  outputImagePath)
        {
            //MagickReadSettings settings = new MagickReadSettings();
            //settings.Density = new Density(300, 300); //设置质量
            //using (MagickImageCollection images = new MagickImageCollection())
            //{
            //    try
            //    {
            //        await images.ReadAsync(pdfFilePath, settings);
            //        //for (int i = 0; i < images.Count; i++)
            //        //{
            //        //    MagickImage image = (MagickImage)images[i];
            //        //    image.Format = MagickFormat.Jpg;
            //        //    image.Write(pdfFilePath.Replace(".pdf", "") + (i + 1) +  ".jpg");
            //        //}
            //        MagickImage image = (MagickImage)images[0];
            //        image.Format = MagickFormat.Jpg;
            //        image.Write(outputImagePath);
            //    }
            //    catch (Exception ex)
            //    {
            //        Console.WriteLine(ex.Message);
            //        return false;
            //    }
            //}
            return true;
        }
        /// <summary>
        /// 获取Pdf首图:一样也要依赖gswin64.exe,暂时放弃这么使用
        /// </summary>
        /// <param name="pdfFileStream"></param>
        /// <param name="outputImagePath"></param>
        /// <returns></returns>
        public static async Task<bool> PdfToImage(Stream pdfFileStream, string  outputImagePath)
        {
            //ImageMagick.MagickReadSettings settings = new  ImageMagick.MagickReadSettings();
            //settings.Density = new ImageMagick.Density(300, 300); //设置质量
            //using (ImageMagick.MagickImageCollection images = new  ImageMagick.MagickImageCollection())
            //{
            //    try
            //    {
            //        pdfFileStream.Seek(0, SeekOrigin.Begin);
            //        await images.ReadAsync(pdfFileStream, settings);
            //        //for (int i = 0; i < images.Count; i++)
            //        //{
            //        //    MagickImage image = (MagickImage)images[i];
            //        //    image.Format = MagickFormat.Jpg;
            //        //    image.Write(pdfFilePath.Replace(".pdf", "") + (i + 1) +  ".jpg");
            //        //}
            //        ImageMagick.MagickImage image =  (ImageMagick.MagickImage)images[0];
            //        image.Format = ImageMagick.MagickFormat.Jpg;
            //        image.Write(outputImagePath);
            //    }
            //    catch (Exception ex)
            //    {
            //        Console.WriteLine(ex.Message);
            //        return false;
            //    }
            //}
            return true;
        }
        /// <summary>
        /// SpirePdfToImage
        /// </summary>
        /// <param name="sPdfFilePath"></param>
        /// <param name="desPdfCoverFileName"></param>
        /// <returns></returns>
        public static bool SpirePdfToImage(Stream sPdfFilePath, string  desPdfCoverFileName)
        {
            PdfDocument doc = new PdfDocument(sPdfFilePath);
            System.Drawing.Image img = doc.SaveAsImage(0,  Spire.Pdf.Graphics.PdfImageType.Bitmap, 300, 300);
            img.Save(desPdfCoverFileName);
            //CentOs下提示:The type initializer for 'Gdip' threw an exception,未解决。暂弃
            return true;
        }
        /// <summary>
        /// 获取Pdf首图
        /// </summary>
        /// <param name="pdfFileStream"></param>
        /// <param name="outputImagePath"></param>
        /// <param name="watermarkHeight"></param>
        /// <returns></returns>
        public static async Task<bool> AsposePdfToImage(Stream pdfFileStream,  string outputImagePath, int watermarkHeight)
        {
            // Open PDF document
            Document pdfDocument = new Document(pdfFileStream);
            // Set page index
            int page = 1;
            // Create FileStream for the output image
            using (FileStream imageStream = new FileStream(outputImagePath,  FileMode.Create))
            {
                // Create Resolution object
                Resolution resolution = new Resolution(300);
                // Create Png device with specified attributes
                // Width, Height, Resolution
                PngDevice PngDevice = new PngDevice(resolution);//500, 700,  resolution
                // Convert a particular page and save the image to stream
                PngDevice.Process(pdfDocument.Pages[page], imageStream);
                // Close stream
                imageStream.Close();
            }
            //剔除水印
            using var image = SixLabors.ImageSharp.Image.Load(outputImagePath);
            //方案1:使用固定水印覆盖原有水印
            //using var watermark =  SixLabors.ImageSharp.Image.Load(AppDomain.CurrentDomain.BaseDirectory +  "/watermark500.png");
            //image.Mutate(x => x.DrawImage(watermark, new  SixLabors.ImageSharp.Point(10, 10), 1f));
            //方案2:在图像上绘制一个白色的矩形覆盖水印
            //image.Mutate(x => x.Fill(SixLabors.ImageSharp.Color.White, new  SixLabors.ImageSharp.Rectangle(0, 0, 500, 50)));
            ////watermark.Mutate(x => x.Resize(new SixLabors.ImageSharp.Size(100,  100)));
            ////watermark.Mutate(x =>  x.BackgroundColor(SixLabors.ImageSharp.Color.Black));
            ////watermark.Mutate(x => x.Opacity(0.5f));
            //方案3:直接裁剪,最佳。目前水印高度30
            image.Mutate(x => x.Crop(new SixLabors.ImageSharp.Rectangle(0,  watermarkHeight, image.Width, image.Height - watermarkHeight)));
            image.Save(outputImagePath.Replace(".jpg", "_watermark.jpg"));
            return true;
        }
        /// <summary>
        /// PDF转png:利用ghostscript的gswin64.exe,此方案不太靠谱,需执行文件夹下的exe
        /// </summary>
        /// <param name="pdfPath"></param>
        /// <param name="pngPath"></param>
        /// <returns></returns>
        public static bool Pdf2Jpg(string pdfPath, string pngPath)
        {
            try
            {
                string gsPath = AppDomain.CurrentDomain.BaseDirectory;
                //方法传入的参数  name   是文件名地址 下面会用到。
                StringBuilder str = new StringBuilder();
                //引用CMD的东西
                System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo.FileName = "cmd.exe";
                p.StartInfo.UseShellExecute = false;    //是否使用操作系统shell启动
                p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
                p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
                p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
                p.StartInfo.CreateNoWindow = true;//不显示程序窗口
                p.Start();//启动CMD程序
                p.StandardInput.WriteLine("path " + gsPath);    //定位到安装目录下
                p.StandardInput.AutoFlush = true;
                str.AppendFormat(@"gswin64.exe -r600*600 -q -dNOPAUSE  -sDEVICE=pngalpha -sOutputFile={0} {1} -c quit", pngPath, pdfPath);
                p.StandardInput.WriteLine(str);//向CMD输出 组装后的str
                p.StandardInput.WriteLine("exit");//结束 不然可能会假死
                string output = p.StandardOutput.ReadToEnd();//读取CMD的返回结果
                Console.WriteLine("CMD界面返回结果\n" + output + "\n");
                p.WaitForExit();//等待程序执行完退出进程
                p.Close();
                return true;
            }
            catch (Exception ex)
            {
                //日志记录异常
                return false;
            }
        }
    }
}

文章评论

评论
  • 消灭零回复
Top