我有大量的文档扫描成PDF格式,我希望编写一个shell脚本,将每个文档转换为DjVu格式.一些文件在200dpi扫描,一些在300dpi扫描,一些在600dpi扫描.由于DjVu是一种基于像素的格式,我想确保在目标DjVu文件中使用与扫描时相同的分辨率.
有谁知道我可以运行什么程序,或者我如何编写程序,以确定用于生成扫描PDF的分辨率?(像素数也可能有效,因为几乎所有文档都是8.5 x 11英寸.)
答复后的澄清:我知道布列塔尼强调的困难,我愿意承认这个问题总体上是不合适的,但我不是在询问一般的 PDF文件.我的特定文件来自扫描仪.它们每页包含一个扫描图像,每页包含相同的分辨率.如果我将PDF转换为PostScript,我可以手动搜索并轻松找到像素尺寸; 我可能会找到更多工作的图像尺寸.如果迫切需要我可以修改gs
正在使用的字典堆栈; 很久以前,我为PostScript Level 1编写了一个解释器.
所有这些都是我想要避免的.
感谢收到的帮助,我在下面发布了一个答案:
identify
,仅获取第一页的输出,并了解单位将是PostScript点,其中有72到1英寸.pdfimages
.identify
会给出像素数.脚本的完整答案如下.我在实弹射击中使用它并且效果很好.感谢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();
Run Code Online (Sandbox Code Playgroud)
对于每个页面,我们通过子类型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%
Run Code Online (Sandbox Code Playgroud)