使用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); }); }

猜你喜欢

转载自www.cnblogs.com/micro-chen/p/11093364.html