首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用适当的压缩将PDF逐页转换为TIFF

用适当的压缩将PDF逐页转换为TIFF
EN

Stack Overflow用户
提问于 2012-02-14 11:03:28
回答 1查看 1.8K关注 0票数 0

问题

中有不同类型对象的PDF文档。有一些简单的文本。可以扫描的图像是B&W,也可以是其他的图像,这是真实的颜色。两者的分辨率都很高(~1789X2711)。

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

对所有页面使用JPG将导致B&W图像的细节松散,与无损传真压缩相比,它们将是巨大的。

对所有的人使用无损的传真会减少颜色和真实彩色图像的细节。

想法

最好是逐页检查PDF页面,。我可以检查页面的内容。里面有什么样的图像,哪种压缩是针对特定的页面进行的。我认为这可以用IText来完成,但我不知道确切地说,应该如何做。第二件事是,我想在不完全读取文件的情况下进行此分析。有可能吗?

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

欢迎任何意见和建议。

更新:我现在有了答案。它没有涵盖所有的需求,也不包括免费软件。有什么开场白吗?也许是基于Java的解决方案?

EN

回答 1

Stack Overflow用户

发布于 2012-02-14 14:40:05

这可以用来自Atalasoft的DotImage DotPdf来完成(提示必须“我在那里工作,并在这些产品上工作”)。下面是我如何在C#中完成这个任务:

代码语言:javascript
复制
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做你想做的任何事情。如果为该像素格式选择无效的压缩,编码器将在其位置使用适当的无损压缩(例如,如果选择24位颜色的CCITT,则编码器将使用Lzw)。

我们的PDF解码器知道什么时候PDF页面是灰色的,并返回一个灰色的图像。它并不能使您达到1位(这是非常反别名的文本看起来很好),但是您可以对灰度图像进行阈值化,并查看它与灰色图像之间的总体差异,以确定它是否可以转到1位)。

下面是如何处理一组页面的方法:

代码语言:javascript
复制
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);

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9275741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档