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

问题描述 投票:0回答:10

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

pdf batch-file cmd
10个回答
88
投票

使用pdftk

pdftk my.pdf dump_data | grep NumberOfPages

就可以了。


43
投票

您也可以使用以下命令,该命令仅返回数字:

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

您将需要 poppler 包:

https://poppler.freedesktop.org/

可以使用 homebrew / linuxbrew 安装:

brew install poppler

或与

apt
:

sudo apt install poppler-utils

29
投票

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

qpdf --show-npages file.pdf

仅打印页数,无需后期处理。

大多数 Linux 发行版都有软件包,通常仅命名为

qpdf
。 Softpedia 等页面托管Windows 二进制文件源代码可以从SourceForge下载,或者从官方GitHub存储库


4.1.0之后的版本添加了

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

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

在 Windows 上,您应该使用

findstr
find
来代替:

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

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 的速度不是很快,但可以优化。


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


2
投票

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

导航到 bin 文件夹并运行 pdfinfo.exe,例如 -

C:\Temp\temp_folder\poppler-0.68.0\bin>pdfinfo.exe "C:\Temp\temp_folder\TT.pdf"


1
投票

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

pdftk file.pdf dump_data_annots output outputfile.txt

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

NumberOfPages: 6

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


-1
投票

要使用 VBA 执行此操作,请打开 Excel,按 ALT + F11 打开 VBA

插入模块,复制+粘贴下面的代码,将模块另存为启用宏的工作簿。

点击F5执行VBA代码,会出现一个对话框;选择包含 PDF 的文件夹,代码将计算每个 PDF 中的逻辑页面,总计在 B 列中 - PDF 名称将填充在 A 列中。

Sub Test()
    Dim I As Long
    Dim xRg As Range
    Dim xStr As String
    Dim xFd As FileDialog
    Dim xFdItem As Variant
    Dim xFileName As String
    Dim xFileNum As Long
    Dim RegExp As Object

    ' Create a file dialog object
    Set xFd = Application.FileDialog(msoFileDialogFolderPicker)

    ' Display the file dialog and get the selected folder
    If xFd.Show = -1 Then
        xFdItem = xFd.SelectedItems(1) & Application.PathSeparator
        xFileName = Dir(xFdItem & "*.pdf", vbDirectory)
        
        ' Set the range for data output
        Set xRg = Range("A1")

        ' Clear previous contents and set headers
        Range("A:B").ClearContents
        Range("A1:B1").Font.Bold = True
        xRg = "File Name"
        xRg.Offset(0, 1) = "Pages"

        I = 2 ' Start from row 2 for data
        
        ' Loop through each PDF file in the selected folder
        Do While xFileName <> ""
            ' Display file name in column A
            Cells(I, 1) = xFileName

            ' Initialize RegExp object to count pages
            Set RegExp = CreateObject("VBScript.RegExp")
            RegExp.Global = True
            RegExp.Pattern = "/Type\s/Page[^s]"

            ' Open the PDF file and read its content
            xFileNum = FreeFile
            Open (xFdItem & xFileName) For Binary As #xFileNum
                xStr = Space(LOF(xFileNum))
                Get #xFileNum, , xStr
            Close #xFileNum

            ' Count pages using RegExp and display in column B
            Cells(I, 2) = RegExp.Execute(xStr).Count

            I = I + 1 ' Move to the next row
            xFileName = Dir ' Get the next file
        Loop

        ' Autofit columns for better visibility
        Columns("A:B").AutoFit
    End If
End Sub

-2
投票

如果安装了 ImageMagick 或 GraphicsMagick,一个简单的方法:

   identify *.pdf | wc -l

-2
投票

如果有人想要使用 Excel 和 VBA 的替代方案:

https://www.extendoffice.com/documents/excel/5330-excel-vba-pdf-page-count.html

  1. 打开您想要获取 Pdf 文件和页码的工作表。

  2. 按住 ALT + F11 键,将打开 Microsoft Visual Basic for Applications 窗口。

  3. 单击“插入”>“模块”,然后将以下宏粘贴到“模块窗口”中。

Sub Test() Dim I As Long Dim xRg As Range Dim xStr As String Dim xFd As FileDialog Dim xFdItem As Variant Dim xFileName As String Dim xFileNum As Long Dim RegExp As 对象集 xFd = Application.FileDialog(msoFileDialogFolderPicker) 如果 xFd.Show = -1 然后 xFdItem = xFd.SelectedItems(1) & Application.PathSeparator xFileName = Dir(xFdItem & ".pdf", vbDirectory) 设置 xRg = Range("A1") Range("A:B").ClearContents Range("A1:B1").Font.Bold = True xRg = "文件 名称" xRg.Offset(0, 1) = "页面" I = 2 xStr = "" 当 xFileName <> 时执行 "" Cells(I, 1) = xFileName 设置正则表达式 = CreateObject("VBscript.RegExp") RegExp.Global = True RegExp.Pattern = "/Type\s/Page[^s]" xFileNum = FreeFile Open (xFdItem & xFileName) 对于 二进制为 #xFileNum xStr = Space(LOF(xFileNum)) 获取 #xFileNum, , xStr 关闭 #xFileNum Cells(I, 2) = RegExp.Execute(xStr).Count I = I + 1 xFileName = Dir Loop Columns("A:B").AutoFit End If End Sub

复制

  1. 粘贴代码后,按F5键运行此代码,会弹出浏览窗口,请选择包含要列出的Pdf文件并计算页码的文件夹,

  2. 然后,单击“确定”按钮,所有 Pdf 文件名和页码都会列出到当前工作表中

© www.soinside.com 2019 - 2024. All rights reserved.