使用可能な幅に収まるように構成された JavaScript レンダラーを使用して、いくつかのプロットを生成しています。関連するコードは次のようになります。
<div id="sales-plot">Loading...</div>
#sales-plot{
width: 30%;
height: 275px;
}
FusionCharts.setCurrentRenderer("javascript");
var salesPlot = null;
$("#sales-plot").each(function(){
salesPlot = new FusionCharts("/js/FusionCharts/Pie2D.swf",
"fc-" + this.id, "100%", "100%", debugMode);
salesPlot.setJSONUrl("/data/sales-plot.json";);
salesPlot.render(this.id);
});
ここまでは順調ですね。ユーザーがページを印刷するときに問題が発生します。プロットは、A4 シートで使用可能な幅の 2 倍になります。印刷用の CSS コードを微調整しようとしましたが、壁にぶつかりました。どうやら、FusionCharts はグラフのピクセル寸法を計算してハードコーディングしているようです。
<svg height="275" version="1.1" width="379" xmlns="http://www.w3.org/2000/svg"
style="overflow: hidden; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-user-select: none; cursor: default; position: relative;
background-color: rgb(255, 255, 255);">
CSS を使用して<svg>
要素またはその祖先の幅を縮小すると、切り取られたグラフしか得られません。
@media print{
#sales-plot{
width: 5cm;
height: 3cm;
}
}
グラフは元のサイズを維持するため、コンテナーからオーバーフローします。FusionChart は、ウィンドウのサイズを変更するとグラフのサイズを変更しますが、印刷するときは明らかにそうではありません。
これは簡単に修正できますか?
編集: SVG グラフィック スケールを外側のコンテナーに合わせて作成する方法について Google で検索し、そのような変更を行うための JavaScript ハックを作成しました。
function handleDrawComplete(eventObject, argumentsObject){
var $svg = $("svg", eventObject.sender.ref);
var w = argumentsObject.width;
var h = argumentsObject.height;
$svg
.attr("viewBox", "0 0 " + w + " " + h)
.attr("preserveAspectRatio", "xMinYMin meet")
.attr("width", "100%")
.attr("height", "100%");
$svg[0].clientWidth = 5000;
$svg[0].width = 5000;
$svg[0].pixelUnitToMillimeterX = 0.8;
}
おもしろいことに、ブラウザー開発者ツールを使用して生成されたコードを静的な HTML ページにコピーし、グラフを正しい寸法で印刷できますが、動的に生成されたグラフは CSS 印刷規則を完全に無視します。私はコードをいじって作成しましたが、これは私の Windows 7 コンピューターでどのように見えるかです (スクリーンショットは Firefox 22 のもので、50% にリサンプリングされています。他のすべてのブラウザーは同じ動作を示します)。
画面
印刷する
(生成された A4 PDF)