内部有不同类型的对象的PDF文档。有简单的文字。可以存在B& W的扫描图像,以及其他真实颜色的图像。两者的分辨率都很高(~1789X2711)。
我需要将PDF转换为一组单页TIFF文件。有很好的工具。例如Irfanview,ImageMagick。问题是我必须为所有页面定义一个压缩类型。
对所有页面使用JPG会导致B& W图像的细节丢失,与无损传真压缩相比,它们会很大。
使用无损传真可以获得真实彩色图像的颜色和细节。
逐页检查PDF页面会很不错。我可以查看页面的内容。内部有什么样的图像,以及针对特定页面推荐哪种压缩。我认为这可以通过 IText 来完成,但我不确切地知道,应该如何完成。第二件事是我想在没有完全阅读PDF文件 的情况下进行 分析。有可能吗?
也许最快的解决方案是使用IText分析为每种压缩类型创建一个页面列表,然后调用Irfanview以适当的压缩处理选择的页面。
欢迎任何想法和建议。
更新: 我现在有一个答案。它不包括所有要求,也不包括免费软件。任何开源创意?也许基于Java的解决方案?
答案 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);