Ho provato l'approccio di Josh usando mdls
e ho trovato un numero sorprendente di (null) per kMDItemNumberOfPages.
Quindi ho cambiato i puntini e ho utilizzato AppleScriptObjC per contare direttamente le pagine nei file PDF trovati.
Lo script verrà eseguito direttamente da Script Editor.app o da un'applet di script.
Produrrà un report in TextEdit che assomiglia a questo:
--------------------------
PDF files found : 460
Total Pages : 27052
Total Errors : 0
--------------------------
Questa esecuzione è durata a 10 secondi sul mio MacBook Pro 17 "Mid-2010 di fascia media.
La seguente riga deve essere modificata nello script per riflettere correttamente la directory di destinazione sul sistema dell'utente:
property searchPath : "~/Downloads"
(Anche se sarei felice di farlo funzionare sulla finestra frontale del Finder su richiesta.)
Lo script è attualmente impostato per essere ricorsivo nella directory di destinazione.
-------------------------------------------------------------------------------------------
# Auth: Christopher Stone { With many thanks to Shane Stanley and Nigel Garvey }
# dCre: 2018/04/27 01:30
# dMod: 2018/04/27 02:50
# Appl: AppleScriptObjC, TextEdit
# Task: Find all PDF files in a directory tree – count and report all pages.
# Libs: None
# Osax: None
# Tags: @Applescript, @Script, @ASObjC, @TextEdit, @Find, @PDF, @Files, @Directory, @Tree, @Recursive, @Count, @Report, @Pages, @Progress_Bar, @Bar
# Vers: 1.00
-------------------------------------------------------------------------------------------
use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"
use framework "Quartz" -- for PDF features
use scripting additions
-------------------------------------------------------------------------------------------
property searchPath : "~/Downloads"
property searchRecursively : true
-------------------------------------------------------------------------------------------
set pageCountList to {}
set searchPath to ((current application's NSString's stringWithString:searchPath)'s stringByExpandingTildeInPath) as text
set foundItemList to my filteredContents:searchPath withUTI:{"com.adobe.pdf"} |returning|:"path" recursive:searchRecursively
set totalStepNum to length of foundItemList
set progress total steps to totalStepNum
set progress completed steps to 0
set progress description to "Processing PDF's..."
set progress additional description to "Preparing to process."
set numberOfProcessedDocuments to 0
repeat with pdfFilePath in foundItemList
set numberOfProcessedDocuments to (numberOfProcessedDocuments + 1)
set progress additional description to "Processing PDF " & numberOfProcessedDocuments & " of " & totalStepNum
set progress completed steps to numberOfProcessedDocuments
try
set anNSURL to (current application's |NSURL|'s fileURLWithPath:(contents of pdfFilePath))
set theDoc to (current application's PDFDocument's alloc()'s initWithURL:anNSURL)
set end of pageCountList to theDoc's pageCount() as integer
on error
set end of pageCountList to "Error --> " & name of (info for (contents of pdfFilePath))
end try
end repeat
set errorList to text of pageCountList
set filesFoundCount to length of foundItemList
set pageCountList to integers of pageCountList
set pageCount to its sumList(pageCountList)
set pdfPageReport to "
--------------------------
PDF files found : " & filesFoundCount & "
Total Pages : " & pageCount & "
Total Errors : " & length of errorList & "
--------------------------
"
tell application "TextEdit"
launch -- prevent the Open dialog from opening.
activate
set newDoc to make new document with properties {text:pdfPageReport}
tell newDoc
set font to "Menlo"
set size to "14"
end tell
end tell
-------------------------------------------------------------------------------------------
--» HANDLERS
-------------------------------------------------------------------------------------------
on filteredContents:folderPath withUTI:wUTI |returning|:returnType recursive:wRecursive
set theFolderURL to current application's |NSURL|'s fileURLWithPath:folderPath
set typeIdentifierKey to current application's NSURLTypeIdentifierKey
set keysToRequest to current application's NSArray's arrayWithObject:(typeIdentifierKey)
set theFileManager to current application's NSFileManager's defaultManager()
# Get all items in folder descending into subfolders if asked.
if wRecursive = true then
set allURLs to (theFileManager's enumeratorAtURL:theFolderURL includingPropertiesForKeys:keysToRequest options:6 errorHandler:(missing value))'s allObjects()
else
set allURLs to theFileManager's contentsOfDirectoryAtURL:theFolderURL includingPropertiesForKeys:keysToRequest options:4 |error|:(missing value)
end if
# Build an or predicate to test each URL's UTI against all the specified ones.
set predArray to current application's NSMutableArray's new()
repeat with aKind in wUTI
(predArray's addObject:(current application's NSPredicate's predicateWithFormat_("self UTI-CONFORMS-TO %@", aKind)))
end repeat
set thePredicate to current application's NSCompoundPredicate's orPredicateWithSubpredicates:predArray
# Build a list of those URLs whose UTIs satisfy the predicate …
script o
property theURLs : {}
end script
# … keeping AS texts listing the UTIs tried so that they don't need to be tested again.
set conformingUTIs to ""
set unconformingUTIs to ""
repeat with oneURL in allURLs
set thisUTI to end of (oneURL's getResourceValue:(reference) forKey:typeIdentifierKey |error|:(missing value))
# It's only necessary to test this UTI for conformity if it hasn't come up before.
set thisUTIAsText to linefeed & thisUTI & linefeed
if (unconformingUTIs contains thisUTIAsText) then
# Do nothing.
else if (conformingUTIs contains thisUTIAsText) then
# Add this URL to the output list.
set end of o's theURLs to oneURL
else if ((thePredicate's evaluateWithObject:thisUTI) as boolean) then -- This works even if thisUTI is missing value.
# Add this URL to the output list and append the UTI to the conforming-UTI text.
set end of o's theURLs to oneURL
set conformingUTIs to conformingUTIs & thisUTIAsText
else
# Append this UTI to the unconforming-UTI text.
set unconformingUTIs to unconformingUTIs & thisUTIAsText
end if
end repeat
# Get an array version of the URL list and use this to derive the final output.
set theURLs to current application's NSArray's arrayWithArray:(o's theURLs)
if returnType = "name" then return (theURLs's valueForKey:"lastPathComponent") as list
if returnType = "path" then return (theURLs's valueForKey:"path") as list
if returnType = "url" then return theURLs
return theURLs as list
end filteredContents:withUTI:|returning|:recursive:
-------------------------------------------------------------------------------------------
on sumList(theList)
set theNSArray to current application's NSArray's arrayWithArray:theList
set theSum to (theNSArray's valueForKeyPath:"@sum.self") as integer
return theSum
end sumList
-------------------------------------------------------------------------------------------
Dato che questa critica è solo leggermente testata, non faccio alcuna garanzia, ma sono contento fino ad ora.
-ccs