@xtctwins/tctwins-pdf-core 0.1.0 → 0.1.2
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/PdfViewer.d.ts +13 -3
- package/dist/PdfViewer.d.ts.map +1 -1
- package/dist/components/MobileConsole.vue.d.ts +13 -0
- package/dist/components/MobileConsole.vue.d.ts.map +1 -0
- package/dist/components/PdfViewer.d.ts +4 -4
- package/dist/components/PdfViewer.vue.d.ts +18 -8
- package/dist/components/PdfViewer.vue.d.ts.map +1 -1
- package/dist/components/useAnnotationCanvas.d.ts +9 -2
- package/dist/components/useAnnotationCanvas.d.ts.map +1 -1
- package/dist/components/useViewerLayout.d.ts +49 -26
- package/dist/components/useViewerLayout.d.ts.map +1 -1
- package/dist/components/useViewerManager.d.ts +2 -0
- package/dist/components/useViewerManager.d.ts.map +1 -1
- package/dist/core/ColorInverter.d.ts +70 -0
- package/dist/core/ColorInverter.d.ts.map +1 -0
- package/dist/core/PageCanvasRenderer.d.ts +190 -0
- package/dist/core/PageCanvasRenderer.d.ts.map +1 -0
- package/dist/core/TileRenderer.d.ts +0 -1
- package/dist/core/TileRenderer.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/pdf-core.js +968 -363
- package/dist/style.css +1 -1
- package/dist/types/components.d.ts +19 -0
- package/dist/types/components.d.ts.map +1 -1
- package/dist/vue/usePdfCore.d.ts +56 -2
- package/dist/vue/usePdfCore.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/style.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
.
|
|
1
|
+
.mobile-console[data-v-ef8b578a]{z-index:9999;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:#d4d4d4;-webkit-user-select:text;user-select:text;background:#1e1e1eeb;border-top:1px solid #ffffff1f;flex-direction:column;max-height:45%;font-family:SF Mono,Cascadia Code,Consolas,monospace;font-size:10px;line-height:1.4;display:flex;position:absolute;bottom:0;left:0;right:0}.mobile-console.collapsed[data-v-ef8b578a]{max-height:none}.mobile-console__header[data-v-ef8b578a]{cursor:pointer;-webkit-tap-highlight-color:transparent;background:#0006;flex-shrink:0;justify-content:space-between;align-items:center;padding:4px 10px;display:flex}.mobile-console__title[data-v-ef8b578a]{color:#e0e0e0;font-size:11px;font-weight:600}.mobile-console__count[data-v-ef8b578a]{text-align:center;background:#ffffff26;border-radius:8px;min-width:18px;margin-left:6px;padding:0 5px;font-size:9px;line-height:16px;display:inline-block}.mobile-console__actions[data-v-ef8b578a]{align-items:center;gap:4px;display:flex}.mobile-console__btn[data-v-ef8b578a]{color:#ccc;cursor:pointer;-webkit-tap-highlight-color:transparent;background:#ffffff14;border:none;border-radius:4px;padding:2px 6px;font-size:11px;line-height:1}.mobile-console__btn[data-v-ef8b578a]:active{background:#fff3}.mobile-console__toggle[data-v-ef8b578a]{color:#999;font-size:10px}.mobile-console__list[data-v-ef8b578a]{-webkit-overflow-scrolling:touch;flex:1;max-height:35vh;padding:2px 0;overflow-y:auto}.mobile-console__entry[data-v-ef8b578a]{word-break:break-all;border-bottom:1px solid #ffffff0a;gap:6px;padding:1px 10px;display:flex}.mobile-console__level[data-v-ef8b578a]{opacity:.6;flex-shrink:0;font-size:9px}.mobile-console__entry--warn .mobile-console__level[data-v-ef8b578a]{color:#eab308}.mobile-console__entry--warn .mobile-console__msg[data-v-ef8b578a]{color:#fde68a}.mobile-console__entry--error .mobile-console__level[data-v-ef8b578a]{color:#ef4444}.mobile-console__entry--error .mobile-console__msg[data-v-ef8b578a]{color:#fca5a5}.mobile-console__msg[data-v-ef8b578a]{color:#d4d4d4}.mobile-console__empty[data-v-ef8b578a]{color:#666;text-align:center;padding:8px 10px;font-style:italic}.pdf-core-viewer[data-v-dc25679e]{width:100%;height:100%;position:relative}.pdf-core-content[data-v-dc25679e]{transform-origin:0 0;position:absolute;top:0;left:0}.pdf-core-page-canvas[data-v-dc25679e]{background:#fff;display:block;position:absolute}.pdf-core-annotation-canvas[data-v-dc25679e]{z-index:1;pointer-events:none;position:absolute;inset:0}.pdf-core-overlay[data-v-dc25679e]{z-index:2;position:absolute;inset:0}
|
|
2
2
|
/*$vite$:1*/
|
|
@@ -11,6 +11,25 @@ export interface PdfViewerProps {
|
|
|
11
11
|
toolbar?: boolean;
|
|
12
12
|
/** 缩放速率:滚轮每格跳动几个 ZOOM_LEVELS 档位,默认 1 */
|
|
13
13
|
zoomSpeed?: number;
|
|
14
|
+
/**
|
|
15
|
+
* 深色主题下是否自动反色(默认 true)。
|
|
16
|
+
* CAD 导出的图纸是「白纸黑线」,深色主题只改底色会让内容看不见,故默认反色。
|
|
17
|
+
*/
|
|
18
|
+
invertDarkContent?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* 反色模式(默认 unblend):
|
|
21
|
+
* unblend —— 覆盖度反解:灰度翻明度、彩色保持原色原亮度,边缘自然过渡 → 无白边
|
|
22
|
+
* hue —— 保色相反色:整幅反明度(彩色明度会翻,黄/青/绿会变暗),零成本滤镜
|
|
23
|
+
* all —— 纯反色:彩色变互补色(红→青)
|
|
24
|
+
* achromatic —— 只反黑白像素、彩色完全原样(代价:彩色边缘有亮边)
|
|
25
|
+
*/
|
|
26
|
+
invertMode?: "unblend" | "hue" | "all" | "achromatic";
|
|
27
|
+
/** achromatic 模式的色度阈值(默认 24):色度 ≤ 该值的像素视为黑白 */
|
|
28
|
+
invertThreshold?: number;
|
|
29
|
+
/** 最大缩放倍率(默认 128x = 12800%):滚轮/捏合/按钮三种路径统一受它约束 */
|
|
30
|
+
maxZoom?: number;
|
|
31
|
+
/** 移动端调试控制台:显示 console 输出面板,默认 false */
|
|
32
|
+
showConsole?: boolean;
|
|
14
33
|
}
|
|
15
34
|
export interface PdfViewerEmits {
|
|
16
35
|
(e: "loaded", payload: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/types/components.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC9B,UAAU,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/types/components.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC9B,UAAU,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,YAAY,CAAC;IACtD,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC9B,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAClF"}
|
package/dist/vue/usePdfCore.d.ts
CHANGED
|
@@ -1,28 +1,82 @@
|
|
|
1
1
|
import { type Ref } from "vue";
|
|
2
2
|
import type { PDFDocumentProxy, PDFPageProxy } from "pdfjs-dist";
|
|
3
|
+
import { PageCanvasRenderer } from "../core/PageCanvasRenderer";
|
|
4
|
+
import { type InvertMode } from "../core/ColorInverter";
|
|
3
5
|
import { EventTrigger } from "../utils/EventTrigger";
|
|
4
6
|
import type { PdfCoreEventMap } from "../types/core";
|
|
7
|
+
export interface PdfCoreAttachTargets {
|
|
8
|
+
/** 可见位图 canvas(只有 1 张) */
|
|
9
|
+
canvas: HTMLCanvasElement | null;
|
|
10
|
+
/** 视口容器(overflow:hidden,绝对定位基准) */
|
|
11
|
+
stage: HTMLElement | null;
|
|
12
|
+
/** 内容空间容器:整页 CSS 尺寸,标注 overlay 挂它下面 */
|
|
13
|
+
wrap?: HTMLElement | null;
|
|
14
|
+
}
|
|
5
15
|
export interface UsePdfCoreOptions {
|
|
6
16
|
autoLoad?: boolean;
|
|
7
17
|
scale?: number;
|
|
8
|
-
/** CSS 颜色字符串,作为 PDF 页面渲染背景 */
|
|
9
18
|
backgroundColor?: string;
|
|
19
|
+
/** 内容反色(深色主题下 CAD 图纸「白纸黑线」反过来,否则看不见内容) */
|
|
20
|
+
invertColors?: boolean;
|
|
21
|
+
/** 反色模式:unblend = 覆盖度反解(默认,彩色保原色无白边);hue / all / achromatic 见 ColorInverter */
|
|
22
|
+
invertMode?: InvertMode;
|
|
23
|
+
/** achromatic 模式下的黑白判定阈值(色度,默认 24) */
|
|
24
|
+
invertThreshold?: number;
|
|
25
|
+
/** 单边 backing 上限,超过则只渲染可见 region(默认 8192) */
|
|
26
|
+
maxSide?: number;
|
|
27
|
+
/** 最大缩放倍率(默认 128x = 12800%);不同图纸类型给不同上限 */
|
|
28
|
+
maxZoom?: number;
|
|
29
|
+
/** 每帧新位图上屏后回调(同步标注画布 / 上报状态用) */
|
|
30
|
+
onPresented?: (info: {
|
|
31
|
+
zoom: number;
|
|
32
|
+
pageNum: number;
|
|
33
|
+
tiled: boolean;
|
|
34
|
+
}) => void;
|
|
10
35
|
}
|
|
11
36
|
export interface UsePdfCoreResult {
|
|
37
|
+
/** 视口容器引用(= attach 传入的 stage) */
|
|
12
38
|
containerRef: Ref<HTMLElement | null>;
|
|
39
|
+
/** 视口渲染器(attach 后可用) */
|
|
40
|
+
renderer: Ref<PageCanvasRenderer | null>;
|
|
13
41
|
doc: Ref<PDFDocumentProxy | null>;
|
|
14
42
|
page: Ref<PDFPageProxy | null>;
|
|
15
43
|
pageCount: Ref<number>;
|
|
16
44
|
currentPageNum: Ref<number>;
|
|
17
45
|
currentScale: Ref<number>;
|
|
46
|
+
backgroundColor: Ref<string>;
|
|
18
47
|
isLoading: Ref<boolean>;
|
|
19
48
|
error: Ref<string | null>;
|
|
20
|
-
/** PDF 核心事件触发器 */
|
|
21
49
|
events: EventTrigger<PdfCoreEventMap>;
|
|
50
|
+
/** 绑定 DOM(存在 canvas+stage 才能渲染):组件 onMounted 调 */
|
|
51
|
+
attach: (targets: PdfCoreAttachTargets) => PageCanvasRenderer | null;
|
|
52
|
+
/** 解绑并释放(组件 onBeforeUnmount 调) */
|
|
53
|
+
detach: () => void;
|
|
22
54
|
loadFile: (source: File | ArrayBuffer) => Promise<void>;
|
|
55
|
+
/** 重渲染当前帧 */
|
|
23
56
|
renderCurrentPage: () => Promise<void>;
|
|
57
|
+
/** 设定缩放(连续值,非档位):以视口中心为锚 */
|
|
24
58
|
setScale: (scale: number) => Promise<void>;
|
|
59
|
+
setBackgroundColor: (color: string) => Promise<void>;
|
|
60
|
+
/** 开关内容反色(深色主题跟随) */
|
|
61
|
+
setInvertColors: (on: boolean) => void;
|
|
62
|
+
/** 切换反色模式(all / achromatic,可顺带改阈值) */
|
|
63
|
+
setInvertMode: (mode: InvertMode, threshold?: number) => void;
|
|
64
|
+
/** 调整最大缩放倍率(运行时生效;当前倍率超出时会被夹回) */
|
|
65
|
+
setMaxZoom: (zoom: number) => void;
|
|
66
|
+
/** 当前是否反色 */
|
|
67
|
+
invertColors: Ref<boolean>;
|
|
68
|
+
/** 复位视图(回到内容中心,保持缩放) */
|
|
69
|
+
resetView: () => void;
|
|
25
70
|
reset: () => void;
|
|
26
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* PDF 核心 Composable
|
|
74
|
+
*
|
|
75
|
+
* 渲染/交互已从「瓦片虚拟化 + 两阶段 CSS 补偿」换成
|
|
76
|
+
* PageCanvasRenderer 的单画布模型(1 张可见 canvas + 离屏双缓冲 + 可见 region 分片):
|
|
77
|
+
* · 放大到 6400% 也只有 1 张可见 canvas,backing 恒为 ≈视口×DPR,不会越缩越卡;
|
|
78
|
+
* · 视图状态只有 center(pt) + zoom,锚点/平移全部一步反推,不再逐档漂移;
|
|
79
|
+
* · 每次渲染前 cancel 上一次未完成的渲染,滚轮连发不排队。
|
|
80
|
+
*/
|
|
27
81
|
export declare function usePdfCore(options?: UsePdfCoreOptions): UsePdfCoreResult;
|
|
28
82
|
//# sourceMappingURL=usePdfCore.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePdfCore.d.ts","sourceRoot":"","sources":["../../src/vue/usePdfCore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"usePdfCore.d.ts","sourceRoot":"","sources":["../../src/vue/usePdfCore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACpC,0BAA0B;IAC1B,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACjC,mCAAmC;IACnC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,uCAAuC;IACvC,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;CAChF;AAED,MAAM,WAAW,gBAAgB;IAChC,iCAAiC;IACjC,YAAY,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACtC,wBAAwB;IACxB,QAAQ,EAAE,GAAG,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,EAAE,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAClC,IAAI,EAAE,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC/B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;IACtC,kDAAkD;IAClD,MAAM,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,kBAAkB,GAAG,IAAI,CAAC;IACrE,kCAAkC;IAClC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,GAAG,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,aAAa;IACb,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,4BAA4B;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,qBAAqB;IACrB,eAAe,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,sCAAsC;IACtC,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,kCAAkC;IAClC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,aAAa;IACb,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,wBAAwB;IACxB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,IAAI,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CAqM5E"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xtctwins/tctwins-pdf-core",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.2",
|
|
5
5
|
"description": "Reusable PDF core with Vue 3 viewer, tile rendering, annotations (measure/rectangle), and composables",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"license": "MIT",
|