Sunday, June 13, 2021

#1 2021-05-12 02:51:00 am

One208
Member
Registered: 2021-03-15
Posts: 12

Encrypt PDF

Hi all
Cobbled together a script which worked in testing, but then -> stopped working, could not understand what went wrong, please help
It creates a file with correct name but not encrypted.
Tried with password protected pdf -> creates empty PDF with correct name
it wont password protect !
My Try → to select pdf file ( once this works, wud try to extend to multiple selection) in Finder,
input dialog to set password, and create a password protected file
with suffix encrypted in same directory.
I wud like to use the password protection to prevent file opening

Applescript:


use framework "Foundation"
use framework "PDFKit"
use AppleScript version "2.4"
use scripting additions

property this : a reference to current application
property NSString : a reference to NSString of this
property NSURL : a reference to NSURL of this
property PDFDocument : a reference to PDFDocument of this
property NSDictionary : a reference to NSDictionary of this
property QuartzFilter : a reference to QuartzFilter of this

# set the password. "pw"
set theReturnedItems to (display dialog "What is the Password?" default answer "Example" buttons {"Quit", "OK"} default button 2)
if the button returned of the result is "Quit" then
   return
end if

set pw to the text returned of theReturnedItems
# Select PDF File
# Let Finder Selection be the input
-- https://macscripter.net/viewtopic.php?id=42583. -- Set Finder selection as posix
tell application "Finder" to set sel to selection
set thePDF to POSIX path of (item 1 of sel as alias)
if thePDF does not end with ".pdf" then return
set aURL to (NSURL's fileURLWithPath:thePDF)
set origPDFdoc to PDFDocument's alloc()'s initWithURL:aURL


# construct output file names -- Viking OSX.
set ws_file to NSString's stringWithString:thePDF
set ws_ext to ws_file's pathExtension()
set ws_base to ws_file's stringByDeletingPathExtension()
set bPOSIX to ((ws_base's stringByAppendingString:"_enCrypted")'s stringByAppendingPathExtension:ws_ext)

# Create options for the document
-- https://forum.latenightsw.com/t/scripting-pdf-security-options/739
-- Template from https://macscripter.net/viewtopic.php?id=45941 #2
set aDict to NSDictionary's dictionaryWithObjects:{pw} forKeys:{current application's kCGPDFContextUserPassword}

origPDFdoc's writeToFile:(bPOSIX) withOptions:(aDict)

Last edited by One208 (2021-05-12 04:51:06 am)


Filed under: PDF, encrypt

Offline

 

#2 2021-05-12 06:46:12 am

KniazidisR
Member
From:: Greece
Registered: 2019-03-03
Posts: 1878

Re: Encrypt PDF

Hi, One208.

I was interested in your script. Although I had to tinker a bit with your mistakes, I don't regret it:

Applescript:


use framework "Foundation"
use framework "CoreFoundation"
use framework "PDFKit"
use AppleScript version "2.4"
use scripting additions

property this : a reference to current application
property NSString : a reference to NSString of this
property NSURL : a reference to NSURL of this
property PDFDocument : a reference to PDFDocument of this
property NSDictionary : a reference to NSDictionary of this
property QuartzFilter : a reference to QuartzFilter of this
property kCGPDFContextUserPassword : a reference to "kCGPDFContextUserPassword"
property kCGPDFContextOwnerPassword : a reference to "kCGPDFContextOwnerPassword"
property CFString : a reference to CFString of this
property kCGPDFContextAllowsCopying : a reference to kCGPDFContextAllowsCopying of this

-- set the password. "pw"
set theReturnedItems to (display dialog "What is the Password?" default answer "Example" buttons {"Quit", "OK"} default button 2)
if the button returned of the result is "Quit" then return
set pw to (the text returned of theReturnedItems) as «class utf8»
set pw to (NSString's stringWithString:pw)

tell application "Finder" to set theAliases to (get selection as alias list)

repeat with anAlias in theAliases
   if (anAlias as text) ends with ".pdf" then
       set thePDFpath to POSIX path of anAlias
       set aURL to (NSURL's fileURLWithPath:thePDFpath)
       set origPDFdoc to (PDFDocument's alloc()'s initWithURL:aURL)
       -- construct output file names -- Viking OSX.
       set ws_file to (NSString's stringWithString:thePDFpath)
       set ws_ext to ws_file's pathExtension()
       set ws_base to ws_file's stringByDeletingPathExtension()
       set bPOSIX to ((ws_base's stringByAppendingString:"_enCrypted")'s stringByAppendingPathExtension:ws_ext)
       -- Create options for the document
       set aDict to (NSDictionary's dictionaryWithObjects:{CFString's noCopy, pw, pw} forKeys:{kCGPDFContextAllowsCopying, kCGPDFContextUserPassword, kCGPDFContextOwnerPassword})
       -- save password protected file
       (origPDFdoc's writeToFile:(bPOSIX) withOptions:(aDict))
   end if
end repeat

Last edited by KniazidisR (2021-05-12 06:47:18 am)


Model: MacBook Pro
OS X: Catalina 10.15.4
Web Browser: Safari 14.1
Ram: 4 GB

Offline

 

#3 2021-05-16 07:55:45 pm

One208
Member
Registered: 2021-03-15
Posts: 12

Re: Encrypt PDF

Thanks @KniazidisR for ur help
This works perfectly

I have done another cobbled up script, heavily borrowed, hope it helps somebody

Applescript:


# URL: https://www.macscripter.net/viewtopic.php?id=47872
# URL: https://macscripter.net/viewtopic.php?id=25916
# Appl: Quartz Filter Script
# Tags: @PDF @QuartzFilters @Compress @Reduce

use framework "Foundation"
use framework "Quartz"
use framework "QuartzCore"
use AppleScript version "2.4"
use scripting additions

property this : a reference to current application
property NSString : a reference to NSString of this
property NSURL : a reference to NSURL of this
property PDFDocument : a reference to PDFDocument of this
property NSDictionary : a reference to NSDictionary of this
property QuartzFilter : a reference to QuartzFilter of this


# Select the Filter
-- This Path for default Filters of ColorSync app (System Folder) https://www.macscripter.net/viewtopic.php?id=47872 (peavine)
-- set filterFolder to ((path to system folder as text) & "Library:Filters:") as alias
-- This Path for "User" Created Filters of ColorSync app
set filterFolder to ((path to home folder as text) & "Library:Filters:") as alias

tell application "Finder" to set filterFiles to the name of every file in filterFolder

repeat with aFile in filterFiles
   set contents of aFile to text 1 thru -9 of aFile
end repeat

choose from list filterFiles with prompt "Select a filter:" with title "Quartz Filter" default items (item 1 of filterFiles)
set selectedFilter to result

if selectedFilter = false then
   error number -128
else
   set aFilterURL to (filterFolder as text) & (item 1 of selectedFilter) & ".qfilter" as alias
   -- set filterFile to POSIX path of filterFile
end if

tell application "Finder" to set theAliases to (get selection as alias list) -- KniazidisR

repeat with anAlias in theAliases
   if (anAlias as text) ends with ".pdf" then
       set thePDFpath to POSIX path of anAlias
       set aURL to (NSURL's fileURLWithPath:thePDFpath)
       set origPDFdoc to (PDFDocument's alloc()'s initWithURL:aURL)
       
       -- construct output file names -- Viking OSX.
       set ws_file to (NSString's stringWithString:thePDFpath)
       set ws_ext to ws_file's pathExtension()
       set ws_base to ws_file's stringByDeletingPathExtension()
       set bPOSIX to ((ws_base's stringByAppendingString:"_Filtered")'s stringByAppendingPathExtension:ws_ext)
       
       -- Create options for the document -- Shane Stanley
       set aQFilter to (QuartzFilter's quartzFilterWithURL:aFilterURL)
       
       set aDict to (NSDictionary's dictionaryWithObjects:{aQFilter} forKeys:{"QuartzFilter"})
       -- save Filtered file
       (origPDFdoc's writeToFile:(bPOSIX) withOptions:(aDict))
   end if
end repeat

Offline

 

#4 2021-05-17 12:16:55 am

KniazidisR
Member
From:: Greece
Registered: 2019-03-03
Posts: 1878

Re: Encrypt PDF

Interesting script as well.

Note: your code can be improved little:

1) You coerce filterFolder reference firstly from alias to text, then back from text to alias. You can work with text (HFS path), so coercion to alias you can omit.
2) As I understand, using repeat loop, you cut filter files extensions (".qfilter"). You can cut them without repeat loop.
3) Your if statement can be shortened.
4) Your aFilterURL should be NSURL.
5) Some parentheses can be omitted.

Applescript:


# URL: https://www.macscripter.net/viewtopic.php?id=47872
# URL: https://macscripter.net/viewtopic.php?id=25916
# Appl: Quartz Filter Script
# Tags: @PDF @QuartzFilters @Compress @Reduce

use framework "Foundation"
use framework "Quartz"
use framework "QuartzCore"
use AppleScript version "2.4"
use scripting additions

property this : a reference to current application
property NSString : a reference to NSString of this
property NSURL : a reference to NSURL of this
property PDFDocument : a reference to PDFDocument of this
property NSDictionary : a reference to NSDictionary of this
property QuartzFilter : a reference to QuartzFilter of this


# Select the Filter
-- This Path for default Filters of ColorSync app (System Folder) https://www.macscripter.net/viewtopic.php?id=47872 (peavine)
-- set filterFolder to ((path to system folder as text) & "Library:Filters:") as alias
-- This Path for "User" Created Filters of ColorSync app
set filterFolder to (path to home folder as text) & "Library:Filters:"

tell application "Finder" to set filterFiles to (name of files of folder filterFolder) as text

set AppleScript's text item delimiters to ".qfilter"
set filterFiles to text items of filterFiles
set AppleScript's text item delimiters to ""

choose from list filterFiles with prompt "Select a filter:" with title "Quartz Filter" default items (item 1 of filterFiles)
set selectedFilter to result

if selectedFilter = false then error number -128

set aFilterURL to NSURL's fileURLWithPath:(POSIX path of (filterFolder & item 1 of selectedFilter & ".qfilter"))

tell application "Finder" to set theAliases to (get selection as alias list) -- KniazidisR

repeat with anAlias in theAliases
   if (anAlias as text) ends with ".pdf" then
       set thePDFpath to POSIX path of anAlias
       set aURL to (NSURL's fileURLWithPath:thePDFpath)
       set origPDFdoc to (PDFDocument's alloc()'s initWithURL:aURL)
       
       -- construct output file names -- Viking OSX.
       set ws_file to (NSString's stringWithString:thePDFpath)
       set ws_ext to ws_file's pathExtension()
       set ws_base to ws_file's stringByDeletingPathExtension()
       set bPOSIX to ((ws_base's stringByAppendingString:"_Filtered")'s stringByAppendingPathExtension:ws_ext)
       
       -- Create options for the document -- Shane Stanley
       set aQFilter to (QuartzFilter's quartzFilterWithURL:aFilterURL)
       
       set aDict to (NSDictionary's dictionaryWithObjects:{aQFilter} forKeys:{"QuartzFilter"})
       -- save Filtered file
       (origPDFdoc's writeToFile:bPOSIX withOptions:aDict)
   end if
end repeat

Last edited by KniazidisR (2021-05-17 01:10:05 am)


Model: MacBook Pro
OS X: Catalina 10.15.4
Web Browser: Safari 14.1
Ram: 4 GB

Offline

 

#5 2021-05-17 01:42:37 am

One208
Member
Registered: 2021-03-15
Posts: 12

Re: Encrypt PDF

Thanks for everything @KniazidisR

Newbie, learning applescript

Offline

 

#6 2021-05-20 08:26:18 pm

One208
Member
Registered: 2021-03-15
Posts: 12

Re: Encrypt PDF

Another In PDF Scripts

This one to get encryption info of PDF
Script improvement suggestions are welcome, again cut & paste
Cheers

Applescript:


-- Original 2015-11-02 13:48:32 +0900 by Takaaki Naganoya
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "QuartzCore"

tell application "Finder"
   set thePath to (get selection) as alias
end tell
set aPath to POSIX path of thePath

set aURL to current application's |NSURL|'s fileURLWithPath:(POSIX path of aPath)
set origPDFdoc to current application's PDFDocument's alloc()'s initWithURL:aURL

set aRes to my retProtectedPDFPermissions(origPDFdoc, aPath)

on retProtectedPDFPermissions(aPDFdoc, aPath)
   set anEncF to aPDFdoc's isEncrypted()
   if anEncF = false then return display dialog "File : " & name of (info for aPath) & return & "------------------" & return & "Not Encrypted" -- missing value
   
   set passLocked to aPDFdoc's unlockWithPassword:""
   
   set cpPerm to aPDFdoc's allowsCopying() as boolean
   set prPerm to aPDFdoc's allowsPrinting() as boolean
   set cmPerm to aPDFdoc's allowsCommenting() as boolean
   set caPerm to aPDFdoc's allowsContentAccessibility() as boolean
   set daPerm to aPDFdoc's allowsDocumentAssembly() as boolean
   set dcPerm to aPDFdoc's allowsDocumentChanges() as boolean
   set ffPerm to aPDFdoc's allowsFormFieldEntry() as boolean
   
   
   set myList to {openPermission:passLocked, copyPermission:cpPerm, printPermission:prPerm, commentPermission:cmPerm, contentAccessPermission:caPerm, assemblyPermission:daPerm, docchangePermission:dcPerm, formPermission:ffPerm}
   
   set PerList to Rec2UserKeyValues(myList) of me
   
   display dialog "File : " & name of (info for aPath) & return & "------------------------------" & return & PerList as string
   
end retProtectedPDFPermissions

on Rec2UserKeyValues(recAny)
   -- https://macscripter.net/viewtopic.php?pid=143257
   -- USE THE CLIPBOARD TO MAKE THE RECORD KEYS LEGIBLE
   set the clipboard to recAny
   set recLegible to (the clipboard as record)
   set lngPairs to count of (recAny as list)
   if lngPairs < 1 then return {}
   
   -- COLLECT ANY USER-DEFINED KEY-VALUE PAIRS
   set lstKeyValue to {}
   try
       set lstUser to list of recLegible
   on error
       display dialog (do shell script "osascript -e 'the clipboard as record'") buttons "OK" default button 1 with title "Contents of record"
       return {}
   end try
   
   repeat with i from 1 to (length of lstUser) - 1 by 2
       set end of lstKeyValue to {item i of lstUser, " : ", item (i + 1) of lstUser} & return & return
   end repeat
   -- display dialog lstKeyValue as string
   return lstKeyValue
end Rec2UserKeyValues


Filed under: PDF, Encryption

Offline

 

#7 2021-05-23 12:56:07 am

KniazidisR
Member
From:: Greece
Registered: 2019-03-03
Posts: 1878

Re: Encrypt PDF

One208 wrote:

Another In PDF Scripts

This one to get encryption info of PDF
Script improvement suggestions are welcome, again cut & paste
Cheers


Thanks. Again.
Well, that's not a bad idea. But the task of the script is simple, so it's better to shorten it:

Applescript:


-- Get PDF's permissions as record

use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "QuartzCore"

tell application "Finder" to tell (item 1 of (get selection)) to set {aPDF, aName} to {it, name of it}

set aURL to current application's |NSURL|'s fileURLWithPath:(POSIX path of (aPDF as alias))
set origPDFdoc to current application's PDFDocument's alloc()'s initWithURL:aURL
set aRes to my retProtectedPDFPermissions(origPDFdoc, aName)

on retProtectedPDFPermissions(aPDFdoc, aName)
   if false = aPDFdoc's isEncrypted() then ¬
       return display dialog "File : " & aName & return & "------------------" & return & "Not Encrypted"
   tell aPDFdoc to set aRecord to {openPermission:(its unlockWithPassword:""), copyPermission:its allowsCopying(), printPermission:its allowsPrinting(), commentPermission:its allowsCommenting(), contentAccessPermission:its allowsContentAccessibility(), assemblyPermission:its allowsDocumentAssembly(), docchangePermission:its allowsDocumentChanges(), formPermission:its allowsFormFieldEntry()}
   set RR to return & return
   set PerList to "File : " & aName & RR
   set PerList to PerList & "Opening Permissions: " & aRecord's openPermission & RR
   set PerList to PerList & "Copying Permissions: " & aRecord's copyPermission & RR
   set PerList to PerList & "Printing Permissions: " & aRecord's printPermission & RR
   set PerList to PerList & "Commenting Permissions: " & aRecord's commentPermission & RR
   set PerList to PerList & "Content Access Permissions: " & aRecord's contentAccessPermission & RR
   set PerList to PerList & "Assemblying Permissions: " & aRecord's assemblyPermission & RR
   set PerList to PerList & "Document Changing Permissions: " & aRecord's docchangePermission & RR
   display dialog PerList with title "File : " & aName
   return aRecord
end retProtectedPDFPermissions

Last edited by KniazidisR (2021-05-23 12:09:08 pm)


Model: MacBook Pro
OS X: Catalina 10.15.4
Web Browser: Safari 14.1
Ram: 4 GB

Offline

 

Board footer

Powered by FluxBB

RSS (new topics) RSS (active topics)