问题
中有不同类型对象的PDF文档。有一些简单的文本。可以扫描的图像是B&W,也可以是其他的图像,这是真实的颜色。两者的分辨率都很高(~1789X2711)。
我需要将PDF转换成一组单一页面的TIFF文件。这方面有相当好的工具。例如Irfanview,ImageMagick。问题是,我必须为所有页面定义一个压缩类型。
对所有页面使用JPG将导致B&W图像的细节松散,与无损传真压缩相比,它们将是巨大的。
对所有的人使用无损的传真会减少颜色和真实彩色图像的细节。
想法
最好是逐页检查PDF页面,。我可以检查页面的内容。里面有什么样的图像,哪种压缩是针对特定的页面进行的。我认为这可以用IText来完成,但我不知道确切地说,应该如何做。第二件事是,我想在不完全读取文件的情况下进行此分析。有可能吗?
也许最快的解决方案是使用IText分析为每种压缩类型创建一个页面列表,然后调用Irfanview视图来使用适当的压缩处理所选的页面。
欢迎任何意见和建议。
更新:我现在有了答案。它没有涵盖所有的需求,也不包括免费软件。有什么开场白吗?也许是基于Java的解决方案?
发布于 2012-02-14 14:40:05
这可以用来自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做你想做的任何事情。如果为该像素格式选择无效的压缩,编码器将在其位置使用适当的无损压缩(例如,如果选择24位颜色的CCITT,则编码器将使用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);了
https://stackoverflow.com/questions/9275741
复制相似问题