我有大量的文档扫描成PDF格式,我希望编写一个shell脚本,将每个文档转换为DjVu格式.一些文件在200dpi扫描,一些在300dpi扫描,一些在600dpi扫描.由于DjVu是一种基于像素的格式,我想确保在目标DjVu文件中使用与扫描时相同的分辨率.
有谁知道我可以运行什么程序,或者我如何编写程序,以确定用于生成扫描PDF的分辨率?(像素数也可能有效,因为几乎所有文档都是8.5 x 11英寸.)
答复后的澄清:我知道布列塔尼强调的困难,我愿意承认这个问题总体上是不合适的,但我不是在询问一般的 PDF文件.我的特定文件来自扫描仪.它们每页包含一个扫描图像,每页包含相同的分辨率.如果我将PDF转换为PostScript,我可以手动搜索并轻松找到像素尺寸; 我可能会找到更多工作的图像尺寸.如果迫切需要我可以修改gs
正在使用的字典堆栈; 很久以前,我为PostScript Level 1编写了一个解释器.
所有这些都是我想要避免的.
感谢收到的帮助,我在下面发布了一个答案:
使用PDF提取边界框identify
,仅获取第一页的输出,并了解单位将是PostScript点,其中有72到1英寸.
使用提取第一页的图像pdfimages
.
获取图像的高度和宽度.这个时间identify
会给出像素数.
添加图像的总面积以获得平方的点数.
要获得分辨率,请以平方英寸计算边界框区域,将平方除以平方英寸,取平方根,并舍入到最接近的10的倍数.
脚本的完整答案如下.我在实弹射击中使用它并且效果很好.感谢Harlequin for pdfimages
和Spiffeah关于每页多个图像的警报(这很少见,但我发现了一些).
如果通过扫描创建了pdf,则每个页面应该只有一个图像.您可以通过使用iText(Java)或iTextSharp(.net端口)库轻松解析pdf来查找每个页面图像的每个图像分辨率.
如果要滚动自己的实用程序来执行此操作,请在iTextSharp中执行以下操作:
PdfReader reader = new PdfReader(filename); for (int i = 1; i <= reader.NumberOfPages; i++) { PdfDictionary pg = reader.GetPageN(i); PdfDictionary res = (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES)); PdfDictionary xobjs = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT)); if (xobjs != null) { foreach (PdfName xObjectKey in xobjs.Keys) { PdfObject xobj = xobjs.Get(xObjectKey); PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(xobj); PdfName subtype = (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE)); if (subtype.Equals(PdfName.IMAGE)) { PdfNumber width = (PdfNumber)tg.Get(PdfName.WIDTH); PdfNumber height = (PdfNumber)tg.Get(PdfName.HEIGHT); MessageBox.Show("image on page [" + i + "] resolution=[" + width +"x" + height + "]"); } } } } reader.Close();
对于每个页面,我们通过子类型Image的每个XObject读取并获取WIDTH和HEIGHT值.这将是扫描仪嵌入在pdf中的图像的像素分辨率.
请注意,缩放此图像以匹配页面分辨率(如在Acrobat中呈现的页面大小 - A4,Letter等)在页面内容流中单独执行,该内容流表示为postscript的子集,并且没有解析后记很难找到.
请注意,有些扫描仪会将扫描图像嵌入较小图像的网格中(我假设某种尺寸优化).因此,如果您看到每个页面突然出现50个小图像,那可能就是原因.
希望如果你必须推出自己的实用程序,这会有所帮助.
pdfimages
具有-list
选项,提供在像素和也高度宽度y-ppi
和x-ppi
.
pdfimages -list tmp.pdf page num type width height color comp bpc enc interp object ID x-ppi y-ppi size ratio -------------------------------------------------------------------------------------------- 1 0 image 3300 2550 gray 1 1 ccitt no 477 0 389 232 172K 17% 2 1 image 3300 2550 gray 1 1 ccitt no 3 0 389 232 103K 10% 3 2 image 3300 2550 gray 1 1 ccitt no 7 0 389 232 236K 23% 4 3 image 3300 2550 gray 1 1 ccitt no 11 0 389 232 210K 20% 5 4 image 3300 2550 gray 1 1 ccitt no 15 0 389 232 250K 24% 6 5 image 3300 2550 gray 1 1 ccitt no 19 0 389 232 199K 19% 7 6 image 3300 2550 gray 1 1 ccitt no 23 0 389 232 503K 49% 8 7 image 3300 2550 gray 1 1 ccitt no 27 0 389 232 154K 15% 9 8 image 3300 2550 gray 1 1 ccitt no 31 0 389 232 21.5K 2.1% 10 9 image 3300 2550 gray 1 1 ccitt no 35 0 389 232 286K 28% 11 10 image 3300 2550 gray 1 1 ccitt no 39 0 389 232 46.8K 4.6% 12 11 image 3300 2550 gray 1 1 ccitt no 43 0 389 232 55.5K 5.4% 13 12 image 3300 2550 gray 1 1 ccitt no 47 0 389 232 35.0K 3.4% 14 13 image 3300 2550 gray 1 1 ccitt no 51 0 389 232 26.9K 2.6% 15 14 image 3300 2550 gray 1 1 ccitt no 55 0 389 232 66.5K 6.5% 16 15 image 3300 2550 gray 1 1 ccitt no 59 0 389 232 73.9K 7.2% 17 16 image 3300 2550 gray 1 1 ccitt no 63 0 389 232 47.0K 4.6% 18 17 image 3300 2550 gray 1 1 ccitt no 67 0 389 232 30.1K 2.9% 19 18 image 3300 2550 gray 1 1 ccitt no 71 0 389 232 70.3K 6.8% 20 19 image 3300 2550 gray 1 1 ccitt no 75 0 389 232 46.0K 4.5% 21 20 image 3300 2550 gray 1 1 ccitt no 79 0 389 232 28.9K 2.8% 22 21 image 3300 2550 gray 1 1 ccitt no 83 0 389 232 72.7K 7.1% 23 22 image 3300 2550 gray 1 1 ccitt no 87 0 389 232 47.5K 4.6% 24 23 image 3300 2550 gray 1 1 ccitt no 91 0 389 232 30.1K 2.9%