在某些情况中,为了不让原有pdf中的一些关键信息被别人查看,这时候我们可以把pdf每一页转为图片,然后再把图片放入到一个新的pdf文档中。为了实现这一目标需要使用O2S.Components.PDFRender4Net.Win包。
public enum Definition
{
One = 1, Two = 2, Three = 3, Four = 4, Five = 5, Six = 6, Seven = 7, Eight = 8, Nine = 9, Ten = 10
}
public class PDFTranImgHelp
{
/// <summary>
/// 将PDF文档转换为图片的方法
/// </summary>
/// <param name="fileName">文件名称</param>
/// <param name="definition">设置图片的清晰度,数字越大越清晰</param>
public static Stream ConvertPDF2Image(string fileName,Stream pdfStream,
ImageFormat imageFormat, Definition definition)
{
PDFFile pdfFile = PDFFile.Open(pdfStream);
//文件流字典 k文件名 v为该文件名对应的流文件
Dictionary<string, byte[]> fileBytesDic = new Dictionary<string, byte[]>();
Dictionary<string, Stream> fileStreamDic = new Dictionary<string, Stream>();
// start to convert each page
for (int i = 0; i < pdfFile.PageCount; i++)
{
using (MemoryStream ms = new())
{
Bitmap pageImage = pdfFile.GetPageImage(i, 56 * (int)definition);
//pageImage.Save(imageOutputPath + fileName +"-"+ i.ToString() + "." + imageFormat.ToString(), imageFormat);
pageImage.Save(ms, ImageFormat.Jpeg);
/*byte[] tempBytes = new byte[ms.Length];
ms.Write(tempBytes, 0, tempBytes.Length);*/
ms.Seek(0, SeekOrigin.Begin);
MemoryStream tempUseStream = new MemoryStream();
ms.CopyTo(tempUseStream);
fileStreamDic.Add(fileName + "-" + (i+1).ToString() + "." + imageFormat.ToString(), tempUseStream);
pageImage.Dispose();
}
}
pdfFile.Dispose();
var newPdfStream=MergeFileToPDF(fileStreamDic.Values.ToList());
return /*PackageManyZip(fileStreamDic)*/newPdfStream;
}
/// <summary>
///
/// </summary>
/// <param name="files"></param>
/// <returns></returns>
public static Stream MergeFileToPDF(List<Stream> files)
{
iTextSharp.text.Document document = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 25, 25, 25, 25);
MemoryStream memoryStream = new MemoryStream();
try
{
var pdfWriter=iTextSharp.text.pdf.PdfWriter.GetInstance(document, memoryStream);
document.Open();
iTextSharp.text.Image image;
foreach (var item in files)
{
item.Seek(0, SeekOrigin.Begin);
image = iTextSharp.text.Image.GetInstance(item);
if (image.Height > iTextSharp.text.PageSize.A4.Height - 25)
{
image.ScaleToFit(iTextSharp.text.PageSize.A4.Width - 25, iTextSharp.text.PageSize.A4.Height - 25);
}
else if (image.Width > iTextSharp.text.PageSize.A4.Width - 25)
{
image.ScaleToFit(iTextSharp.text.PageSize.A4.Width - 25, iTextSharp.text.PageSize.A4.Height - 25);
}
image.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE;
document.NewPage();
document.Add(image);
}
pdfWriter.CloseStream = false;//pdfWriter不关闭流
document.Close();//关闭文档 这里关闭文档 如果不加pdfWriter.CloseStream = false这句话 下面的memoryStream不可用 如果在关闭之前使用一个新的ms来接受会导致文件损坏 唯一的办法就是关闭文档不关闭写入的流
memoryStream.Seek(0, SeekOrigin.Begin);
}
catch (Exception ex)
{
Console.WriteLine("转换失败,原因:" + ex.Message);
}
return memoryStream;
}