昨日販売開始した「Cocoa Scripting Course #1」で同じページが連続している箇所をみつけてしまいました。近日中に修正しますが、これを自動でチェックするAppleScriptを書いておく必要性を感じ、作っておきました。
オープンソースのPDFビューワー「Skim」でオープン中のPDFの全ページのテキストを取得し、取得したあとで連続するページのテキスト同士を比較してチェックしています。
必要に応じて各ページを画像にレンダリングして比較する必要があるかと思っていたのですが、テキストだけでもけっこう検出できているのでこんな感じでしょうか。
このページは、AppleScriptにより実際のファイルを検出して表の内容を自動更新していたのですが、その作業バックアップのためにページそのものを複製して誤操作というか作業のやり直しに備えていたのですが、それを削除し忘れたかっこうです。
AppleScript名:最前面のPDFで連続して同じページが存在するかチェック.scptd |
— – Created by: Takaaki Naganoya – Created on: 2021/03/13 — – Copyright © 2021 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use framework "Quartz" use scripting additions script pdfStore property aList : {} end script set (aList of pdfStore) to {} tell application "Skim" set dCount to count every document if dCount = 0 then return tell front document set myPath to path set pCount to count every page end tell end tell set anNSURL to (current application’s |NSURL|’s fileURLWithPath:myPath) set theDoc to current application’s PDFDocument’s alloc()’s initWithURL:anNSURL repeat with i from 0 to (pCount – 1) set aPage to (theDoc’s pageAtIndex:i) set tmpStr to (aPage’s |string|()) set the end of (aList of pdfStore) to (tmpStr as string) end repeat set resList to {} repeat with i from 1 to (pCount – 1) set aText1 to contents of item i of (aList of pdfStore) set aText2 to contents of item (i + 1) of (aList of pdfStore) if aText1 = aText2 then set the end of resList to {i, i + 1} end if end repeat if resList is equal to {} then display notification "PDFに重複ページは見られませんでした。" else set aText to listToText(resList) of me set the clipboard to aText display dialog "重複ページ:" default answer aText with icon 1 buttons {"OK"} default button 1 end if on listToText(aList) set listText to {"{"} set quotChar to ASCII character 34 set firstFlag to true repeat with i in aList set j to contents of i set aClass to class of i if (aClass = integer) or (aClass = number) or (aClass = real) then set the end of listText to (getFirst(firstFlag) of me & j as text) set firstFlag to false else if (aClass = string) or (aClass = text) or (aClass = Unicode text) then set the end of listText to ((getFirst(firstFlag) of me & quotChar & j as text) & quotChar) set firstFlag to false else if aClass is list then set the end of listText to (getFirst(firstFlag) of me & listToText(j)) –ちょっと再帰処理 set firstFlag to false end if end repeat set the end of listText to "}" set listText to listText as text return listText end listToText on getFirst(aFlag) if aFlag = true then return "" if aFlag = false then return "," end getFirst |
More from my site
(Visited 45 times, 1 visits today)