@chialab/pdfjs-lib 1.0.0-alpha.19 → 1.0.0-alpha.20

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/dist/index.d.ts CHANGED
@@ -3,10 +3,12 @@ import './lib/PDFPageProxy';
3
3
  export type { DocumentInitParameters } from './pdf.js/src/display/api';
4
4
  export type { BaseCanvasFactory } from './pdf.js/src/display/canvas_factory';
5
5
  export * from './lib/utils';
6
+ export { type SvgRoot, type SvgElement, type SvgImage, type SvgMarkedContent, type SvgPath, type SvgNode, isSvgElement, isSvgImage, isSvgMarkedContent, isSvgPath, isSvgRoot, } from './lib/Svg';
6
7
  export * from './lib/Canvas';
7
8
  export * from './lib/WasmFactory';
8
9
  export * from './lib/StandardFontDataFactory';
9
10
  export * from './lib/AnnotationData';
11
+ export * from './lib/CanvasGraphics';
10
12
  export * from './lib/SvgCanvasContext';
11
13
  export * from './lib/TextLayer';
12
14
  export * from './pdf.js/src/pdf.js';
@@ -1,4 +1,4 @@
1
- import type { SvgRoot } from './SvgCanvasContext';
1
+ import type { SvgRoot } from './Svg';
2
2
  export type Rect = [number, number, number, number];
3
3
  export type Color = [number, number, number];
4
4
  export type Dir = 'ltr' | 'rtl';
@@ -0,0 +1 @@
1
+ export {};
@@ -51,7 +51,7 @@ export type PathCommand = MoveToCommand | LineToCommand | ArcCommand | BezierCur
51
51
  export declare function parseCommands(svgPath: string): PathCommand[];
52
52
  export declare function commandToSvgPath(command: PathCommand): string;
53
53
  export declare function transformPath(commands: PathCommand[], transform: DOMMatrix): PathCommand[];
