diff --git a/sundynix-desktop/app.go b/sundynix-desktop/app.go index e6910c6..e0be32c 100644 --- a/sundynix-desktop/app.go +++ b/sundynix-desktop/app.go @@ -8,6 +8,7 @@ import ( "os/exec" "path/filepath" goruntime "runtime" + "strings" "time" "github.com/wailsapp/wails/v3/pkg/application" @@ -61,6 +62,27 @@ func (a *App) OpenReport(url, filename string) error { return openInSystem(dst) } +// PrintReportPage 把报告打印视图 HTML 落到临时文件,交系统默认浏览器打开(在那里 ⌘P → +// 存储为 PDF)。Wails 的 WKWebView 会把 window.open 拦成 null,前端弹打印窗那条路在壳内 +// 走不通;转交系统浏览器后「前端打印出 PDF、CJK 零字体依赖」的原有优势不变。返回落盘路径。 +func (a *App) PrintReportPage(filename, html string) (string, error) { + if filename == "" { + filename = "report" + } + // 文件名进过滤:主题可能含 / 之类的路径字符。 + safe := strings.Map(func(r rune) rune { + if strings.ContainsRune(`/\:*?"<>|`, r) { + return '_' + } + return r + }, filename) + dst := filepath.Join(os.TempDir(), "sundynix-print-"+safe+".html") + if err := os.WriteFile(dst, []byte(html), 0o600); err != nil { + return "", err + } + return dst, openInSystem(dst) +} + // Notify 弹一条系统通知(best-effort:macOS 用 osascript,其它平台暂静默)。 func (a *App) Notify(title, body string) { if goruntime.GOOS == "darwin" { diff --git a/sundynix-desktop/frontend/bindings/github.com/sundynix/sundynix-desktop/app.ts b/sundynix-desktop/frontend/bindings/github.com/sundynix/sundynix-desktop/app.ts index 6f4d332..b7a2469 100644 --- a/sundynix-desktop/frontend/bindings/github.com/sundynix/sundynix-desktop/app.ts +++ b/sundynix-desktop/frontend/bindings/github.com/sundynix/sundynix-desktop/app.ts @@ -33,6 +33,15 @@ export function Ping(): $CancellablePromise { return $Call.ByID(1003072145); } +/** + * PrintReportPage 把报告打印视图 HTML 落到临时文件,交系统默认浏览器打开(在那里 ⌘P → + * 存储为 PDF)。Wails 的 WKWebView 会把 window.open 拦成 null,前端弹打印窗那条路在壳内 + * 走不通;转交系统浏览器后「前端打印出 PDF、CJK 零字体依赖」的原有优势不变。返回落盘路径。 + */ +export function PrintReportPage(filename: string, html: string): $CancellablePromise { + return $Call.ByID(3564528865, filename, html); +} + /** * ReadLocalFile 读取本地文件内容(本地文件系统 I/O)。 */ diff --git a/sundynix-desktop/frontend/src/lib/desktop.ts b/sundynix-desktop/frontend/src/lib/desktop.ts index 4ca860d..d66e4c7 100644 --- a/sundynix-desktop/frontend/src/lib/desktop.ts +++ b/sundynix-desktop/frontend/src/lib/desktop.ts @@ -41,26 +41,32 @@ export function notify(title: string, body: string): void { if (inWails()) void App.Notify(title, body); } -// printReportHtml:把已渲染的报告 HTML 在打印视图里出 PDF(浏览器/Webview 的"打印→存为 PDF")。 +// printReportHtml:把已渲染的报告 HTML 在打印视图里出 PDF("打印→存为 PDF")。 // 走前端打印是为了让中文(CJK)零字体依赖即可正确排版——后端 PDF 需内嵌 CJK 字体,较重。 -export function printReportHtml(title: string, bodyHtml: string): boolean { +// 桌面壳内 WKWebView 会把 window.open 拦成 null(实机验过),改走原生桥: +// HTML 落临时文件 → 系统默认浏览器打开 → 那里 ⌘P 出 PDF(自动唤起打印框)。 +export async function printReportHtml(title: string, bodyHtml: string): Promise { + const html = + `${title}` + + `${bodyHtml}` + + `