pdf-fox 1.1.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -3
- package/dist/cli.js +21 -8
- package/dist/cli.js.map +1 -1
- package/dist/converter.d.ts.map +1 -1
- package/dist/converter.js +20 -0
- package/dist/converter.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,15 +13,18 @@ npm install pdf-fox
|
|
|
13
13
|
## CLI
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
# Convert all pages
|
|
16
|
+
# Convert all pages → 1.png, 2.png, ... next to the input
|
|
17
17
|
npx pdf-fox input.pdf
|
|
18
18
|
|
|
19
|
-
# Specify output directory
|
|
19
|
+
# Specify output directory → output/1.png, output/2.png, ...
|
|
20
20
|
npx pdf-fox input.pdf -o output/
|
|
21
21
|
|
|
22
|
-
# Convert a specific page
|
|
22
|
+
# Convert a specific page → 2.png
|
|
23
23
|
npx pdf-fox input.pdf -p 2
|
|
24
24
|
|
|
25
|
+
# Save a single page to an explicit file
|
|
26
|
+
npx pdf-fox input.pdf -p 1 -o cover.png
|
|
27
|
+
|
|
25
28
|
# Set resolution (default: 200 DPI)
|
|
26
29
|
npx pdf-fox input.pdf --dpi 300
|
|
27
30
|
```
|
|
@@ -34,10 +37,17 @@ Options:
|
|
|
34
37
|
-b, --background <color> Background color (default: white)
|
|
35
38
|
-f, --font <name=path> Substitute font for a non-embedded font (repeatable)
|
|
36
39
|
--no-system-fonts Disable automatic CJK system-font fallback
|
|
40
|
+
--bold <px> Thicken text by this width in px (e.g. 0.6; default: 0)
|
|
37
41
|
-h, --help Show help
|
|
38
42
|
-V, --version Show version
|
|
39
43
|
```
|
|
40
44
|
|
|
45
|
+
### Text looks too thin?
|
|
46
|
+
|
|
47
|
+
PDF.js renders glyph outlines faithfully, so text can look lighter than in a
|
|
48
|
+
browser, which applies extra font smoothing on macOS. Thicken it with `--bold`
|
|
49
|
+
(or the `stemDarkening` option), e.g. `--bold 0.6`.
|
|
50
|
+
|
|
41
51
|
### Non-embedded fonts
|
|
42
52
|
|
|
43
53
|
If a PDF references a font without embedding it, those glyphs would render as
|
|
@@ -86,6 +96,7 @@ const rendered = await convertPdfToPng(pdf, {
|
|
|
86
96
|
| `background` | `string` | `"white"` | Background color (any CSS color string) |
|
|
87
97
|
| `fonts` | `Record<string, string>` | `{}` | Substitute fonts for non-embedded fonts, mapping the PDF's font name to a local font file path |
|
|
88
98
|
| `systemFontFallback` | `boolean` | `true` | Point `serif`/`sans-serif` at an available CJK system font so non-embedded CJK text renders. Disable for font-independent output |
|
|
99
|
+
| `stemDarkening` | `number` | `0` | Thicken text by stroking glyph outlines with this width in output pixels, approximating browser font smoothing. `0` disables; try `0.5`–`1.0` |
|
|
89
100
|
|
|
90
101
|
## Requirements
|
|
91
102
|
|
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { parseArgs } from "util";
|
|
3
3
|
import { readFileSync, writeFileSync, mkdirSync, existsSync, statSync } from "fs";
|
|
4
|
-
import { resolve,
|
|
4
|
+
import { resolve, dirname, join } from "path";
|
|
5
5
|
import { homedir } from "os";
|
|
6
6
|
import { createRequire } from "module";
|
|
7
7
|
import { convertPdfToPng, convertPdfPageToPng } from "./index.js";
|
|
@@ -24,11 +24,12 @@ Options:
|
|
|
24
24
|
-f, --font <name=path> PDF が埋め込んでいないフォントの代替を指定
|
|
25
25
|
(複数指定可。name は PDF 内のフォント名)
|
|
26
26
|
--no-system-fonts CJK システムフォントへの自動フォールバックを無効化
|
|
27
|
+
--bold <px> テキストを太らせる幅 px(例: 0.6。デフォルト: 0=無効)
|
|
27
28
|
-h, --help ヘルプを表示
|
|
28
29
|
-V, --version バージョンを表示
|
|
29
30
|
|
|
30
31
|
Examples:
|
|
31
|
-
pdf-fox doc.pdf 全ページ変換 →
|
|
32
|
+
pdf-fox doc.pdf 全ページ変換 → 1.png, 2.png ...
|
|
32
33
|
pdf-fox doc.pdf -o out/ 出力先ディレクトリを指定
|
|
33
34
|
pdf-fox doc.pdf -p 2 2ページ目のみ変換
|
|
34
35
|
pdf-fox doc.pdf -p 1 -o cover.png 1ページ目を cover.png として保存
|
|
@@ -44,6 +45,7 @@ function parseCliArgs() {
|
|
|
44
45
|
background: { type: "string", short: "b" },
|
|
45
46
|
font: { type: "string", short: "f", multiple: true },
|
|
46
47
|
"no-system-fonts": { type: "boolean" },
|
|
48
|
+
bold: { type: "string" },
|
|
47
49
|
help: { type: "boolean", short: "h" },
|
|
48
50
|
version: { type: "boolean", short: "V" },
|
|
49
51
|
},
|
|
@@ -70,6 +72,10 @@ function parseCliArgs() {
|
|
|
70
72
|
if (isNaN(dpi) || dpi <= 0) {
|
|
71
73
|
exitWithError("--dpi は正の数を指定してください");
|
|
72
74
|
}
|
|
75
|
+
const stemDarkening = values.bold !== undefined ? Number(values.bold) : 0;
|
|
76
|
+
if (isNaN(stemDarkening) || stemDarkening < 0) {
|
|
77
|
+
exitWithError("--bold は 0 以上の数を指定してください");
|
|
78
|
+
}
|
|
73
79
|
return {
|
|
74
80
|
inputPath: positionals[0],
|
|
75
81
|
outputOption: values.output,
|
|
@@ -78,6 +84,7 @@ function parseCliArgs() {
|
|
|
78
84
|
background: values.background ?? "white",
|
|
79
85
|
fonts: parseFontMappings(values.font),
|
|
80
86
|
systemFontFallback: !values["no-system-fonts"],
|
|
87
|
+
stemDarkening,
|
|
81
88
|
};
|
|
82
89
|
}
|
|
83
90
|
// Parses repeated `--font name=path` values into a name → path map.
|
|
@@ -102,21 +109,20 @@ function resolveHome(path) {
|
|
|
102
109
|
return path;
|
|
103
110
|
}
|
|
104
111
|
function resolveOutputSpec(inputPath, outputOption) {
|
|
105
|
-
const stem = basename(inputPath, extname(inputPath));
|
|
106
112
|
if (!outputOption) {
|
|
107
|
-
return { kind: "directory", dir: dirname(resolve(inputPath))
|
|
113
|
+
return { kind: "directory", dir: dirname(resolve(inputPath)) };
|
|
108
114
|
}
|
|
109
115
|
const resolved = resolve(outputOption);
|
|
110
116
|
// 末尾スラッシュ or 既存ディレクトリはディレクトリ出力として扱う
|
|
111
117
|
if (outputOption.endsWith("/") || (existsSync(resolved) && statSync(resolved).isDirectory())) {
|
|
112
|
-
return { kind: "directory", dir: resolved
|
|
118
|
+
return { kind: "directory", dir: resolved };
|
|
113
119
|
}
|
|
114
120
|
return { kind: "file", path: resolved };
|
|
115
121
|
}
|
|
116
122
|
function buildOutputPath(spec, pageNumber) {
|
|
117
123
|
if (spec.kind === "file")
|
|
118
124
|
return spec.path;
|
|
119
|
-
return join(spec.dir, `${
|
|
125
|
+
return join(spec.dir, `${pageNumber}.png`);
|
|
120
126
|
}
|
|
121
127
|
function writePage(outputPath, page) {
|
|
122
128
|
mkdirSync(dirname(outputPath), { recursive: true });
|
|
@@ -128,7 +134,7 @@ function exitWithError(message) {
|
|
|
128
134
|
process.exit(1);
|
|
129
135
|
}
|
|
130
136
|
async function run() {
|
|
131
|
-
const { inputPath, outputOption, page, dpi, background, fonts, systemFontFallback } = parseCliArgs();
|
|
137
|
+
const { inputPath, outputOption, page, dpi, background, fonts, systemFontFallback, stemDarkening } = parseCliArgs();
|
|
132
138
|
const scale = dpi / PDF_BASE_DPI;
|
|
133
139
|
let pdfBuffer;
|
|
134
140
|
try {
|
|
@@ -146,6 +152,7 @@ async function run() {
|
|
|
146
152
|
background,
|
|
147
153
|
fonts,
|
|
148
154
|
systemFontFallback,
|
|
155
|
+
stemDarkening,
|
|
149
156
|
});
|
|
150
157
|
}
|
|
151
158
|
catch (err) {
|
|
@@ -156,7 +163,13 @@ async function run() {
|
|
|
156
163
|
}
|
|
157
164
|
let pages;
|
|
158
165
|
try {
|
|
159
|
-
pages = await convertPdfToPng(pdfBuffer, {
|
|
166
|
+
pages = await convertPdfToPng(pdfBuffer, {
|
|
167
|
+
scale,
|
|
168
|
+
background,
|
|
169
|
+
fonts,
|
|
170
|
+
systemFontFallback,
|
|
171
|
+
stemDarkening,
|
|
172
|
+
});
|
|
160
173
|
}
|
|
161
174
|
catch (err) {
|
|
162
175
|
exitWithError(err instanceof Error ? err.message : String(err));
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/converter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAkH1D,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,GAAG,UAAU,EAC1B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,OAAO,CAAC,CAIlB;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,GAAG,UAAU,EAC1B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,OAAO,EAAE,CAAC,CAYpB"}
|
package/dist/converter.js
CHANGED
|
@@ -64,6 +64,7 @@ async function renderPageToPng(pdfData, pageNumber, options) {
|
|
|
64
64
|
const context = canvas.getContext("2d");
|
|
65
65
|
context.fillStyle = options.background;
|
|
66
66
|
context.fillRect(0, 0, viewport.width, viewport.height);
|
|
67
|
+
applyStemDarkening(context, options.stemDarkening);
|
|
67
68
|
// canvasContext only (canvas: null) — PDF.js uses the provided 2D context
|
|
68
69
|
// directly without trying to call canvas.getContext() internally.
|
|
69
70
|
await page.render({
|
|
@@ -108,8 +109,27 @@ function resolveOptions(options) {
|
|
|
108
109
|
return {
|
|
109
110
|
scale: options?.scale ?? DEFAULT_SCALE,
|
|
110
111
|
background: options?.background ?? DEFAULT_BACKGROUND,
|
|
112
|
+
stemDarkening: Math.max(0, options?.stemDarkening ?? 0),
|
|
111
113
|
};
|
|
112
114
|
}
|
|
115
|
+
function applyStemDarkening(context, width) {
|
|
116
|
+
if (width <= 0)
|
|
117
|
+
return;
|
|
118
|
+
const nativeFill = context.fill.bind(context);
|
|
119
|
+
context.fill = ((path) => {
|
|
120
|
+
nativeFill(path);
|
|
121
|
+
if (!path)
|
|
122
|
+
return;
|
|
123
|
+
const transform = context.getTransform();
|
|
124
|
+
const scale = Math.hypot(transform.a, transform.b) || 1;
|
|
125
|
+
const { strokeStyle, lineWidth } = context;
|
|
126
|
+
context.strokeStyle = context.fillStyle;
|
|
127
|
+
context.lineWidth = width / scale;
|
|
128
|
+
context.stroke(path);
|
|
129
|
+
context.strokeStyle = strokeStyle;
|
|
130
|
+
context.lineWidth = lineWidth;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
113
133
|
// Sets up font substitution before rendering. Must run before any rendering:
|
|
114
134
|
// @napi-rs/canvas caches font lookups per process, so fonts registered after
|
|
115
135
|
// their first use won't take effect.
|
package/dist/converter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converter.js","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGnG,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEnC,gFAAgF;AAChF,0EAA0E;AAC1E,MAAM,eAAe,GAAG;IACtB,sBAAsB;IACtB,UAAU;IACV,WAAW;IACX,WAAW;IACX,mBAAmB;IACnB,eAAe;IACf,qBAAqB;IACrB,aAAa;CACd,CAAC;AACF,MAAM,cAAc,GAAG;IACrB,eAAe;IACf,2BAA2B;IAC3B,UAAU;IACV,WAAW;IACX,QAAQ;IACR,WAAW;IACX,kBAAkB;IAClB,cAAc;IACd,oBAAoB;IACpB,aAAa;CACd,CAAC;
|
|
1
|
+
{"version":3,"file":"converter.js","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -30,6 +30,17 @@ export interface ConvertOptions {
|
|
|
30
30
|
* @default true
|
|
31
31
|
*/
|
|
32
32
|
systemFontFallback?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Thicken text by stroking each filled glyph outline with this width, in
|
|
35
|
+
* output pixels. Approximates the "stem darkening" font smoothing that
|
|
36
|
+
* browsers apply on macOS, where text looks heavier than a faithful outline
|
|
37
|
+
* fill. `0` disables it; try `0.5`–`1.0`.
|
|
38
|
+
*
|
|
39
|
+
* Applies to every filled path, but for solid fills the same-color outline is
|
|
40
|
+
* effectively invisible — the visible effect is on text.
|
|
41
|
+
* @default 0
|
|
42
|
+
*/
|
|
43
|
+
stemDarkening?: number;
|
|
33
44
|
}
|
|
34
45
|
export interface PngPage {
|
|
35
46
|
/** 1-indexed page number */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;;;;;OAUG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE/B;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;;;;;OAUG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE/B;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB"}
|