用 VBScript 自動抓取 XML 匯入 InDesign

感謝 aladdin 的提示(參見前文),我試著用 XMLHTTP 重新寫寫看之前想要寫的 vbscript,試了一下,果然能用。既然成功的來源來自於網路,想來也該放上來一份。

這段 script 的用途,主要是希望能夠透過 InDesign 內建的「指令碼」功能,按一個按鈕,就自動抓取遠端網站上的 XML 檔案,匯入到文件中。因為 XML 文件具有結構的特性,每一層結構都可以放置許多的資訊,因此,在排版的時候,就可以不像以往如果要在同一份出版品檔案中要置入很多文件的話,需要一篇一篇慢慢置入,主要的好處在於,如此一來可以用任何具有輸出 XML 功能的網站出版工具,當作是管理稿件的平台,在多人共同完成稿件之後,一次匯入,也就比較不會有抓錯稿件的問題,或同一份出版品同時有線上、平面發行時,方便兩邊的內容同步。

去年我就用 AppleScript 做過在 Mac OS X 上的嘗試,而今天放上來的示範,則是供 Windows 平台上的 InDesign CS 2 使用,示範如何自動抓取生命力新聞網的 RSS 內容排版。

看圖說一下故事好了。

Indesign

首先,請先把本文最後的程式碼剪貼到一個文字檔案中,儲存成副檔名為「.vbs」的文字檔,例如「匯入生命力新聞.vbs」,將這個檔案放到「C:\Program Files\Adobe\Adobe InDesign CS2\Presets\Scripts\」下,啟動 InDesign CS 2,點選「視窗」->「自動」->「指令碼」,便可以叫出「指令碼」視窗,裡頭應該就會出現我們剛才放進去的檔案。接著,開啟一個新檔案,在上面點選,就會跳出一個訊息視窗,說「匯入完畢」,就已經完成了檔案匯入。

接著,用「檢視」->「結構」->「顯示結構」,就可以像圖中一樣,在文件的左方,出現一長排以階層排列的項目,其中 item 代表的就是網站上的文章,有十個 item,代表我們已經一次抓下、並匯入了十篇生命力新聞網的文章。文章的內文部份,放在 content:encoded 標籤中,只要直接將某篇文章的這個標籤,拖拉到版面上(畫面中的是〈環保藝術節 讓吸管「活」起來〉這篇報導),就可以開始排版,而不用慢慢置入了。

使用 XML 的好處還包括,因為在 XML 中,資訊已經先加上了各種標籤,標記其意義的屬性,例如前述的 content:encoded 在版面上的意義應該是「內文」,那麼,只要在版口上先定義好「內文」這個樣式,將樣式對應到 XML 標籤上,當我們把 content:encoded 的內容拖過來時,就會自動套用上應該使用的視覺樣式,例如顏色、字體、尺寸…等。而如果做了一個預留了對應到 XML 的欄框的版面,那,在匯入 XML 的時候,其實就已經完成了大部分的排版工作。

程式碼如下:


' 定義一些要使用的物件
Set WS = CreateObject("WScript.Shell")
Dim WinHttpReq
Set WinHttpReq = CreateObject("Msxml2.XMLHTTP.3.0")
myfile = "c:\windows\temp\temp.xml" '暫存檔案的位置—假如 windows 裝在 c:

' 輸入生命力新聞網 RSS 的 URL
WinHttpReq.Open "GET", "http://www.newstory.info/index.rdf", False
WinHttpReq.Send
If (WinHttpReq.Status = 200) Then
' 從遠端抓取的文字內容會放在 ResponseText 裡頭
sTemp = WinHttpReq.ResponseText
' 做一些處理。
' 很奇怪,Windows 版 InDesign 的 XML Parser 在處理 XML 時,如果在檔頭
' 加入了編碼的註解,往往無法解譯成功。不知道為什麼。
' 而如果同一個 XML 無法在 IE 開啟(但是在 FF 卻可以時),往往 InDesign
' 也無法開啟。—會不會 InDesign 用的是 IE 的元件還怎樣?不解。
sTemp = Replace(sTemp, "encoding=""utf-8""", "")
' 拿掉一些排版時不需要的東西,例如編碼過的 html 語法…。
sTemp = Replace(sTemp, " WebText = sTemp
Else
WebText = ""
End If

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile(myfile, 1, 1) '以 Unicode 方式寫入
objFile.Write(WebText)
objFile.Close

' 把 InDesign 開起來吧。
Set myInDesign = CreateObject("InDesign.Application.CS2")
if (myInDesign.Documents.Count < 1) then ' 沒有文件就開新檔案 Set myDocument = myInDesign.Documents.Add else Set myDocument = myInDesign.activeDocument end if ' 匯入其實只有一行而已。 myDocument.ImportXML(myfile) WS.Popup("匯入完畢!")

3 thoughts on “用 VBScript 自動抓取 XML 匯入 InDesign

  1. 拜讀你的文章,對於Indesign+XML的功能挺有興趣
    目前我公司希望朝向以Indesign+XML來發展印刷相關的事業
    如果承蒙仁兄看得起,希望有機會能談談

    謝謝

  2. 請問zonble:
    我想閱讀之前你發表過的一篇 「InDesign/InChinese教學講義」檔案,可是連結點下去一直出現無法顯示網頁的訊息,無法正常下載,不知哪裡還可以下載拜讀zonble這篇講義內容?

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.