将pdf每页转为pdf图片文件且不会存在空白图片,并重新组合成一个新的pdf文件流返回

在某些情况中,为了不让原有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;

        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值