常見做法:JS 呼叫 PrintControl.ExecWB() 實現直接列印/預覽。效果與控制力一般,但能應付基本需求。
// preview: true=預覽, false/null=直接列印
function printPage(preview) {
try {
var content = document.body.innerHTML;
var oricontent = content;
// 隱藏標記 {$printhide} → style='display:none'
while(content.indexOf("{$printhide}") >=0) content = content.replace("{$printhide}", "style='display:none'");
// 注入 PrintControl ActiveX
if(content.indexOf('ID="PrintControl"') <0)
content += '<OBJECT ID="PrintControl" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></OBJECT>';
document.body.innerHTML = content;
// ExecWB 命令: 6=列印, 7=預覽, 1=提示, 6=直接
if(preview==null||preview==false) PrintControl.ExecWB(6,1);
else PrintControl.ExecWB(7,1);
document.body.innerHTML = oricontent; // 還原
} catch(ex){ alert("JS 執行錯誤。"); }
}
// 列印指定區塊 HTML
function printConten(preview, html) {
try {
var content = html;
var oricontent = document.body.innerHTML;
while(content.indexOf("{$printhide}") >=0) content = content.replace("{$printhide}", "style='display:none'");
if(content.indexOf('ID="PrintControl"') <0)
content += '<OBJECT ID="PrintControl" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></OBJECT>';
document.body.innerHTML = content;
if(preview==null||preview==false) PrintControl.ExecWB(6,1);
else PrintControl.ExecWB(7,1);
document.body.innerHTML = oricontent;
} catch(ex){ alert("JS 執行錯誤。"); }
}
<script>
function Print(preview) {
var text = document.getElementById("content").innerHTML;
printConten(preview, text);
}
</script>
將欲列印區塊包在 <div id="content"> 中,按鈕呼叫 Print(true/false) 即可。利用 {$printhide} 標記隱藏不想列印的區域。