54
- export declare function calculateBoundingBox(commands: PathCommand[]): {
54
+ export declare function getBBox(commands: PathCommand[]): {
55
55
  x: number;
56
56
  y: number;
57
57
  width: number;
@@ -0,0 +1,143 @@
1
+ type BoundingBox = {
2
+ x: number;
3
+ y: number;
4
+ width: number;
5
+ height: number;
6
+ };
7
+ export interface SvgNode<Attrs = Record<string, unknown>> {
8
+ tag: string;
9
+ attrs: Attrs & {
10
+ transform?: string;
11
+ };
12
+ }
13
+ export interface SvgElement<Attrs = Record<string, unknown>> extends SvgNode<Attrs> {
14
+ children: (SvgNode | string)[];
15
+ }
16
+ export interface SvgGraphic extends SvgNode<{
17
+ x?: number;
18
+ y?: number;
19
+ width?: number;
20
+ height?: number;
21
+ x1?: number;
22
+ y1?: number;
23
+ x2?: number;
24
+ y2?: number;
25
+ points?: string;
26
+ cx?: number;
27
+ cy?: number;
28
+ r?: number;
29
+ rx?: number;
30
+ ry?: number;
31
+ }> {
32
+ }
33
+ export interface SvgPath extends SvgNode<{
34
+ d: string;
35
+ fill?: string;
36
+ stroke?: string;
37
+ 'stroke-width'?: string | number;
38
+ }> {
39
+ tag: 'path';
40
+ }
41
+ export interface SvgImage extends SvgNode<{
42
+ href: string;
43
+ width: number;
44
+ height: number;
45
+ }> {
46
+ tag: 'image';
47
+ }
48
+ export interface SvgMarkedContent extends SvgNode<{
49
+ href: string;
50
+ type: string;
51
+ x: number;
52
+ y: number;
53
+ width: number;
54
+ height: number;
55
+ }> {
56
+ tag: 'use';
57
+ }
58
+ export interface SvgRoot extends SvgElement<{
59
+ id?: string;
60
+ width: number;
61
+ height: number;
62
+ }> {
63
+ tag: 'svg';
64
+ }
65
+ export declare function isSvgElement(node: SvgNode): node is SvgElement;
66
+ export declare function isSvgPath(node: SvgNode): node is SvgPath;
67
+ export declare function isSvgImage(node: SvgNode): node is SvgImage;
68
+ export declare function isSvgMarkedContent(node: SvgNode): node is SvgMarkedContent;
69
+ export declare function isSvgRoot(node: SvgNode): node is SvgRoot;
70
+ export declare enum PrefixType {
71
+ Root = "svg",
72
+ Clip = "clip",
73
+ Pattern = "pattern",
74
+ MarkedContent = "marked_content"
75
+ }
76
+ export declare function id(type: PrefixType, id?: string | null, scope?: string): string;
77
+ /**
78
+ * Traverse the SVG tree to find a node matching the given criteria.
79
+ * @param root The root element to start the search from.
80
+ * @param matcher A function that returns true for the desired node.
81
+ * @returns The first matching node, or null if none is found.
82
+ */
83
+ export declare function findSvgNode(root: SvgElement, matcher: (node: SvgNode) => boolean): SvgNode | null;
84
+ /**
85
+ * Parse a transform string into a transformation matrix.
86
+ * @param input The transform string.
87
+ * @returns A transformation matrix.
88
+ */
89
+ export declare function parseTransform(input: string): DOMMatrix;
90
+ export declare function matrixToTransform(matrix: DOMMatrix): string;
91
+ /**
92
+ * Parse a font string into its components.
93
+ * @param fontString The font string.
94
+ * @returns An object containing the font components.
95
+ */
96
+ export declare function parseFontStyle(fontString: string): {
97
+ fontStyle: string;
98
+ fontVariant: string;
99
+ fontWeight: string;
100
+ fontSize: string;
101
+ lineHeight: string;
102
+ fontFamilies: string[];
103
+ };
104
+ /**
105
+ * Convert textAlign to text-anchor.
106
+ * @param textAlign The textAlign value.
107
+ * @returns The corresponding text-anchor value.
108
+ */
109
+ export declare function getTextAnchor(textAlign: string): 'start' | 'end' | 'middle';
110
+ /**
111
+ * Convert textBaseline to dominant-baseline.
112
+ * @param textBaseline The textBaseline value.
113
+ * @returns The corresponding dominant-baseline value.
114
+ */
115
+ export declare function getDominantBaseline(textBaseline: string): 'alphabetic' | 'hanging' | 'text-before-edge' | 'text-after-edge' | 'central';
116
+ /**
117
+ * Normalize a vector.
118
+ * @param vector The input vector.
119
+ * @returns The normalized vector.
120
+ */
121
+ export declare function normalizeVector(vector: [number, number]): [number, number];
122
+ /**
123
+ * Get the angle of a vector in radians.
124
+ * @param vector The input vector.
125
+ * @returns The angle in radians.
126
+ */
127
+ export declare function getAngle(vector: [number, number]): number;
128
+ /**
129
+ * Get the bounding box of a SVG node.
130
+ * @param node The SVG node.
131
+ * @param defs The SVG definitions (for resolving references).
132
+ * @param inheritedMatrix The inherited transformation matrix.
133
+ * @returns The bounding box of the SVG node.
134
+ */
135
+ export declare function getBBox(node: SvgNode, defs?: SvgNode[], inheritedMatrix?: DOMMatrix): BoundingBox | null;
136
+ /**
137
+ * Make a HTML string from a Svg node.
138
+ * @param node The node to render.
139
+ * @param attrs The attributes to add to the node.
140
+ * @returns A HTML string representation of the node.
141
+ */
142
+ export declare function renderSvgNode(node: SvgNode | string): string;
143
+ export {};
@@ -1,4 +1,5 @@
1
1
  import { Path2D } from './Path2D';
2
+ import { type SvgElement, type SvgNode, type SvgRoot } from './Svg';
2
3
  interface CanvasStyle {
3
4
  strokeStyle: string | SvgLinearGradient | SvgPattern;
4
5
  fillStyle: string | SvgLinearGradient | SvgRadialGradient | SvgPattern;
@@ -54,22 +55,6 @@ declare class SvgRadialGradient {
54
55
  constructor(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number);
55
56
  addColorStop(offset: number, color: string): void;
56
57
  }
57
- export interface SvgNode {
58
- tag: string;
59
- attrs: Record<string, string | undefined>;
60
- }
61
- export interface SvgElement extends SvgNode {
62
- children: SvgNode[];
63
- }
64
- export interface SvgRoot extends SvgElement {
65
- tag: 'svg';
66
- }
67
- export interface SvgText extends SvgNode {
68
- tag: 'text';
69
- text: string;
70
- }
71
- export declare function isSvgElement(node: SvgNode): node is SvgElement;
72
- export declare function isSvgText(node: SvgNode): node is SvgText;
73
58
  export declare class SvgCanvasContext {
74
59
  private _width;
75
60
  private _height;
@@ -78,13 +63,16 @@ export declare class SvgCanvasContext {
78
63
  private _currentStyle;
79
64
  private _styleStack;
80
65
  private _groupStack;
66
+ private _markedStack;
81
67
  private _transformMatrixStack;
82
68
  private _root;
83
69
  private _defs;
84
70
  private _currentGroup;
85
71
  private _currentElement;
72
+ private _currentMarked;
86
73
  private _transformMatrix;
87
74
  private _currentPosition;
75
+ private _parents;
88
76
  get canvas(): HTMLCanvasElement;
89
77
  get fillStyle(): string;
90
78
  set fillStyle(value: string);
@@ -116,8 +104,8 @@ export declare class SvgCanvasContext {
116
104
  getNode(): SvgRoot;
117
105
  resize(width: number, height: number): void;
118
106
  save(): void;
119
- clearRect(x: number, y: number, width: number, height: number): void;
120
107
  restore(): void;
108
+ clearRect(x: number, y: number, width: number, height: number): void;
121
109
  beginPath(): void;
122
110
  closePath(): void;
123
111
  moveTo(x: number, y: number): void;
@@ -146,8 +134,12 @@ export declare class SvgCanvasContext {
146
134
  resetTransform(): void;
147
135
  getTransform(): DOMMatrix;
148
136
  setTransform(a: number, b: number, c: number, d: number, e: number, f: number): void;
149
- protected _isTransformationGroup(node: SvgNode): boolean;
137
+ beginMarkedContent(type: string, props?: number | {
138
+ id: number;
139
+ } | null): void;
140
+ endMarkedContent(): void;
150
141
  protected _ensureTransformationGroup(): SvgElement;
142
+ protected _addNode(node: SvgNode, parent?: SvgElement): void;
151
143
  protected _applyStyleState(styleState: CanvasStyle): void;
152
144
  protected _getStyleState(): CanvasStyle;
153
145
  protected _getTransformScale(): {
@@ -169,4 +161,5 @@ export declare class SvgCanvasContext {
169
161
  }
170
162
  export declare function createSvgContext(width: number, height: number): Promise<CanvasRenderingContext2D>;
171
163
  export declare function toSvgNode(ctx: CanvasRenderingContext2D): Promise<SvgRoot>;
164
+ export declare function toSvgString(ctx: CanvasRenderingContext2D): Promise<string>;
172
165
  export {};
@@ -2,6 +2,7 @@ import type { PDFPageProxy } from '../pdf.js/src/display/api';
2
2
  import type { BaseCanvasFactory } from '../pdf.js/src/display/canvas_factory';
3
3
  import type { PageViewport } from '../pdf.js/src/display/display_utils';
4
4
  import { type AnnotationData } from './AnnotationData';
5
+ import { type SvgRoot } from './Svg';
5
6
  export interface TextLayerNode {
6
7
  id?: string;
7
8
  role: string;
@@ -30,16 +31,22 @@ export interface TextLayerText extends TextLayerNode {
30
31
  scale: number;
31
32
  angle: number;
32
33
  }
33
- export interface TextLayerImage extends TextLayerNode {
34
- role: 'img';
35
- src: string;
34
+ export interface TextLayerFigure extends TextLayerNode {
35
+ role: 'figure';
36
+ href: string;
37
+ x: number;
38
+ y: number;
39
+ width: number;
40
+ height: number;
41
+ alt?: string;
36
42
  }
37
43
  export declare function isTextNode(node: TextLayerNode): node is TextLayerText;
38
44
  export declare function isAnchorNode(node: TextLayerNode): node is TextLayerAnchor;
39
- export declare function isImageNode(node: TextLayerNode): node is TextLayerImage;
40
- export declare function createTextLayer(page: PDFPageProxy, { canvasFactory, viewport, outputScale, annotations, }: {
45
+ export declare function isFigureNode(node: TextLayerNode): node is TextLayerFigure;
46
+ export declare function createTextLayer(page: PDFPageProxy, { canvasFactory, viewport, outputScale, annotations, graphics, }: {
41
47
  canvasFactory: BaseCanvasFactory;
42
48
  viewport?: PageViewport;
43
49
  outputScale?: number;
44
50
  annotations?: AnnotationData[];
51
+ graphics?: SvgRoot;
45
52
  }): Promise<TextLayerRoot>;
@@ -31,3 +31,9 @@ export declare function makeSerializable<T>(object: T): T;
31
31
  export declare function colorToRgb(color: string): [number, number, number];
32
32
  export declare function rgbToHex(rgb: [number, number, number]): string;
33
33
  export declare function rgbToHex(r: number, g: number, b: number): string;
34
+ export declare function parseRgbaColor(color: string): {
35
+ r: number;
36
+ g: number;
37
+ b: number;
38
+ a: number;
39
+ };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  NodeCanvasFactory
3
- } from "./chunk-QCIN557M.js";
3
+ } from "./chunk-3XZOTLLE.js";
4
4
  import "./chunk-XMKSLA4K.js";
5
5
  import "./chunk-7MW5RQZ5.js";
6
6
  export {
@@ -1094,6 +1094,20 @@ function rgbToHex(r, g, b) {
1094
1094
  }
1095
1095
  return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
1096
1096
  }
1097
+ function parseRgbaColor(color) {
1098
+ const match = color.match(
1099
+ /^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/
1100
+ );
1101
+ if (!match) {
1102
+ return { r: 0, g: 0, b: 0, a: 1 };
1103
+ }
1104
+ return {
1105
+ r: Number.parseInt(match[1], 10),
1106
+ g: Number.parseInt(match[2], 10),
1107
+ b: Number.parseInt(match[3], 10),
1108
+ a: match[4] ? Number.parseFloat(match[4]) : 1
1109
+ };
1110
+ }
1097
1111
 
1098
1112
  // src/lib/NodeFilterFactory.ts
1099
1113
  var filtersRegistry = /* @__PURE__ */ new Map();
@@ -1419,6 +1433,7 @@ export {
1419
1433
  makeSerializable,
1420
1434
  colorToRgb,
1421
1435
  rgbToHex,
1436
+ parseRgbaColor,
1422
1437
  NodeFilterFactory,
1423
1438
  NodeCanvasFactory
1424
1439
  };