2012-07-27 143 views
1

我发现了一个How to break a PDF into parts教程演示如何或者通过网页或通过使用Adobe Acrobat最大文件大小来分割PDF文件转换成单独的PDF文件:如何使用C#按文件大小拆分PDF文件?

Tools > Split Document > Split document by File size

foundmanyexamples在计算器上如何用C#分页PDF。但我怎么做后者?如何使用C#以最大文件大小将PDF文件分割为多个PDF文件?

例如,假设我有一个70页,40 MB的PDF文件。如何将文件分成大约5个不超过10 MB的PDF文件(每个文件使用C#),而不是将它们分成7个PDF文件(每个文件10页)?

到目前为止,我所看到的最好的方法是在Using itextsharp to split a pdf into smaller pdf's based on size其中Cyfer13使用iTextSharp按页分割文件,然后按大小分组这些页面文件。但是,在没有首先分页的情况下,更直接的方式来实现这一点?

回答

1

这是一个未经测试示例代码,假设你准备在纯二进制级别分裂,即部件将不会受到PDF阅读器进行阅读,而你将不得不重新加入部分,使其可读:

下面的代码首先获取一个byte []数组中的pdf文件。然后根据任意分区大小(本例中为5)获取每个部分二进制文件的文件大小。然后,它将创建一个临时内存流并循环直至创建每个分区并写入新的.part文件。 (您可能需要进行一些更改才能使其可行)。

 byte[] pdfBytes = File.ReadAllBytes("c:\foo.pdf"); 
     int fileSize = pdfBytes.Length/5; //assuming foo is 40MB filesize will be abt 8MB 
     MemoryStream m = new MemoryStream(pdfBytes); 
     for (int i = 0; i < 4; i++) 
     { 
      byte[] tbytes = new byte[fileSize]; 
      m.Read(tbytes,i*fileSize,fileSize); 
      File.WriteAllBytes("C:\foo" + i + ".part",tbytes); 
     } 
+0

感谢您的回答,但我确实需要生成的文件为PDF格式。我已经更新了我的问题,以便更具体。 – 2012-07-27 19:10:57

+0

在这种情况下,也许您可​​以检查PDFSharp,这是一个开源库,可让您通过.NET处理PDF文件:http://pdfsharp.codeplex.com/ – 2012-07-27 19:15:47

2

PDFsharp Sample: Split Document开始,我写了下面SplitBySize方法:

public static void SplitBySize(string filename, long limit) 
{ 
    PdfDocument input = PdfReader.Open(filename, PdfDocumentOpenMode.Import); 
    PdfDocument output = CreateDocument(input); 

    string name = Path.GetFileNameWithoutExtension(filename); 
    string temp = string.Format("{0} - {1}.pdf", name, 0); 
    int j = 1; 
    for (int i = 0; i < input.PageCount; i++) 
    { 
     PdfPage page = input.Pages[i]; 
     output.AddPage(page); 
     output.Save(temp); 
     FileInfo info = new FileInfo(temp); 
     if (info.Length <= limit) 
     { 
      string path = string.Format("{0} - {1}.pdf", name, j); 
      if (File.Exists(path)) 
      { 
       File.Delete(path); 
      } 
      File.Move(temp, path); 
     } 
     else 
     { 
      if (output.PageCount > 1) 
      { 
       output = CreateDocument(input); 
       ++j; 
       --i; 
      } 
      else 
      { 
       throw new Exception(
        string.Format("Page #{0} is greater than the document size limit of {1} MB (size = {2})", 
        i + 1, 
        limit/1E6, 
        info.Length)); 
      } 
     } 
    } 
} 

我将继续测试,但它的工作至今。