最近恰好遇到了一个需求,需要将存储发票信息的pdf文件,转换成为图片文件并提供下载。因为pdf的内容是固定的,只有一页,最终在经过了一番百度之后,最终选择使用了Spire.PDF。
引用的dll文件可以通过NuGet进行下载:
这里需要选择下面的 FreeSpire.PDF, 这是免费的,但在创建和加载PDF文档时,文档的内容不能超过10页、转换图片时,仅支持转换前3页。
虽然如此,但也足够满足我当前的需求了。转换的代码大致如下:
using Spire.Pdf;
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
/// <summary>
/// 将pdf文件转换为图片文件
/// </summary>
/// <param name="stream">pdf文件流</param>
/// <param name="pageIndex">要转换的pdf页索引(从0开始)</param>
/// <param name="dpiX">dpi</param>
/// <param name="dpiY">dpi</param>
/// <param name="mimeType">mime类型</param>
/// <returns></returns>
public static Stream PdfToImage(Stream stream, int pageIndex = 0, int dpiX = 300, int dpiY = 300, string mimeType = "image/png")
{
using (PdfDocument document = new PdfDocument())
{
document.LoadFromStream(stream);
// 图片类型选择为Bitmap
Spire.Pdf.Graphics.PdfImageType pdfImageType = Spire.Pdf.Graphics.PdfImageType.Bitmap;
// 将pdf中指定的页码转换为图片对象并返回
using (Image image = document.SaveAsImage(pageIndex, pdfImageType, dpiX, dpiY))
{
// 获取相应的编码器
ImageCodecInfo codecInfo = (
from item in ImageCodecInfo.GetImageEncoders()
where mimeType.Equals(item.MimeType)
select item
).FirstOrDefault();
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
MemoryStream result = new MemoryStream();
image.Save(result, codecInfo, encoderParams);
result.Position = 0;
return result;
}
}
}
static void Main(string[] args)
{
using (Stream stream = PdfToImage(File.Open(@"C:\pdf转图片\ConsoleApp1\lib\1.pdf", FileMode.Open)))
{
using (FileStream fileStream = new FileStream(@"C:\pdf转图片\ConsoleApp1\lib\2.png", FileMode.Create, FileAccess.Write))
{
stream.CopyTo(fileStream);
}
}
Console.WriteLine("OK");
Console.ReadKey();
}
}
}