ken_nogi/NodeJS/Care7/1_PDFtoCSV.js
Kenichiro NOGI 51a95c5e21 NodeJS
2025-07-10 10:12:37 +09:00

93 lines
3.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const { v4: uuidv4 } = require('uuid');
function convert(base64Data, year, month) {
const fileName = uuidv4(); // 一意のファイル名を生成
const tempPdfPath = path.join(__dirname, `${fileName}.pdf`);
const tempTxtPath = path.join(__dirname, `${fileName}.txt`);
const tempCsvPath = path.join(__dirname, `${fileName}.csv`);
try {
// base64データをPDFファイルとして保存
fs.writeFileSync(tempPdfPath, Buffer.from(base64Data, 'base64'));
// pdftotextでテキスト抽出-layout -nopgbrk オプションを追加)
execSync(`pdftotext -layout -nopgbrk "${tempPdfPath}" "${tempTxtPath}"`);
// テキストファイルを1行ずつ読み込み、指定された処理を施す
const text = fs.readFileSync(tempTxtPath, 'utf8');
const lines = text.split('\n');
fs.writeFileSync(tempCsvPath, '識別コード,主/副,担当者名,訪問時間,終了時間,対応時間,予防,内容,その他,クライアント,主/副担当者\n');
let subRecord = '';
for (let line of lines) {
line = line.replace(//gm, ' '); // コロン スペース変換
line = line.replace(//gm, ' '); // チルダ スペース変換
line = line.replace("副)", ' 副 '); // 副) スペース変換
line = line.replace(/\(/gm, ''); // カッコ削除
line = line.replace("分)", ''); // 分) 削除
line = line.replace(/^\s+/gm, ''); // 行頭スペース削除
line = line.replace(/\s$/gm, ''); // 行末スペース削除
line = line.replace(/\s+/gm, ' '); // 多重スペース縮小
let record = line.split(/\s/);
subRecord = record.length == 1 && record[0];
if (record.length > 10 && record.length < 18) {
if (record[1] != '副') {
record.splice(1, 0, '主');
}
if (record[10] == '予防') {
record.splice(12, 0, subRecord);
subRecord = "";
} else {
record.splice(10, 0, "");
record.splice(12, 0, subRecord);
subRecord = "";
}
if (record.length == 15) {
record.splice(16, 0, '');
record.splice(17, 0, '');
}
let output = record.join(','); //カンマ保存
//if (record.length == 16) console.log(record.length + ' ' + record);
//インポート用CSVデータ作成
let recordData = `${year}.${month}_${record[2]}${record[3]}_${record[0]},` +
`${record[1]},` +
`${record[2]} ${record[3]},` +
`${year}/${month}/${record[4]} ${record[5]}:${record[6]}:00,` +
`${year}/${month}/${record[4]} ${record[7]}:${record[8]}:00,` +
`${record[9]},` +
`${record[10]},` +
`${record[11]},` +
`${record[12]},` +
`${record[13]} ${record[14]},`;
if (record[15] != '') {
recordData += `${record[15]} ${record[16]}`;
}
fs.appendFileSync(tempCsvPath, recordData + '\n');
}
}
// CSVデータを返す
return fs.readFileSync(tempCsvPath, 'utf8');
} finally {
// 一時ファイル削除
[tempPdfPath, tempTxtPath, tempCsvPath].forEach(file => {
if (fs.existsSync(file)) fs.unlinkSync(file);
});
}
}