通过适当的压缩逐页将PDF转换为TIFF

时间:2012-02-14 11:03:29

标签: optimization pdf itext tiff

问题

内部有不同类型的对象的PDF文档。有简单的文字。可以存在B& W的扫描图像,以及其他真实颜色的图像。两者的分辨率都很高(~1789X2711)。

我需要将PDF转换为一组单页TIFF文件。有很好的工具。例如Irfanview,ImageMagick。问题是我必须为所有页面定义一个压缩类型。

对所有页面使用JPG会导致B& W图像的细节丢失,与无损传真压缩相比,它们会很大。

使用无损传真可以获得真实彩色图像的颜色和细节。

逐页检查PDF页面会很不错。我可以查看页面的内容。内部有什么样的图像,以及针对特定页面推荐哪种压缩。我认为这可以通过 IText 来完成,但我不确切地知道,应该如何完成。第二件事是我想在没有完全阅读PDF文件 的情况下进行 分析。有可能吗?

也许最快的解决方案是使用IText分析为每种压缩类型创建一个页面列表,然后调用Irfanview以适当的压缩处理选择的页面。

欢迎任何想法和建议。

更新: 我现在有一个答案。它不包括所有要求,也不包括免费软件。任何开源创意?也许基于Java的解决方案?

1 个答案:

答案 0 :(得分:2)

这可以通过Atalasoft的DotImage DotPdf来完成(提示必须“我在那里工作并在这些产品上工作”)。以下是我在C#中执行此任务的方法:

PdfImageSource source = new PdfImageSource(pdfStream);

while (source.HasMoreImages()) {
    AtalaImage image = source.AcquireNext();
    string fileName = GetNextTiffName();
    using (FileStream outStm = new FileStream(fileName, FileMode.Create)) {
        TiffEncoder encoder = new TiffEncoder();
        encoder.Compression = SelectCompression(image.PixelFormat);
        image.Save(outStm, encoder, null);
    }
    source.Release(image);
}

private TiffCompression SelectCompression(PixelFormat pf)
{
     switch (pf) {
     // 1 bit? use CCITT G4
     case PixelFormat.Pixel1bbIndexed: return TiffCompression.Group4FaxEncoding;
     // 24 bit? use JPEG
     case PixelFormat.Pixel24bppBgr: return TiffCompression.JpegCompression;
     // all else, Lzw
     default: return TiffCompression.Lzw;
     }
}

你可以让SelectCompression做你想做的任何事情。如果为该像素格式选择了无效的压缩,编码器将使用适当的无损压缩(例如,如果选择CCITT为24位颜色,则编码器将改为使用Lzw)。

我们的PDF解码器知道PDF页面何时只是灰色并返回灰色图像。它没有做任何事情让你到1位(这是如此抗锯齿的文本看起来不错),但你可以阈值灰色图像,看看它和灰色图像之间的总体差异,以确定它是否可以转到1位)

以下是您可以执行一组页面的方法:

public void ExtractNPages(Stream pdfStream, params int[] pageIndexes)
{
    PdfImageSource source = new PdfImageSource(pdfStream);
    for (int i in pageIndexes) {
        AtalaImage image = source[i]; // implied Acquire
        string fileName = GetNextTiffName();
        using (FileStream outStm = new FileStream(fileName, FileMode.Create)) {
            TiffEncoder = new TiffEncoder();
            encoder.Compression = SelectCompression(image.PixelFormat);
            image.Save(outStm, encoder, null);
        }
        source.Release(image);
    }
 }

所以现在你可以做ExtractNPages(stm, 0, 2, 4, 6);