備忘錄_20160105(定位) 修改 回首頁

程式 2023-05-23 21:11:03 1684847463 100
精準定位列印 Part II

精準定位列印 Part II

<!DOCTYPE html>
<html>
 
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>列印測試</title>
    <style>
      
      /* -- 最重要的 CSS 設定 -- */
      
      *
      { 
        margin: 0;
        padding: 0;
      }
      
      @page
      {
        size: A4 portrait;
        margin: 0
        border: 0;
        padding: 0;
      }
      
      div.onePage
      {
        margin: 0;
        border: 0;
        padding: 0;
        
        page-break-after: always;
        
        page-break-inside: avoid;
        break-inside: avoid;
        
        position: relative;
        top: 0;
        left: 0;
        width: 210mm;
        height: 297mm;        
      }
      
      svg.classSvg
      {
        position: absolute;
        left: 0cm;
        top: 0cm;
      }
      
      @media print
      {
        @page { margin: 0; }
        
        #divWrapper_htm, .classHr
        {
          display: none !important;
        }
      }
      
    </style>
    <style>
      
      /* -- 其他 CSS 設定 -- */
      
      #divWrapper_htm
      {
        margin: 1em;
      }
      
      #divWrapper_htm .classHeader
      {
        margin: 0 auto;
        text-align: center;
      }
      
      .classHr
      {
        margin-top: 1em;
        margin-bottom: 1em;
        border: 1px solid #eeeeee;
      }
      
    </style>
  </head>
 
  <body>
    <div id="divWrapper_htm">
      <div class="classHeader">
        <h2>列印測試</h2>
      </div>
      <br>
      <div style="margin: 1em;">
        <div>
          <div>瀏覽器設定說明:</div>
          <div>Firefox 113.0.1 (64bit)</div>
          <ol>
            <li>Paper Size:A4</li>
            <li>Orientation:Portrait</li>
            <li>Scale:100</li>
            <li>Margins:None</li>
            <li>Format:Original</li>
            <li>Options:[unckecked]Print headers and footers</li>
            <li>Options:[unckecked]Print backgrounds</li>
          </ol>
        </div>
        <button type="button" onclick="print_test();" style="padding: 1em; margin: 1em; font-size: 1.3em;">執行測試</button>
      </div>
      <script>
        
        function print_test()
        {
          gebi("divPrintTest").innerHTML="";
          
          var iPages=20;
          for(var iPageIdx=1; iPageIdx<=iPages; iPageIdx++)
          {
            var oDiv=document.createElement("div");
            oDiv.classList.add("onePage");
            
            var oSvg=document.createElement('svg');
            oSvg.classList.add("classSvg");
            oSvg.setAttribute("width","21.0cm");
            oSvg.setAttribute("height","29.7cm");
            
            // 繪製表格-垂直線
            var straX=[];
            for(var iTmp=1, iParts=2; iTmp<iParts; iTmp++) { straX.push(iTmp*210/iParts); }
            for(var iX=0; iX<straX.length; iX++)
              { oSvg.appendChild(getOPrn_line(oSvg,straX[iX]+"mm","0mm",straX[iX]+"mm","297mm","black","0.2mm")); }
            
            // 繪製表格-水平線
            var straY=[];
            for(var iTmp=1, iParts=7; iTmp<iParts; iTmp++) { straY.push(iTmp*297/iParts); }
            for(var iY=0; iY<straY.length; iY++)
              { oSvg.appendChild(getOPrn_line(oSvg,"0mm",straY[iY]+"mm","210mm",straY[iY]+"mm","black","0.2mm")); }
            
            // 不限範圍文字
            oDiv.appendChild(getOPrn_text("10mm","10mm","標楷體","18pt","10mm,10mm test"));
            oDiv.appendChild(getOPrn_text("150mm","10mm","新細明體","12pt","頁次:"+iPageIdx+" / "+iPages));
            
            // 限定範圍文字
            oDiv.appendChild(getOPrn_box_text("20mm","30mm","新細明體","14pt","Hello, CSS and print! This is a box! Good! Great! Out of box!","40mm","20mm","left"));
  
            // 把 svg 埋在一頁的尾巴(線條是用 svg 模擬出來的)
            var oDiv4Svg=document.createElement("div");
            oDiv4Svg.setAttribute("style","margin: 0; border: 0; padding: 0;");
            oDiv4Svg.innerHTML=oSvg.outerHTML;
            oDiv.appendChild(oDiv4Svg);
            
            // 把一頁的 div 加入
            gebi("divPrintTest").appendChild(oDiv);
            
            // 分隔線,列印時會隱藏
            var oHr=document.createElement("hr");
            oHr.setAttribute("class","classHr");
            gebi("divPrintTest").appendChild(oHr);
          }
          
        }
        
        function getOPrn_line(oSvg,strX1,strY1,strX2,strY2,strStroke,strStrokeWidth)
        {
          // 畫線
          var oLine=document.createElement("line");
          oLine.setAttribute("x1",strX1);
          oLine.setAttribute("y1",strY1);
          oLine.setAttribute("x2",strX2);
          oLine.setAttribute("y2",strY2);
          oLine.setAttribute("stroke",strStroke);
          oLine.setAttribute("stroke-width",strStrokeWidth);
          return oLine;
        }
        
        function getOPrn_text(strLeft,strTop,strFontFamily,strFontSize,strText)
        {
          // 不限範圍文字
          var oDiv=document.createElement("div");
          oDiv.style.display="inline-block";
          oDiv.style.position="absolute";
          oDiv.style.left=strLeft;
          oDiv.style.top=strTop;
          oDiv.style.fontFamily=strFontFamily;
          oDiv.style.fontSize=strFontSize;
          oDiv.innerHTML=strText;
          
          return oDiv;
        }
        
        function getOPrn_box_text(strLeft,strTop,strFontFamily,strFontSize,strText,strWidth,strHeight,strTextAlign)
        {
          // 限定範圍文字
          var oDiv=document.createElement("div");
          oDiv.style.display="block";
          oDiv.style.width=strWidth;
          oDiv.style.height=strHeight;
          
          oDiv.style.margin="0";
          oDiv.style.border="0";
          oDiv.style.padding="0";
          
          oDiv.style.position="absolute";
          oDiv.style.left=strLeft;
          oDiv.style.top=strTop;
          
          oDiv.style.wordBreak="break-all";
          oDiv.style.overflow="hidden";
          oDiv.style.fontSize=strFontSize;
  
          oDiv.style.textAlign=strTextAlign;
          
          oDiv.innerHTML=strText;
          
          return oDiv;
        }
        
        function gebi(strId)
        {
          return document.getElementById(strId);
        }
        
      </script>
      
    </div>
    <div id="divPrintTest"></div>
  </body>
 
</html>