[PDF] Web Worker
by Wijmo5_jp
HTML
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.grapecity.com/wijmo/5.latest/styles/wijmo.min.css">
<script src="https://cdn.grapecity.com/wijmo/5.latest/controls/wijmo.min.js"></script>
<script src="https://cdn.grapecity.com/wijmo/5.latest/controls/wijmo.grid.min.js"></script>
<script src="https://cdn.grapecity.com/wijmo/5.latest/controls/wijmo.pdf.min.js"></script>
<script src="https://cdn.grapecity.com/wijmo/5.latest/controls/wijmo.grid.pdf.min.js"></script>
<script src="https://cdn.grapecity.com/wijmo/5.latest/controls/wijmo.gauge.min.js"></script>
<script src="https://cdn.grapecity.com/wijmo/5.latest/controls/cultures/wijmo.culture.ja.min.js"></script>
<script src="https://demo.grapecity.com/wijmo/sample/scripts/sample.js"></script>
<link rel="stylesheet" href="https://demo.grapecity.com/wijmo/sample/styles/sample.css">
<div class="container">
<h1>Web Worker</h1>
<p>PDFをバックグラウンドで生成します。</p>
<p>UIスレッドとは別のスレッドでPDF生成処理を実行するため、大きなPDFを生成しても、UIがフリーズすることはありません。また、処理をキャンセルしたり、進捗率を取得することもできます。</p>
<label for="rowCount">グリッド行数</label>
<select id="rowCount">
<option value="10000">10,000</option>
<option value="100000">100,000</option>
</select><br>
<button id="exportGridWorker" class="btn btn-default">PDFを作成(Web Worker使用)</button>
<button id="exportGrid" class="btn btn-default">PDFを作成(Web Workerなし)</button><br>
<div id="progressGauge"></div>
<span id="progressText">0</span>%完了
<div id="flexGrid"></div>
</div>
CSS
#flexGrid {
height: 300px;
margin-top: 20px;
}
#progressGauge {
width: 400px;
display: inline-block;
vertical-align: middle;
}
#progressText {
width: 30px;
display: inline-block;
text-align: right;
}
#exportGridWorker, #exportGrid {
width: 230px;
}
JavaScript
var rowCount = document.getElementById('rowCount');
var exportGridWorker = document.getElementById('exportGridWorker');
var exportGrid = document.getElementById('exportGrid');
var progressGauge = new wijmo.gauge.LinearGauge('#progressGauge', {
value: 0
});
var progressText = document.getElementById('progressText');
var isExporting = false;
var exportSettings = {
embeddedFonts: [
{
source: 'https://demo.grapecity.com/wijmo/sample/fonts/ipaexg.ttf',
name: 'ipaexg'
}
],
styles: {
cellStyle: {
font: {
family: 'ipaexg'
}
}
}
};
var flexGrid = new wijmo.grid.FlexGrid('#flexGrid', {
itemsSource: sample.orders(rowCount.value)
});
flexGrid.columns[1].width = 200;
rowCount.addEventListener('change', function() {
flexGrid.collectionView.sourceCollection = sample.orders(rowCount.value);
});
// Web Workerを作成
var cdn = 'https://demo.grapecity.com/wijmo/beta/controls/';
var script =
"importScripts('" + cdn + "wijmo.min.js');" +
"importScripts('" + cdn + "wijmo.pdf.min.js');" +
"importScripts('" + cdn + "wijmo.grid.pdf.min.js');" +
"wijmo.grid.pdf.PdfWebWorker.initExportGrid();";
var blob = new Blob([script], { type:'text/javascript' });
var worker;
// Web Workerを使用してPDFを作成
exportGridWorker.addEventListener('click', function() {
if (!isExporting) {
// バックグラウンドスレッドで重い処理を実行するため、ボタンを変更すると表示が更新される
isExporting = true;
exportGridWorker.innerText = 'キャンセル';
exportGrid.disabled = true;
// PDF生成処理を実行
worker = new Worker(URL.createObjectURL(blob));
wijmo.grid.pdf.PdfWebWorkerClient.exportGrid(worker, flexGrid, 'FlexGrid.pdf', exportSettings, done, progress);
} else {
// PDF生成処理をキャンセル
worker.terminate();
progress(0);
isExporting = false;
exportGridWorker.innerText = 'PDFを作成(Web Worker使用)';
exportGrid.disabled = false;
}
});
// PDF作成完了時に実行されるコールバック関数
function done() {
isExporting = false;
exportGridWorker.innerText = 'PDFを作成(Web Worker使用)';
...