InDesign 的 Scriping

雖然說一年多前就在讀關於 InDesign 的 Scripting 相關的文件,不過,上個星期才比較認真的寫出了一些自己需要的 Script。而上個星期荒廢了 blog 一周,全都是在研究 InDesign 的 Scirpt,還有就是做一支 Flash …話說我也將近三年沒把 Flash 拿出來用了(因為實在很不喜歡 Flash),做這個 Flash,也是千百個不願意,而打開 Flash 的介面,幾乎又是從頭摸索起。

InDesign 支援幾種不同的程式語言開發 script,可以透過這些 script ,在 InDesign 中以程式的方式完成許多例行的排版工作,甚至可說是自動排版;在 Mac OS 上的版本支援 AppleScript 語言,在 Windows 上的版本支援 Visual Basic 以及 VB Script,而從 InDesign CS 版開始,則內建一個 JavaScript 的解譯器,寫出來的 script 在 Mac OS 與 Windows 上均可使用。寫出這些 script 後,只要把程式放在 InDesign 應用程式目錄下的 script 目錄,就可以在 InDesign 中的script(InChinese 翻譯成「腳本」)面板中,按一個按鈕,便可以執行這些 script。

要開發 InDesign 的各種 script,有幾份文件是一定要看的,一是一份 InDesign Scripting Guide,扼要介紹 script 的寫作,另外一份則是 InDesign Scripting Reference,這分文件有將近兩千頁,說明在 InDesign 中各種可用的物件及其屬性,在每個版本的 InDesign 光碟中,都可以找到這兩份文件。在 Adobe 網站上也可以找到 CS 以及 CS 2的文件:

http://www.adobe.com/products/indesign/scripting.html
http://www.adobe.com/products/indesign/pdfs/indesign_cs_scripting_guide.pdf
http://www.adobe.com/products/indesign/pdfs/InDesign_Scripting_Guide.pdf
http://www.adobe.com/products/indesign/pdfs/InDesign_Scripting_Reference.pdf

在 CS 版的時候,這兩份資料是寫在同一份文件中, CS2 之後則分開成兩份文件,可見這玩意也是愈搞愈是複雜。

需要注意的是,在不同版本之間,各種變數名稱也略有不同,也就是,當你寫好給 2.0 版用的 script 的時候,還是需要改寫,才能夠供後續版本使用,例如,在 2.0 版當中各種不同品質的 PDF 匯出設定叫做「樣式」(Style),到了 CS 之後,則改名叫做 Preset 了。

要寫 InDesign 的 script,大概需要一點背景知識,一方面是需要些許的程式語言能力,另一方面就是要了解各種英文的出版術語,因為各種可用的物件名稱,都是根據排版軟體當中的各種術語命名。這似乎也是在中文世界中實在沒有什麼 InDesign scripting 資訊的原因,因為同時有兩項能力的交集者,想來實在不多,而以中文市場來看,我想 Adobe 大概也不會將這兩份文件翻譯成中文。

雖然 JavaScript 寫出來的 script 可以跨平台,不過實際在使用的時候便可以發現,有得必有失,因為寫出來的程式碼是為內建的解譯器所執行,所以能夠呼叫的,也就只有 InDesign 內部的功能而已,而不能夠呼叫作業系統基底的其他功能,所能夠做的事情也有限,甚至可說有點難用。所以在 scripting 的時候,還是採用 Apple Script 或 VB Script 方便些,而我自己不會 VB Script,以下的範例,都是以 Apple Script 寫作的。

在 InDesign 中寫一個有用的 script ,幾乎都會用到 document 這個物件,因為各種文件編排的工作,都是在一個文件視窗當中進行,對於應用程式(application)層次能做的,頂多只能夠做些什麼把程式關掉之類的事情,這種事情大概也不需要寫 script…。所以,一個 script,大概都會有這樣的外殼:

tell application "Indesign 2.0.2"
activate
set myDocument to active document
tell myDocument
(在這邊寫我們要做的事情)
end tell
end tell

這段程式碼的意思是,讓 InDesign 從背景中呼叫到前景來,然後對正在使用中的文件做一些事情,而如果是要開新的文件的話,那就是把前面的程式碼,改成 set myDocument to make new document。例如,我們可以把一些常用的段落樣式(paragraph style)寫在程式中,然後,每次只要開一份新文件,就可以按一個按鈕,把需要的樣式匯入到文件中,如以下範例:

tell application "Indesign 2.0.2"
activate
set myDocument to active document
tell myDocument

set myNewStyle to make new paragraph style with properties {name:"內文", applied font:"文鼎明體", font style:"Medium", point size:12, leading:18, justification:left justified, first line indent:"12pt", kerning method:"optical", align to baseline:true}
set MyXMLTag to make new XML Tag with properties {name:"content"}
set MYMap to make new XML import map with properties {mapped paragraph style:myNewStyle, markup tag:"content"}

