【问题标题】:Get number of pages in a pdf using a cmd batch file使用 cmd 批处理文件获取 pdf 中的页数
【发布时间】:2010-12-12 22:56:06
【问题描述】:

我可以看到使用 C、PHP 等获取 aa pdf 中的页数有很多问题,但我想知道使用批处理文件或 cmd 是否有一种简单的方法来获取页数?

【问题讨论】:

  • 定义“批处理文件”。您可以编写一个 PHP 脚本并将脚本的执行放在一个文本文件中,将其保存为 .bat,它也称为批处理文件。您需要指定是否允许使用外部工具,或者只是简单地使用纯 cmd.exe。

标签: pdf batch-file cmd


【解决方案1】:

我知道这是旧帖子,但仍然非常相关,所以我相信应该有一个答案可以说明如何使用“poppler-0.68.0”实用程序获取页数,在窗口中。

导航到 bin 文件夹并运行 pdfinfo.exe 像 - C:\Temp\temp_folder\poppler-0.68.0\bin>pdfinfo.exe "C:\Temp\temp_folder\TT.pdf"

【讨论】:

  • 已经有 a highly-voted pdfinfo answer,但是手动处理输出而不是使用 grep 和 sed 有时可能是个好主意,这个屏幕截图有助于解决这个问题。 +1
【解决方案2】:

这可能对新用户有帮助。在新版本的 PDFtk 工具(2.0 以上)中,使用以下命令获取 PDF 文件的页数:

pdftk file.pdf dump_data_annots output outputfile.txt

将在目的地创建一个新文件,其内容类似于以下内容:

NumberOfPages: 6

现在读取文件并根据需要操作内容。

