#kintone で SpreadJS を印刷
SpreadJS は機能豊富ですが、印刷関連機能については、いまのところ見当たりません。
とりあえず、印刷できないか試してみました。
##kintone の標準印刷機能で SpreadJS を印刷
標準印刷機能では、何も表示されません。
SpreadJS は、canvas 上に描画されているためだと思われます。
#canvas をimage 変換して、印刷
簡易的な対策として、canvas をimage 変換して、印刷してみます。
スプレッドシートは、canvas 上に描画されている部分しか印刷されません。
まあ、そうですよね。
#スプレッドシートの表示サイズ変更後に印刷
表示サイズ変更後すぐに印刷処理を行うと、描画が間に合わないため、サイズ変更前の印刷でした。
描画を待つのも面倒なので、サイズ変更ボタンで追加して、印刷するしくみにしました。
残念ながら、PDF の表示は、それほどよくありません。あくまで簡易的な印刷ですね。
#JavaScript
IFRAME を作成して、スプレッドシートのCANVAS から IMAGE 変換して印刷しています。
サイズ変更は、height 変更後に再描画しても、うまくいかなかったため、再作成しています。
if(event.type == "app.record.detail.show"){
// 印刷ボタン
var btn1 = document.createElement('button');
btn1.setAttribute("id", "xp-btn-print1")
btn1.style.width="100px";
btn1.style.height="35px";
btn1.style.align="center";
btn1.style.margin="0 0 0 10px";
btn1.appendChild(document.createTextNode('シート印刷'));
btn1.onclick = function(){
// 印刷用フレーム作成
var iframe = document.createElement('IFRAME');
var doc = null;
document.body.appendChild(iframe);
doc = iframe.contentWindow.document;
var strHtml = '<body>';
strHtml += '<h1 id="xp-title" style="margin: 5px;"></h1>';
strHtml += '<img id="xp-img1">';
strHtml += '</body>';
doc.write(strHtml);
doc.close();
// スプレッドシートをpngに変換して、フレームにセット
var cvs1Id = sspace1.id + 'vp_vp';
var cvs1 = window.document.getElementById(cvs1Id);
if(cvs1){
var img1 = doc.getElementById('xp-img1');
img1.src = cvs1.toDataURL();
}
// タイトルセット
var head1 = doc.getElementById('xp-title');
head1.textContent = event.record['タイトル']['value'];
// 印刷処理
iframe.contentWindow.focus();
iframe.contentWindow.print();
document.body.removeChild(iframe);
}
kintone.app.record.getHeaderMenuSpaceElement().appendChild(btn1);
// シート表示サイズ変更
var btn2 = document.createElement('button');
btn2.setAttribute("id", "xp-btn-print2")
btn2.style.width="100px";
btn2.style.height="35px";
btn2.style.align="center";
btn2.style.margin="0 0 0 10px";
btn2.appendChild(document.createTextNode('サイズ'));
btn2.onclick = function(){
$(sspace1).empty();
if($(sspace1).css("height") == "300px")
$(sspace1).css("height","900px");
else
$(sspace1).css("height","300px");
$(sspace1).wijspread();
spread = $(sspace1).wijspread("spread");
if(event.record['データ']['value']){
// インポート
spread.fromJSON(JSON.parse(event.record['データ']['value']));
}
}
kintone.app.record.getHeaderMenuSpaceElement().appendChild(btn2);