PdfHelper,获取Pdf首图
- 开发笔记
- 2024/1/25 16:48:13
- 人已阅读
简介
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;
}
}
}
}
上一篇:获取随机编码
下一篇:List递归获取所有上级和下级:
文章评论
- 消灭零回复