DTPab

印刷やデザイン、アドビ製アプリやスクリプトなど、雑多な技術ブログ

InDesign CC2017(12.1)で表のヘッダーとフッターが消える

(訂正 2017.11.11 11:09)CC2017では、古いドキュメントでも再現します。
(追記 2017.11.11 15:00)対策用のイベントスクリプトを追記しました。
(追記 2017.11.11 22:20)検証バージョンを追記しました。
(追記 2017.11.13 16:00)注意とスクリプトを追記しました。
(追記 2017.11.15 15:30)Adobeから日本語版サポートが出ました。
今朝方とんでもないものを見つけました。

forums.adobe.com

報告してくださったQ.kenさん、ありがとうございます。

事件の概要

以下のGIF画像の通り、CC2017で作成した表組をコピー・ペーストした際、ヘッダーとフッターがきれいに消えます。その後表に編集を加えると復帰するというもの。
f:id:uske_S:20171111081937g:plain

他のバージョンではどうか?

手元の環境(macOS 10.10.5、CS6〜CC2017)で試したところ、CC2017でだけ起こります。
また、これはCC2017で新規作成した場合に起こるようで、CS6で作った書類をCC2017で開いて同じことをしても発症しませんでした。
【訂正】古いドキュメントで作られた表でもCC2017では上のGIFのようになります。 CC2018は追って検証しますね。
【追記】CC2018では起きません。あくまでCC2017固有の不具合のようです。

解決策

解決策として、USフォーラムでは下記のサイトが紹介されています。

helpx.adobe.com

頼むから日本語でもアナウンスしてくれよ、Adobe…。

スクリプトでちょっとだけ対応

コピーとカットだけですが、スクリプトで監視するようにしました。
f:id:uske_S:20171111150151g:plain スクリプトはこちらからどうぞ。

www.dropbox.com

ただ、コピーとカットは見張れるのですが、option+ドラッグで複製した場合は現段階では対応できていません
どなたか「こんな方法があるよ!」という知見をお持ちの方、是非ご教示ください。
【追記 11/13 16:00】マスターページにある表をローカルページでオーバーライドしても発生するようです。

ソースコード

一応載せておきます。

/*
    InDesign CC2017(12.1)で、表組の複製時にヘッダーとフッターが消えてしまうことへの警告を出すイベントスクリプト
    参考:https://forums.adobe.com/thread/2409742
    ©Yusuke S.(@Uske_S)
    2017.11.11 作成
    配布元:http://uske-s.hatenablog.com/
*/

#targetengine "checkHeaderFooter"

if (parseInt(app.version,10) !== 12) exit();
app.menuActions.item("$ID/&Copy").addEventListener("beforeInvoke", main);
app.menuActions.item("$ID/Cut").addEventListener("beforeInvoke", main);

function main(){
    var myDoc = app.activeDocument;
    var mySel = (myDoc.selection.length)? myDoc.selection: exit();
    var res;
    for (var i=0; i<mySel.length; i++){
        res = checkoutTxf(mySel[i]);
        var myAllItems = mySel[i].allPageItems;
        for (var k=0; k<myAllItems.length; k++) res = checkoutTxf(myAllItems[k]);
        }
    if (res) alert("コピーした選択範囲に表のヘッダー・フッターが含まれています。\rCC2017ではペースト後に表ヘッダー・フッターが消えますので注意してください");
    //オブジェクトをチェックする関数
    function checkoutTxf(obj){
        if (obj.constructor.name === "TextFrame" && getTableHF(obj)) return true;
        }
    //テキストフレームの表内にヘッダーかフッターがあるか調べる
    function getTableHF(txfObj){
        if (!txfObj.tables.length) return false;
        var t = txfObj.tables;
        for (var i=0; i<t.length; i++){
            if (t[i].headerRowCount || t[i].footerRowCount) return true;
            }
        return false;
        }
    }

使い方

startupScriptsフォルダに入れてください。
startupScriptsとはなんぞや?という方は、先日のDTP勉強会のスライドを貼っておきますので、こちらをご参照ください。

www.dropbox.com

スライド2枚めにあるように、ひとつのフォルダに任意のスクリプトをまとめておき、複数のバージョンのInDesign(のscriptsフォルダ)へエイリアスで対応させるとスマートです。ただこのスクリプトに関してはCC2017でだけ動作するようにしているので、CC2017のstartupScriptsフォルダに入れるだけでも事足りるとは思います。
スクリプトに関する不具合等はコメントしていただくか、Twitterでご連絡ください。

【追記 11/13 16:00】Q.kenさんのスクリプト(一部改変)

フォーラムでQ.kenさんがスクリプトを書いてくださいました。ただそのままだとペーストボードやマスターページのものが省かれてしまいます*1。そこで、Page.allPageItemsDocument.allPageItemsに書き換えたものが下記スクリプトです。フォーラムにも投稿したので承認されれば見えるようになりますが、念のためこちらにも掲載しておきます。

//全ページに対して実行する  
var doc = app.activeDocument;  
  
//ページ内の全てのオブジェクトをループ処理でテキストフレームを選別  
var allObjLen = doc.allPageItems.length;  
for (var j=0; j<allObjLen; j++) {  
    var myItemAllObj = doc.allPageItems[j];  
    if (myItemAllObj.constructor.name === "TextFrame") {  
    tableInFrame (myItemAllObj);  
    }  
}  
  
//表を含むテキストフレームに対して1mm伸ばして元に戻す  
function tableInFrame (myTextFrame){  
    if (myTextFrame.tables.length > 0){  
    var frameY2 = myTextFrame.visibleBounds[2];  
    myTextFrame.visibleBounds = [  
        myTextFrame.visibleBounds[0],   
        myTextFrame.visibleBounds[1],  
        myTextFrame.visibleBounds[2]+1,  
        myTextFrame.visibleBounds[3]];  
    myTextFrame.visibleBounds = [  
        myTextFrame.visibleBounds[0],  
        myTextFrame.visibleBounds[1],  
        frameY2,  
        myTextFrame.visibleBounds[3]];  
    }  
}  

欲を言えば「PDF書き出し」のメニューアクションのbeforeInvokeイベントにでも挟めば完璧でしょう。その場合は、

  1. Document.allPageItemsからTextFrameオブジェクトを抽出し、中に表があれば(tables.length > 0)ヘッダー・フッターの有無(HeaderRowCount等)を調べる
  2. ヘッダー・フッターがあればテキストフレームを調整していいのか警告を出す(confirm
  3. 良ければ上記スクリプトを実行する

てな感じでイベントを実装すればいいのかなと思います。

【追記 11/15 15:30】Adobe式日本語版ヘルプ

helpx.adobe.com

やっと出ました。一体どんな不具合だったのかよくわからない「簡潔な」表記ですが、一応これで対応できそうです。

*1:Page.allPageItemsはローカルページに触れているオブジェクトに限定されます。PBやマスターも含めたい場合は、Document.allPageItemsを利用します。