0

iTextSharp (LGPL / MPL) 4.1.6 を使用して、既存の PDF ストリームからページ範囲を取得し、圧縮して新しいファイルに保存しています。

private static void CreateFile(Stream stream, string filename, int first, int last)
{
    RandomAccessFileOrArray raf = new RandomAccessFileOrArray(stream);
    PdfReader reader = new PdfReader(raf, null);
    reader.SelectPages(string.Format("{0}-{1}", first, last));
    char version = reader.PdfVersion; // == '4'
    using (FileStream fs = new FileStream(filename, FileMode.Create))
    {
        PdfStamper stamper = new PdfStamper(reader, fs, PdfWriter.VERSION_1_5);
        PdfWriter writer = stamper.Writer;
        writer.SetPdfVersion(PdfWriter.PDF_VERSION_1_5);
        writer.CompressionLevel = PdfStream.BEST_COMPRESSION;
        // this will always be true - why?
        if (PdfStream.DEFAULT_COMPRESSION == writer.CompressionLevel)
        {
            var help = "what am I doing wrong?";
        }
        for (int i = 1; i <= reader.NumberOfPages; i++)
        {
            reader.SetPageContent(i, reader.GetPageContent(i));
        }
        stamper.SetFullCompression();
        stamper.Close();
    }
    reader.Close();
    raf.Close();
}

コンプレッションラインは新品です。しかし、圧縮コードを追加する前と追加した後では、ファイル サイズにほとんど違いがないことに気付きました。デバッグ モードでステップ実行しているときに、CompressionLevel を明示的に 9 (最適) に設定しているにもかかわらず、CompressionLevel が常に -1 (既定値) であることを確認しました。

圧縮レベルを最適に設定して、それを定着させるにはどうすればよいですか?

4

1 に答える 1

1

4.1.6 のコード現在のコードと比較するcompressionLevelと、プロパティの ではなく内部変数で範囲チェックを実行していることがわかりますvalue

4.1.6

public int CompressionLevel {
    set {
        if (compressionLevel < PdfStream.NO_COMPRESSION || compressionLevel > PdfStream.BEST_COMPRESSION)
            compressionLevel = PdfStream.DEFAULT_COMPRESSION;
        else
            compressionLevel = value;
    }
    get {
        return compressionLevel;
    }
}

5.4.0

public int CompressionLevel {
    set {
        if (value < PdfStream.NO_COMPRESSION || value > PdfStream.BEST_COMPRESSION)
            compressionLevel = PdfStream.DEFAULT_COMPRESSION;
        else
            compressionLevel = value;
    }
    get {
        return compressionLevel;
    }
}

4.x シリーズはサポートされなくなりましたが、自分でソースをダウンロードして変更を加えることができます。

于 2013-04-10T17:29:12.987 に答える