PDF from Clipboard, if exists append

Here is ASObjC Script that create PDF from Clipboard.

If the file do not exists it will create a new PDF, if the PDF do exists it will append page.

The nice thing about this script its very easy to copy pages from Preview to build a new PDF.
Its also possible to run a shortcut on iPhone with image as inputs, copy (on iPhone) and execute
this script to build PDF on the Desktop. Any image copy on mobile device become a clipboard item
if iPhone and Mac computer share the same Network

I have test it and it looks to work, maybe there is a better approach.
I’m not sure if bestPasteboardType approach works, I copy a file from Finder and got Icon Image.

use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"
use framework "Quartz"
use scripting additions

set theSavePath to POSIX path of (path to desktop) & "Clipboard.pdf"

set favType to {"com.adobe.pdf", "public.tiff"}

set pasteboard to current application's NSPasteboard's generalPasteboard()
set bestPasteboardType to pasteboard's availableTypeFromArray:favType
if bestPasteboardType is not missing value then
	set clipData to pasteboard's dataForType:bestPasteboardType
	if clipData is not missing value then
		set image to current application's NSImage's alloc()'s initWithPasteboard:pasteboard
		if image is not missing value then
			set page to current application's PDFPage's alloc()'s initWithImage:image
			try
				if FileExists(theSavePath) then
					set pdfURL to current application's |NSURL|'s fileURLWithPath:theSavePath
					set myFile to current application's PDFDocument's alloc()'s initWithURL:pdfURL
					set pageNum to myFile's pageCount()
					myFile's insertPage:page atIndex:pageNum
					log "Clipboard data append"
				else
					set pageData to page's dataRepresentation()
					set myFile to current application's PDFDocument's alloc()'s initWithData:pageData
				end if
				myFile's writeToFile:theSavePath
				log "Clipboard data write to file..."
			end try
		end if
	end if
else
	log "No Clipboard data"
end if

on FileExists(theFile) -- (String) as Boolean
	tell application "System Events"
		if exists file theFile then
			return true
		else
			return false
		end if
	end tell
end FileExists

@KniazidisR, Thanks for your input.
This is properly the final ASObjC script from me, with @KniazidisR suggestions.


use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"
use framework "Quartz"
use scripting additions

set theSavePath to POSIX path of (path to desktop) & "Clipboard.pdf"

my pasteboardForType:{"com.adobe.pdf", "public.tiff"} savePath:theSavePath

on pasteboardForType:tagetPasteboardType savePath:theSavePath
	set pasteboard to current application's NSPasteboard's generalPasteboard()
	set pasteboardType to pasteboard's availableTypeFromArray:tagetPasteboardType
	if pasteboardType is not missing value then
		set clipData to pasteboard's dataForType:pasteboardType
		set image to current application's NSImage's alloc()'s initWithPasteboard:pasteboard
		set page to current application's PDFPage's alloc()'s initWithImage:image
		if fileExists(theSavePath) then
			set pdfURL to current application's |NSURL|'s fileURLWithPath:theSavePath
			set pdfDoc to current application's PDFDocument's alloc()'s initWithURL:pdfURL
			pdfDoc's insertPage:page atIndex:(pdfDoc's pageCount())
			log "Clipboard data append"
		else
			set pageData to page's dataRepresentation()
			set pdfDoc to current application's PDFDocument's alloc()'s initWithData:pageData
		end if
		pdfDoc's writeToFile:theSavePath
		log "Clipboard data write to file..."
	else
		log "No Clipboard data"
	end if
end pasteboardForType:savePath:

on fileExists(theFile)
	tell application "System Events"
		if exists file theFile then
			return true
		else
			return false
		end if
	end tell
end fileExists

Nice script, that might come in handy, Fredrik71.
I don’t think it can be improved much. But it seems to me that one check of bestPasteboardType for missing value is enough, since the result of the other conditions depends only on the first one. Also, the handler for checking the existence of a file can be written more accurately:


use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"
use framework "Quartz"
use scripting additions

set theSavePath to POSIX path of (path to desktop) & "Clipboard.pdf"

set pasteboard to current application's NSPasteboard's generalPasteboard()
set bestPasteboardType to pasteboard's availableTypeFromArray:{"com.adobe.pdf", "public.tiff"}
if bestPasteboardType is not missing value then
	set clipData to pasteboard's dataForType:bestPasteboardType
	set image to current application's NSImage's alloc()'s initWithPasteboard:pasteboard
	set page to current application's PDFPage's alloc()'s initWithImage:image
	if FileExists(theSavePath) then
		set pdfURL to current application's |NSURL|'s fileURLWithPath:theSavePath
		set myFile to current application's PDFDocument's alloc()'s initWithURL:pdfURL
		myFile's insertPage:page atIndex:(myFile's pageCount())
		log "Clipboard data append"
	else
		set pageData to page's dataRepresentation()
		set myFile to current application's PDFDocument's alloc()'s initWithData:pageData
	end if
	myFile's writeToFile:theSavePath
	log "Clipboard data write to file..."
else
	log "No Clipboard data"
end if

on FileExists(theFile) -- (input: Posix path, output: Boolean)
	tell application "System Events" to if exists file theFile then return true
	return false
end FileExists