我可以看到使用 C、PHP 等获取 pdf 中的页数有很多问题,但我想知道使用批处理文件或 cmd 是否有一种简单的方法来获取页数?
您也可以使用以下命令,该命令仅返回数字:
pdfinfo "${PDFFILE}" | grep Pages | sed 's/[^0-9]*//'
您将需要 poppler 包:
https://poppler.freedesktop.org/
可以使用 homebrew / linuxbrew 安装:
brew install poppler
或与
apt
:
sudo apt install poppler-utils
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 ""
无需任何外部工具(将以下脚本另存为
.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 的速度不是很快,但可以优化。
因为您要求“批处理文件”,所以我必须假设您只需要基于 Windows 的解决方案。但是,以防万一 Mac OS X 是一个选项,这里有一些可能有用的东西。 如果您在 Mac 上有 PDF,则位于已由 Spotlight 索引的驱动器(默认)上,以下命令将返回不使用外部依赖项的页数:
mdls -name kMDItemNumberOfPages POSIX_PATH_OF_PDF_FILE
来源:MacScripter.net - http://macscripter.net/viewtopic.php?id=32381
这可能对新用户有帮助。在新版PDFtk工具(2.0以上)中,使用以下命令获取PDF文件的页数:
pdftk file.pdf dump_data_annots output outputfile.txt
将在目的地创建一个新文件,其内容类似于以下内容:
NumberOfPages: 6
现在读取文件并根据需要操作内容。
要使用 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
如果安装了 ImageMagick 或 GraphicsMagick,一个简单的方法:
identify *.pdf | wc -l
如果有人想要使用 Excel 和 VBA 的替代方案:
https://www.extendoffice.com/documents/excel/5330-excel-vba-pdf-page-count.html
打开您想要获取 Pdf 文件和页码的工作表。
按住 ALT + F11 键,将打开 Microsoft Visual Basic for Applications 窗口。
单击“插入”>“模块”,然后将以下宏粘贴到“模块窗口”中。
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
复制
粘贴代码后,按F5键运行此代码,会弹出浏览窗口,请选择包含要列出的Pdf文件并计算页码的文件夹,
然后,单击“确定”按钮,所有 Pdf 文件名和页码都会列出到当前工作表中