Skip to content

Commit fa54d1e

Browse files
committed
fix export pdf issue
1 parent b4ce826 commit fa54d1e

2 files changed

Lines changed: 30 additions & 15 deletions

File tree

backend/routers/export.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,23 @@ def get(self, *_):
123123
@router.post("/pdf")
124124
def export_pdf(payload: ExportPayload):
125125
"""Export Markdown to PDF via WeasyPrint and return the output file path."""
126+
from backend.renderer import render_markdown
126127
from markdown_reader.plugins.pdf_exporter import export_markdown_to_pdf
127128

129+
html = render_markdown(
130+
payload.content,
131+
base_dir=payload.base_dir,
132+
dark_mode=payload.dark_mode,
133+
font_family=payload.font_family,
134+
font_size=payload.font_size,
135+
)
136+
128137
out_path = _make_output_path(payload.output_path, ".pdf")
129138
parent = os.path.dirname(out_path)
130139
if parent:
131140
os.makedirs(parent, exist_ok=True)
132141
try:
133-
export_markdown_to_pdf(payload.content, out_path, base_dir=payload.base_dir)
142+
export_markdown_to_pdf(html, out_path, base_url=payload.base_dir)
134143
except Exception as exc:
135144
raise HTTPException(status_code=500, detail=str(exc))
136145
return {"path": out_path}

frontend/src/app/page.tsx

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -91,24 +91,30 @@ export default function HomePage() {
9191

9292
const handleExport = async (format: "html" | "pdf" | "docx") => {
9393
try {
94-
// For HTML, prompt user to choose save location
9594
let outputPath: string | undefined;
96-
if (format === "html") {
97-
try {
98-
const { save } = await import("@tauri-apps/plugin-dialog");
99-
const selected = await save({
100-
defaultPath: `${editor.activeTab.label.replace(/\.[^/.]+$/, "") || "document"}.html`,
101-
filters: [{ name: "HTML files", extensions: ["html"] }],
102-
});
103-
if (!selected) return; // User cancelled
104-
outputPath = Array.isArray(selected) ? selected[0] : selected;
105-
} catch {
106-
// In browser mode, fallback to download (no save dialog)
107-
alert("HTML export requires Tauri desktop app for save dialog. Use download instead.");
95+
try {
96+
const { save } = await import("@tauri-apps/plugin-dialog");
97+
const extension = format === "pdf" ? "pdf" : format === "docx" ? "docx" : "html";
98+
const defaultName = `${editor.activeTab.label.replace(/\.[^/.]+$/, "") || "document"}.${extension}`;
99+
const filters = [
100+
{ name: "HTML files", extensions: ["html"] },
101+
{ name: "PDF files", extensions: ["pdf"] },
102+
{ name: "Word files", extensions: ["docx"] },
103+
];
104+
const selected = await save({
105+
defaultPath: defaultName,
106+
filters: [{ name: `${extension.toUpperCase()} files`, extensions: [extension] }],
107+
});
108+
if (!selected) return;
109+
outputPath = Array.isArray(selected) ? selected[0] : selected;
110+
} catch {
111+
if (format === "html") {
112+
alert("HTML export requires Tauri desktop app for save dialog. Use the browser download path instead.");
108113
return;
109114
}
115+
alert("PDF/DOCX export requires Tauri desktop app for save dialog.");
116+
return;
110117
}
111-
// For PDF/DOCX, export directly (backend handles temp file for now)
112118
const result = await editor.exportAs(format, outputPath);
113119
if (result) {
114120
alert(`Exported to:\n${result.path}`);

0 commit comments

Comments
 (0)