【讨论】:

    【解决方案3】:

    使用pdftk

    pdftk my.pdf dump_data | grep NumberOfPages

    成功了。

    【讨论】:

    • findstr 替换grep,你甚至可以在Windows 上运行而无需安装更多的pdftk。
    • 结合pdftk my.pdf dump_data | grep NumberOfPages | sed 's/[^0-9]*//'上面的回复,你就得到了数字。
    • 获取数字的另一种方法是使用 awk 打印第二列。 pdftk my.pdf dump_data | grep NumberOfPages | awk '{print $2}'
    • 使用 AWK,不需要使用 grep,@Mehmet。 pdftk my.pdf dump_data | awk '/NumberOfPages/{print $2}' 同样,单独使用 sed 就足够了。 pdftk my.pdf dump_data | sed '/NumberOfPages/!d;s/[^0-9]*//'
    • @ArpadHorvath 可能更强大的是 find:find . -maxdepth 1 -name "*.pdf" -exec sh -c "pdftk '{}' data_dump" \; | awk '/NumberOfPages/{print $2}'
    【解决方案4】:

    QPDF 是 PDFtk(需要 Java 运行时)和 pdfinfo(相当愚蠢的工具)的轻量级替代品。

    qpdf --show-npages file.pdf
    

    它只打印页数,不需要后期处理。

    存在适用于大多数 Linux 发行版的软件包,通常命名为 qpdf。像 Softpedia 主机 binaries for Windows 这样的页面。 source code 可以从 SourceForge 下载,也可以从 official GitHub repository 下载。


    --show-npages 选项是在 4.1.0 之后的版本中添加的 commit 91367239fd55f7c4996ed6158405ea10573ae3cb。为了与4.1.0 及更早的版本兼容,您可以转储有关每个页面的基本信息并计算页面数。在 Linux 和 OS X 中:

    qpdf --show-pages file.pdf | grep -c ^page
    

    在 Windows 上,您应该改用 findstrfind

    qpdf --show-pages file.pdf | findstr ^page | find /c /v ""
    

    【讨论】:

    • 它似乎默认安装在我的 Ubuntu 16.10 安装中! :D
    • 如果你想总结一个目录下所有pdf文件的页数就写: for f in *pdf;做 printf "$f"; qpdf --show-npages $f ;完成| awk '{总和+=$2;打印 $0} END {print "Summa " sum}'
    • 也似乎默认安装在 Manjaro 上,与目前投票率较高的答案相反,无需管道到其他命令即可完成这项工作
    【解决方案5】:

    因为您要求提供“批处理文件”,所以我不得不假设您只需要基于 Windows 的解决方案。但是,以防万一 Mac OS X 是一个选项,这里有一些有用的东西。 如果您在 Mac 上拥有 PDF,在已被 Spotlight(默认)索引的驱动器上,以下命令将返回不使用外部依赖项的页数:

    mdls -name kMDItemNumberOfPages POSIX_PATH_OF_PDF_FILE
    

    来源:MacScripter.net - http://macscripter.net/viewtopic.php?id=32381

    【讨论】:

    • 可以确认,仍然适用于 macOS High Sierra 10.13.2
    【解决方案6】:

    您也可以使用仅返回数字的命令:

    pdfinfo "${PDFFILE}" | grep Pages | sed 's/[^0-9]*//'

    您将需要 xpdf 包(通常预装在许多发行版中):

    http://www.foolabs.com/xpdf/download.html

    【讨论】:

    • 其实在Debian中,这个包是poppler-utils。 Xpdf 只使用了 Poppler 库,推荐使用 poppler-utils。
    • 总结一个目录下所有PDF文件的页数:( for pdf in *.pdf ; do pdfinfo "$pdf" ; done ) | grep Pages | sed 's/[^0-9]*//' | paste -sd+ | bc
    • 在 180 页的 PDF 上非常惊人。您的解决方案比上面的 qpdf 更快。 matt@mtbook:~/projects/booky% time ./booky-pdfinfo.sh real 0m0.129s user 0m0.099s sys 0m0.022s matt@mtbook:~/projects/booky% time ./booky-qpdf.sh real 0m0.039s user 0m0.019s sys 0m0.020s
    • 这是一个更好的答案。 poppler-utils 甚至更适合服务器环境,是受支持的 ubuntu 包。
    • 您发布的时间使我得出与您得出的结论完全相反的结论,@cavalcade。 QPDF 获胜,实时速度提高了 3 倍,原始用户空间处理器时间提高了 5 倍。
    【解决方案7】:

    无需任何外部工具(将下面的脚本另存为.bat):

    @if (@X)==(@Y) @end /* JScript comment
    @echo off
    
    cscript //E:JScript //nologo "%~f0"  %*
    
    exit /b 0
    @if (@X)==(@Y) @end JScript comment */
    
       var args=WScript.Arguments;
       var filename=args.Item(0);
       var fSize=0;
       var inTag=false;
       var tempString="";
       var pages="";
    
       function getChars(fPath) {
    
            var ado = WScript.CreateObject("ADODB.Stream");
            ado.Type = 2;  // adTypeText = 2
            ado.CharSet = "iso-8859-1";
            ado.Open();
            ado.LoadFromFile(fPath);                     
            var fs = new ActiveXObject("Scripting.FileSystemObject");
            fSize = (fs.getFile(fPath)).size;
    
            var fBytes = ado.ReadText(fSize);
            var fChars=fBytes.split('');
            ado.Close();
            return fChars;
       }
    
    
       function checkTag(tempString) {
    
        if (tempString.length == 0 ) {
            return;
        }
    
        if (tempString.toLowerCase().indexOf("/count") == -1) {
            return;
        }
    
        if (tempString.toLowerCase().indexOf("/type") == -1) {
            return;
        }
    
        if (tempString.toLowerCase().indexOf("/pages") == -1) {
            return;
        }
    
        if (tempString.toLowerCase().indexOf("/parent") > -1) {
            return;
        }
    
    
        var elements=tempString.split("/");
        for (i = 0;i < elements.length;i++) {
    
            if (elements[i].toLowerCase().indexOf("count") > -1) {
                pages=elements[i].split(" ")[1];
    
            }
        }
       }
    
       function getPages(fPath) {
            var fChars = getChars(fPath);
    
            for (i=0;i<fSize-1;i++) {
    
                if ( fChars[i] == "<" && fChars[i+1] == "<" ) {
                    inTag = true;
                    continue;
                }
    
                if (inTag && fChars[i] == "<") {
                    continue;
                }
    
                if ( inTag && 
                     fChars[i] == ">" &&
                     fChars[i+1] == ">" ) {
    
                    inTag = false;
                    checkTag(tempString);
                    if (pages != "" ) {
                        return;
                    }
    
                    tempString="";
    
                }
    
                if (inTag) {
                    if (fChars[i] != '\n' && fChars[i] != '\r') {
                       tempString += fChars[i];
                    }
                }
    
            }
    
       }
    
       getPages(filename);
       if (pages == "") {
         WScript.Echo("1");
       } else {
        WScript.Echo(pages);
       }
    

    它获取.pdf 文件的路径并简单地打印页数。它读取pdf 符号时不是很快,但可以进行优化。

    【讨论】:

    • 这如何返回PDF文件的页数?
    • @DavidvanDriessche - 这是pdfpages.bat pdffile.pdf 的例子?有问题吗?
    • 是的 :) 但我真正的问题是,这段代码中有多少页?我想了解这里的计数是什么?
    • @DavidvanDriessche 如果您在十六进制编辑器中查看 .pdf 的原始字节,这一切都会变得更加明显(十六进制研讨会是一个很好的)。基本上是在寻找类似字符串的东西:&lt;&lt;/Type/Pages/Count 21getPages() 扫描 pdf 字节中的“
    • 实际上,我过去写过一个 PDF 渲染器,所以我确切地知道 PDF 文件的样子。我也知道这段代码在现实生活中永远不会起作用,因为 PDF 文件可能包含许多“
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2015-07-12
    相关资源
    最近更新 更多