使用cmd批处理文件获取pdf中的页数

Pet*_*aig 43 pdf cmd batch-file

我可以看到有很多关于使用C,PHP和其他方法获取pdf页面的问题,但我想知道批处理文件或cmd是否有一种获取页数的简单方法?

Tuu*_*lli 56

使用pdftk:

pdftk my.pdf dump_data | grep NumberOfPages

诀窍.

  • 用`findstr`代替`grep`,你甚至可以在Windows上运行而不必安装超过pdftk. (13认同)
  • 另一种获取数字的方法是使用awk打印第二列.`pdftk my.pdf dump_data | grep NumberOfPages | awk'{print $ 2}'` (7认同)
  • 结合上面的回复`pdftk my.pdf dump_data | grep NumberOfPages | sed's/[^ 0-9]*//'`你得到的数字. (6认同)
  • 使用 AWK,不需要使用 grep,@Mehmet。`pdftk my.pdf dump_data | pdftk my.pdf dump_data | awk '/NumberOfPages/{print $2}'` 同样,单独 sed 就足够了。`pdftk my.pdf dump_data | pdftk my.pdf dump_data | sed '/NumberOfPages/!d;s/[^0-9]*//'` (2认同)
  • @ArpadHorvath 也许更强大的是 find: `find 。-maxdepth 1 -name "*.pdf" -exec sh -c "p​​dftk '{}' data_dump" \; | awk '/NumberOfPages/{print $2}'` (2认同)

dim*_*mib 30

或者,您可以使用该命令,该命令仅返回数字:

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

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

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

  • 实际上,在Debian中,包是poppler-utils.Xpdf只使用Poppler库并推荐使用poppler-utils. (3认同)
  • 总结目录中所有PDF文件的页数:`(对于* .pdf中的pdf;执行pdfinfo“ $ pdf”;完成)| grep页面| sed's / [^ 0-9] * //'| 粘贴-sd + | 公元前 (2认同)

Pal*_*lec 22

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

qpdf --show-npages file.pdf
Run Code Online (Sandbox Code Playgroud)

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

存在大多数Linux发行版的软件包,通常命名为qpdf.像Softpedia主页二进制文件的页面.该源代码可以从SourceForge上下载,或者从官方GitHub的仓库.


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

qpdf --show-pages file.pdf | grep -c ^page
Run Code Online (Sandbox Code Playgroud)

在Windows上,您应该使用findstrfind不是:

qpdf --show-pages file.pdf | findstr ^page | find /c /v ""
Run Code Online (Sandbox Code Playgroud)

  • 默认情况下,它似乎已在我的Ubuntu 16.10安装中安装!:D (2认同)

npo*_*aka 6

没有任何外部工具(保存脚本如下.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);
   }
Run Code Online (Sandbox Code Playgroud)

它采用.pdf文件的路径并简单地打印页面的数量.它不是很快,因为它按符号读取pdf符号,但可以进行优化.

  • @DavidvanDriessche 如果您在十六进制编辑器中查看 .pdf 的原始字节,这一切都会变得更加明显(十六进制研讨会是一个不错的选择)。基本上寻找类似字符串的内容:`&lt;&lt;/Type/Pages/Count 21` getPages() 扫描 pdf 字节以查找“&lt;&lt;”标签并将读取的内容传递给 checkTag()。checkTag() 然后使用“/”作为分隔符将内容拆分为元素并扫描字符串“count”的元素,当发现它然后在空间“”上拆分元素并返回索引[1],即中的第二个值上面例子中的数组 21 (2认同)
  • 实际上,我过去写过一个PDF渲染器,所以我确切地知道PDF文件的样子.我也知道这段代码永远不会在现实生活中起作用,因为PDF文件可以包含很多"<</Type/Pages/Count ..."字符串的实例,这些实例要么根本不使用,要么不反映实际的页数在PDF文档中.这种方法充其量是不可靠的,不应该使用. (2认同)

小智 5

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

mdls -name kMDItemNumberOfPages POSIX_PATH_OF_PDF_FILE
Run Code Online (Sandbox Code Playgroud)

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