zoukankan      html  css  js  c++  java
  • 使用ItextSharop合并pdf文件,体积变大的解决

    通用的合并方式导致输出的pdf 文件中嵌入了大量的重复字体。导致文件体积膨胀。

    使用基于内存流的方式,读取文件字节,可以解决重复字体的嵌入问题;

     1    public static string MergeFiles(string targetPdfFilesDir)
     2         {
     3             string outPath = string.Empty;
     4             //验证文件是否存在
     5             if (!Directory.Exists(targetPdfFilesDir))
     6             {
     7                 throw new FileNotFoundException("指定的目录不存在:" + targetPdfFilesDir);
     8             }
     9 
    10             var filePathList = Directory.EnumerateFiles(targetPdfFilesDir, "*.pdf");
    11             if (filePathList.IsEmpty())
    12             {
    13                 return outPath;
    14             }
    15 
    16             //合并pdf文件
    17 
    18             string runningDir = AppDomainTypeFinder.Instance.GetBinDirectory();
    19 
    20             outPath = Path.Combine(runningDir, "temp", Guid.NewGuid().ToString() + ".pdf");
    21 
    22             MergeFiles(outPath, filePathList.ToArray());
    23 
    24             return outPath;
    25         }
    26 
    27 
    28         public static void MergeFiles(string destinationFile, string[] sourceFiles)
    29         {
    30 
    31             try
    32             {
    33 
    34                 byte[] bs = MergePDFs(sourceFiles);
    35                 using (var fsm = new FileStream(destinationFile, FileMode.Create))
    36                 {
    37                     fsm.Write(bs, 0, bs.Length);
    38                     fsm.Flush();
    39                 }
    40 
    41             }
    42             catch (Exception e)
    43             {
    44                 string strOb = e.Message;
    45             }
    46         }
    47         /// <summary>
    48         /// 合并多个pdf文件,并返回合并后的文件字节
    49         /// </summary>
    50         /// <param name="pdfFiles"></param>
    51         /// <returns></returns>
    52         private static byte[] MergePDFs(string[] pdfFiles)
    53         {
    54             if (pdfFiles == null || pdfFiles.Length <= 0)
    55             {
    56                 return null;
    57             }
    58             if (pdfFiles.Length == 1)
    59             {
    60                 return File.ReadAllBytes(pdfFiles[0]);
    61             }
    62 
    63 
    64             PdfReader reader;
    65             Document document;
    66             PdfWriter writer;
    67             MemoryStream msFinalPdf;
    68             using (msFinalPdf = new MemoryStream())
    69             {
    70 
    71                 reader = new PdfReader(pdfFiles[0]);
    72                 using (document = new Document())
    73                 {
    74                     //一个PdfSmartCopy基类
    75                     writer = new PdfSmartCopy(document, msFinalPdf);
    76                     document.Open();
    77 
    78                     for (int k = 0; k < pdfFiles.Length; k++)
    79                     {
    80                         reader = new PdfReader(pdfFiles[k]);
    81                         //将子文件中的页都追加到尾部
    82                         for (int i = 1; i < reader.NumberOfPages + 1; i++)
    83                         {
    84                             ((PdfSmartCopy)writer).AddPage(writer.GetImportedPage(reader, i));
    85                         }
    86                         writer.FreeReader(reader);
    87 
    88                     }
    89                     reader.Close();
    90                     writer.Close();
    91                     document.Close();
    92                 }
    93             }
    94 
    95             return msFinalPdf.ToArray();
    96         }


    下面的代码合并pdf 就会产生体积增加。字体重复被嵌入的问题

    public static void MergeFiles(string destinationFile, string[] sourceFiles)
    {
    
        try
        {
            int f = 0;
            // we create a reader for a certain document
            PdfReader reader = new PdfReader(sourceFiles[f]);
            // we retrieve the total number of pages
            int n = reader.NumberOfPages;
            //Console.WriteLine("There are " + n + " pages in the original file.");
            // step 1: creation of a document-object
            Document document = new Document(reader.GetPageSizeWithRotation(1));
            // step 2: we create a writer that listens to the document
            PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(destinationFile, FileMode.Create));
            // step 3: we open the document
            document.Open();
            PdfContentByte cb = writer.DirectContent;
            PdfImportedPage page;
            int rotation;
            // step 4: we add content
            while (f < sourceFiles.Length)
            {
                int i = 0;
                while (i < n)
                {
                    i++;
                    document.SetPageSize(reader.GetPageSizeWithRotation(i));
                    document.NewPage();
                    page = writer.GetImportedPage(reader, i);
                    rotation = reader.GetPageRotation(i);
                    if (rotation == 90 || rotation == 270)
                    {
                        cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height);
                    }
                    else
                    {
                        cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                    }
                    //Console.WriteLine("Processed page " + i);
                }
                f++;
                if (f < sourceFiles.Length)
                {
                    reader = new PdfReader(sourceFiles[f]);
                    // we retrieve the total number of pages
                    n = reader.NumberOfPages;
                    //Console.WriteLine("There are " + n + " pages in the original file.");
                }
            }
            // step 5: we close the document
            document.Close();
        }
        catch (Exception e)
        {
            string strOb = e.Message;
        }
    }

    ----下面也会产生重复字体嵌入的----
     public static void Merge(List<String> InFiles, String OutFile)
        {
    
            using (FileStream stream = new FileStream(OutFile, FileMode.Create))
            using (Document doc = new Document())
            using (PdfCopy pdf = new PdfCopy(doc, stream))
            {
                doc.Open();
    
                PdfReader reader = null;
                PdfImportedPage page = null;
    
                //fixed typo
                InFiles.ForEach(file =>
                {
                    reader = new PdfReader(file);
    
                    for (int i = 0; i < reader.NumberOfPages; i++)
                    {
                        page = pdf.GetImportedPage(reader, i + 1);
                        pdf.AddPage(page);
                    }
    
                    pdf.FreeReader(reader);
                    reader.Close();
                    File.Delete(file);
                });
            }
  • 相关阅读:
    编写OracleMembershipProvider,让SharePoint2007使用Oralce中的用户数据实现Form验证。 (第三天)
    学习《Building Applications with FME Objects》 之一 关于FME Objects
    我们在这里期待~~
    用python写fme数据转换脚本
    学习《Building Applications with FME Objects》 之七 坐标系统
    菜鸟笔记Linq初学 top(2)
    菜鸟笔记Linq初学 top(1)
    Sqlserver2008R2搭建本地服务器
    Python3之列表、元组和购物车程序练习
    Python3之字符串
  • 原文地址:https://www.cnblogs.com/micro-chen/p/11093364.html
Copyright © 2011-2022 走看看