end tell
end tell

這段範例中,我們建立了一個叫做「內文」的段落樣式,字體為文鼎中明體、大小為 12 point、行距 18 pt、每段第一行前空 12pt(也就是空一個字)。然後,我們建立了一個 XML 標籤,叫做 content,並且建立 content 這個標籤與「內文」段落樣式之間的關聯。

說到了 XML。InDesign 從 2.0 版之後(希望沒有記錯),支援了 XML 的匯入功能,也就是,當你從選單上選擇要匯入 XML 之後,文件視窗旁邊就會出現一個叫做「結構」的邊欄,之後,只要從邊欄中把某個 XML 標籤當中的內容拖到版面上,就可以排版了,而經過實測,只要在 XML 文件中加入正確的文字編碼資訊(例如 <?xml version="1.0" encoding="Big5"?>),就可以正確處理各種編碼。(您可以參閱我很久以前寫的幾篇東西:透過 Blog、XML 與 InDesign 的編排流程,以及如果有一個能夠輸出 XML 的題庫資料庫,然後可以在 InDesign 排版的話,就是自動化考卷了。)而將 XML 標籤與段落樣式建立關聯的用意就是,當從外部匯入了 XML 資料之後,只要把 content 這個標籤拖到版面上,就會以12 point 的文鼎中明體編排。

而想要按一個按鈕,就把某個網路上的 xml 檔案,直接匯入到 InDesign 文件中的方法如下:


-- 設定路徑與檔名
property target_URL : "http://zonble.net/index.rdf"
set the destination_file to ((path to desktop as string) & "zonble.xml")

-- 下載檔案到桌面
tell application "URL Access Scripting"
download target_URL to file destination_file replacing yes
end tell

-- 匯入 InDesign
tell application "Indesign 2.0.2"
activate
set myDocument to active document
try
tell myDocument
tell XML import preferences
set import style to merge import
end tell
import XML from destination_file
end tell
end try
end tell

-- 把用過的檔案丟入垃圾桶
tell application "Finder"
move destination_file to trash
end tell

可以注意到,這段程式用到了 URL Access Scripting 還有 Finder ,先把檔案抓到桌面上,匯入,然後丟到垃圾桶。如前所述,如果用內建的 JavaScript,就沒有辦法做這樣的事情,內建的 JavaScript 並沒有 XMLHttpRequest() 之類的東西,可以從遠端抓取檔案,實在有些彆腳。

回到前面提到的建立段落樣式。可以發現,中文版本的 InDesign 提供了許多英文版所沒有的排版功能,以符合需要,而中文版的功能又多從日文版而來,在段落樣式的部份,就包括如避頭點、英文字在直排時翻轉、以及日文編排時常需要的旁註(ruby)等,而這些亞洲國家排版時所需要的設定,我始終還不知道如何用 Script 控制(甚至懷疑,可能根本沒有辦法用 script 控制),原因很簡單,文件只有英文版,而英文版中沒有這方面的資訊。

最後來示範一個匯出的script,這個 Script 會以固定的 PDF 樣式匯出,如果沒有這個樣式,就會主動建立。這個範例取自於 Adobe 網站。


set filename to (path to desktop) & "myfile.pdf" as string

tell application "Indesign 2.0.2"
set myPDFstyleName to "My Style"
set found to false

-- Find existing PDF export styles of the same name
set numstyles to count PDF export styles
repeat with myCounter from 1 to numstyles
set currentstyleName to name of PDF export style myCounter
if currentstyleName is equal to myPDFstyleName then
-- Found, so don't make a new one
set found to true
end if
end repeat

-- Not found, so make a new PDF export style
if found is false then
display dialog "找不到「My Style」這個 PDF 匯出樣式,建立新的匯出樣式中,請記得調整成正確的屬性。 " buttons {"好"} default button 1 with icon note
make PDF export style with properties {name:myPDFstyleName, view PDF:true, omit EPS:true, color bitmap compression:none, grayscale bitmap compression:none}
end if

try
set myErrorMessage to "No documents are open"
set myDocument to active document
set myErrorMessage to "無法匯出 PDF到" & filename
-- Turn off user interaction to avoid dialogs
set user interaction level to never interact
tell myDocument
-- Export the document as Adobe PDF
export format "Adobe PDF" to filename using myPDFstyleName
end tell
-- Revert user interaction
set user interaction level to interact with all
on error
activate
display dialog myErrorMessage with icon note
end try

2 thoughts on “InDesign 的 Scriping

  1. Pingback: :::zonble’s promptbook » 是了—我放棄:::

Comments are closed.