generated at
pdfから1 pageずつテキストを取得するDeno script
pdftotextを使う

2023-04-09
11:22:16 deno-library/progressで進捗状況を出す
10:49:10 deno-cliffyを使う
pathの接続にはdeno_std/path.join()を使う
10:33:51 Deno.Command()を使う
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.ts
import { 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.ts
const 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.ts
const progress = new ProgressBar({ total: pageNum, }); progress.render(0);

PDFのページ数を取得し、JSONに変換する
script.ts
for (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));

#2023-04-09 11:22:11
#2021-04-16 21:23:44
#2021-04-12 01:49:31
#2021-02-26 01:46:28