1

Adobe Acrobat を使用して、ページごとまたは最大ファイル サイズごとに PDF ファイルを個別の PDF ファイルに分割する方法を示す、PDF をパーツに分割する方法のチュートリアルを見つけました。

ツール > ドキュメントを分割 > ファイル サイズでドキュメントを分割

C# を使用してページごとに PDF を分割する方法について、StackOverflow で多くの見つけました。 しかし、どうすれば後者を行うことができますか?C#を使用して最大ファイルサイズでPDFファイルを複数のPDFファイルに分割するにはどうすればよいですか?

たとえば、70 ページで 40 MB の PDF ファイルがあるとします。それぞれ 10 ページの 7 つの PDF ファイルに分割する代わりに、C# を使用してファイルをそれぞれ 10 MB 以下の約 5 つの PDF ファイルに分割するにはどうすればよいですか?

これまでのところ、私が見た最良の方法は、 Cyfer13がiTextSharpを使用してファイルをページごとに分割し、それらのページ ファイルをサイズごとにグループ化するサイズに基づいて、itextsharp を使用して PDF を小さな PDF に分割することでした。しかし、最初にページごとに分割することなく、これを達成するためのより直接的な方法はありますか?

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 に答える