cssでtransformを利用して表示を縮小した場合、印刷すると、途中のtdの高さが大きくなってしまいます。
これを統一した高さに設定したいのですが、どのようにcssを調整すれば良いでしょうか?
ご教示いただければと存じます。
Chromeの開発ツールでRenderingを利用してprint表示にしても、ブラウザ上では均等の高さです。
ですが、実際に印刷する(PDF保存)と、私の手元の環境では「テスト26」の行が高さが高くなっております。
使用ブラウザ : Chrome バージョン: 98.0.4758.80(Official Build) (arm64)
html
1<?php 2 3 4?> 5<!DOCTYPE html> 6<html> 7<head> 8 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 9 <meta http-equiv="Content-Style-Type" content="text/css"> 10 <title>サンプル</title> 11 <style> 12 table { 13 border-collapse: collapse; 14 } 15 table tr td { 16 border: 1px solid #000; 17 height: 23px!important; 18 border : 1px #000 solid; 19 padding : 1px 1em 1px 1em; 20 } 21 22 @media print { 23 body { 24 width: 297mm; 25 height: 210mm; 26 margin : 0 auto; 27 padding : 20mm; 28 /* transform: scale(0.61); 削除*/ 29 /* transform-origin: 0 0; 削除*/ 30 } 31 @page { 32 size: A4 landscape; 33 margin: 0 auto; 34 } 35 36 /*wrap追加*/ 37 div.wrap { 38 transform: scale(0.61); 39 transform-origin: 0 0; 40 } 41 42 } 43 </style> 44</head> 45<body> 46 <div class="wrap"><!-- wrap追加 --> 47 <table> 48 <tbody> 49 <?php for($i=0;$i<50;$i++): ?> 50 <tr> 51 <td>テスト<?=$i?></td> 52 <td>サンプル</td> 53 <td>サンプル</td> 54 <td>サンプル</td> 55 <td>サンプル</td> 56 </tr> 57 <?php endfor; ?> 58 </tbody> 59 </table> 60 </div> 61</body> 62</html> 63
追加
PlugOut777様のご教示を受け、
div.wrapをbodyとtableの間に追加し、テーブルの行数を30行から50行に追加したところ、
32行目で同じような現象が発生しました。
transform: scale()を用いる理由や意図などはありますか?
もし、scaleが原因なのであれば、それを避ける実装で逃げる、ということも出来ると思いますが。
Eskee様、書き込みありがとうございます。
かなり大きなテーブルを1ページ(A4横)で印刷させる必要がありまして、そのためにはtransform: scale()を利用して縮小印刷を行う必要があると考えております。
(Chromeだと10px以下に文字フォントを設定できないため、transformを利用する以外に1ページに収める方法が思いつかなかった次第です。)
なるほど。要件としては、A4横(スクショ画像は縦ですが…)に納めないといけないのですね。
それであれば、プリンタドライバ側の印刷設定で縮小するのが一番確実だと思いましたが、それではダメでしょうか?
ユーザー側での縮小印刷ではなく、ブラウザ側というかシステム側というか、こちら側で実現することが求められております。
(画像が大きくなるので、スクショはカットしたので違和感あるかと思いますが、実際はもう少し行数の多いテーブルをA4横 1ページで全体を印刷できる必要があることが要件となっております。)
body自体にtransform:scale()を設定するのはおすすめしません。
(今回のような表示崩れの原因になります)
こちらの環境で試してみたところ、transform:scale()と@pageのsizeに設定されたlandscapeが噛み合わずに表示崩れを起こしている様に見えました。
bodyタグとtableタグの間にdivタグなどでwrapperを用意し、そこに対してtransform:scale()を設定するとお望みのことが実現できるかと思いますがどうでしょう?
こちらでも、PlugOut777さんのご指摘内容で解決できたことを確認しました。
PlugOut777様、Eskee様、ありがとうございます。
質問内容を修正(追記)させていただいたのですが、50行に増やすと同様の現象(32行目)が発生しました。
Eskee様は解決できたとおっしゃられているので、私がPlugOut777様のご指摘内容を組み込めていないのかもしれません。。。
すみません、入れ違いで申し訳ないのですが、
確かに50行目まで増やすと、追加で貼っていただいたスクリーンショットと同様になりました。
Eskee様、再度のご確認ありがとうございます。
Chrome以外のブラウザではどうでしょうか?
Firefox(Windows 10)で確認したところ、そもそもテーブルの罫線が表示されませんでした。
Eskee様、ありがとうございます。
今回記載が漏れておりましたが、Chrome環境指定でございまして、そもそもChromeでは実現不可能なものなのかもしれません。。。
念の為、safariと firefox (OS : Mac Monterey) で確認いたしましたが、当該問題は発生しておらず、問題なく同じ高さのtdで印刷できました。(罫線の表示もされておりました。)
Chromeエミュレーションでは問題なく、実際のPDF出力時点で差異が出るってのがクセモノですね。
こういう状況証拠が揃うと、ChromeのPDF出力機能自体のバグじゃないかという気がします。
Chrome縛りの要件であれば、バックエンドかフロントエンドでPDF出力して、それを印刷させる、という機能を考えてみてもいいかもしれません(工数は増えますが)
とりあえず、手ごろなのはフロントエンドでjsPDFとhtml2canvasというライブラリを組み合わせるのが試すのにもゴールが近くて良いんじゃないでしょうか。
https://proglearn.com/2020/11/13/%E3%80%90%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%82%E3%82%8A%E3%80%91jspdf%E3%81%A8html2canvas%E3%82%92%E4%BD%B5%E7%94%A8%E3%81%97%E3%81%A6-html%E7%94%BB%E9%9D%A2%E3%82%92pdf%E5%8C%96%E3%81%97/
Eskee様、ご連絡ありがとうございました。
今回PlugOut777様のご提案の内容が、他のライブラリも使用せずcssだけで完結できるシンプルなご提案を頂戴しましたので、こちらをベストアンサーにさせていただきました。
Eskee様にも非常に多方面な角度からご指摘・ご教示いただき、深く感謝申し上げたく存じます。
ありがとうございました!
回答2件
あなたの回答
tips
プレビュー