pdfから1 pageずつテキストを取得するDeno script
2023-04-09
2021-04-12 02:17:53 ひとつのjsonファイルにテキストデータをまとめるようにした
同時に画像ファイルも取得できるようにしたいなー
$ deno run --allow-read --allow-write --allow-run -r=https://scrapbox.io https://scrapbox.io/api/code/takker/pdfから1_pageずつテキストを取得するDeno_script/script.ts
$ deno check --remote -r=https://scrapbox.io https://scrapbox.io/api/code/takker/pdfから1_pageずつテキストを取得するDeno_script/script.ts
script.tsimport { ensureDir } from "../deno_std%2Ffs/mod.ts";
import { parse } from "../deno_std%2Fflags/mod.ts";
import { join } from "../deno_std%2Fpath/mod.ts";
import { getPDFpageNum } from '../PDFのページ数を取得/deno.ts';
import { Command } from "https://deno.land/x/cliffy@v0.25.7/command/mod.ts";
import ProgressBar from "https://deno.land/x/progress@v1.3.8/mod.ts";
const { args: [filename], options } = await new Command()
.name("pdftotext-1by1")
.description("pdfから1 pageずつテキストを取得する")
.version("v1.0.0")
.option("-l, --last <last:number>", "ここで指定したページ数までテキストを取得する")
.option(
"-o, --output <output:string>",
"出力先directory",
)
.arguments("<filename:string>")
.parse(Deno.args);
options.output ??= Deno.cwd();
await ensureDir(options.output);
script.tsconst json = [];
const pageNum = options.last ?? await getPDFpageNum(await Deno.readFile(filename));
const zero = (n: number) => `${n}`.padStart(Math.floor(Math.log10(pageNum)) + 1, '0');
script.tsconst progress = new ProgressBar({
total: pageNum,
});
progress.render(0);
script.tsfor (let i = 0; i < pageNum; i++) {
const page = i + 1;
const path = join(options.output, `./${zero(page)}.txt`);
const command = new Deno.Command("pdftotext", {
args: ["-f", `${page}`, "-l", `${page}`, filename, path],
});
const { success, stderr } = await command.output();
if (!success) {
const message = new TextDecoder().decode(stderr);
console.error(message);
throw Error(message);
}
const text = await Deno.readTextFile(path);
json.push(text);
progress.render(page);
}
await Deno.writeTextFile(join(options.output, `./text-data.json`), JSON.stringify(json));