1

我找到了如何将 PDF 分解为多个部分的教程,该教程演示了如何使用 Adob​​e Acrobat 按页面或最大文件大小将 PDF 文件拆分为单独的 PDF 文件:

工具 > 拆分文档 > 按文件大小拆分文档

我在 StackOverflow 上找到 了很多 关于如何使用 C# 逐页拆分 PDF 的示例。但是我该怎么做后者呢?如何使用 C# 按最大文件大小将 PDF 文件拆分为多个 PDF 文件?

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

到目前为止,我见过的最好的方法是使用 itextsharp 根据大小将 pdf 拆分为更小的 pdf,其中Cyfer13使用iTextSharp按页面拆分文件,然后按大小对这些页面文件进行分组。但是,是否有一种更直接的方式来实现这一点而无需先按页面拆分?

4

2 回答 2

3

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

我将继续测试,但到目前为止它正在工作。

于 2012-08-17T21:27:18.293 回答
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);
        }
于 2012-07-27T18:59:09.907 回答