コードでの表データ抽出

このサンプルでは、オプション設定と抽出範囲をあらかじめコード上で指定し、表データ抽出を行う方法を紹介しています。 PDFドキュメントは、スプレッドシートのように明確なテーブル構造を持たないため、テキストの位置から表の構成を推測するしかありません。 オプション設定を使用することで、こうした表構成の検出(推測)時の微調整が可能となり、さまざまな文書レイアウト・構成からのデータ抽出を実現します。

var React, viewer, tableDataExtractor; /** * 表データ抽出を行う領域を指定する座標情報 * フォーマット: [x1, y1, x2, y2] * 座標の起点はページの左下 */ const selectionBounds = [29.259600728808035, 334.3295250560871, 688.918658156098, 490.80681277047995]; /** * 抽出された表データに関するログ * @param {Object} data - 抽出された表データ */ function logTableData(data) { if (Array.isArray(data) && data.length > 0) { data = data[0]; } if (data?.cols && data?.rows) { console.log(`抽出結果=列数: ${data.cols.length}, 行数: ${data.rows.length}`); } else { console.log("抽出された表データはありません。"); } } /** * 指定されたオプション設定で表データ抽出を行う * @param {Object} extractOptions - オプション設定 */ async function applyExtraction(extractOptions) { const extractedData = await tableDataExtractor.extractTableData(0, selectionBounds, undefined, { extractOptions }); logTableData(extractedData); } /** * ツールバーに配置するボタンをスタイル付きで生成する * @param {string} text - ボタンのラベル * @param {Function} callback - クリック時に実行される処理 * @returns {Object} 生成されたボタン(React要素) */ function createToolbarButton(text, callback) { const disabled = !viewer.canEditDocument; return React.createElement("button", { className: "gc-btn gc-btn--accent", disabled, style: { padding: "0 10px" }, onClick: disabled ? null : callback, title: text }, text); } /** * PDFビューワの初期化処理(PDFファイルのロードを含む) * @param {string} selector - ビューワコンテナのDOMセレクタ */ function loadPdfViewer(selector, pdfUrlToOpen) { viewer = new DsPdfViewer(selector, { supportApi: getSupportApiSettings() }); React = viewer.getType("React"); tableDataExtractor = viewer.tableDataExtractor; tableDataExtractor.activate(); const panelHandle = viewer.addTableExtractionPanel(); viewer.expandPanel(panelHandle); // 異なるオプション設定ごとに表データ抽出を行うボタンをセカンドツールバー上に配置する viewer.options.secondToolbar = { render: function(toolbarKey) { if (toolbarKey === "sample-toolbar") { return [ createToolbarButton("列間認識:狭く", async () => { applyExtraction({ CoefMinimumDistanceBetweenCols: 0.2 }); }), createToolbarButton("列間認識:広く", async () => { applyExtraction({ CoefMinimumDistanceBetweenCols: 1.0 }); }), createToolbarButton("行間認識:狭く", async () => { applyExtraction({ CoefMinimumDistanceBetweenRows: 0.5 }); }), createToolbarButton("行間認識:広く", async () => { applyExtraction({ CoefMinimumDistanceBetweenRows: 0.9 }); }), createToolbarButton("最小行高:低い", async () => { applyExtraction({ MinimumRowHeight: 1.0 }); }), createToolbarButton("最小行高:高い", async () => { applyExtraction({ MinimumRowHeight: 20.0 }); }), createToolbarButton("最小列幅:狭い", async () => { applyExtraction({ MinimumColWidth: 1.0 }); }), createToolbarButton("最小列幅:広い", async () => { applyExtraction({ MinimumColWidth: 30.0 }); }) ]; } return null; } }; viewer.addDefaultPanels(); viewer.open(pdfUrlToOpen).then(function() { viewer.zoomMode = 1; }); // カスタマイズしたセカンドツールバーを表示する viewer.showSecondToolbar("sample-toolbar"); } window.onload = function() { //DsPdfViewer.LicenseKey = "***key***"; var pdfUrlToOpen = "/diodocs/pdfviewer/demos/product-bundles/assets/pdf/table-data-one-page.pdf"; loadPdfViewer("#viewer", pdfUrlToOpen); }
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>コードでの表データ抽出</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="./src/styles.css"> <script src="/diodocs/pdfviewer/demos/product-bundles/build/dspdfviewer.js"></script> <script src="/diodocs/pdfviewer/demos/product-bundles/build/wasmSupportApi.js"></script> <script src="/diodocs/pdfviewer/demos/resource/js/init.js"></script> <script src="./src/app.js"></script> </head> <body> <div id="viewer"></div> </body> </html>
#viewer { height: 100%; }