feat(导出文档): 支持取消导出

This commit is contained in:
xiaoqidun committed 2026-09-14 14:28:18 +08:00
1 parent c7ab15baa5
commit b55e8468ab
7 files changed
+125 -38

No files matched your search

+23 -10
View File
@@ -90,8 +90,8 @@ func (r *Renderer) RenderToZIP(writer io.Writer, format string, indices ...int)
method = zip.Store
}
width := len(strconv.Itoa(count))
if r.OnExportProgress != nil {
r.OnExportProgress(0, len(indices))
if err := r.exportProgress(0, len(indices)); err != nil {
return err
}
for i, index := range indices {
page, err := r.Reader.PageContentByIndex(index)
@@ -108,13 +108,23 @@ func (r *Renderer) RenderToZIP(writer io.Writer, format string, indices ...int)
if err := render(page, entry); err != nil {
return fmt.Errorf("failed to export page %d: %w", index+1, err)
}
if r.OnExportProgress != nil {
r.OnExportProgress(i+1, len(indices))
if err := r.exportProgress(i+1, len(indices)); err != nil {
return err
}
}
return archive.Close()
}
// exportProgress 回报导出进度并传递调用方的停止原因
// 入参: completed 已处理页数, total 总页数
// 返回: error 停止原因
func (r *Renderer) exportProgress(completed, total int) error {
if r.OnExportProgress != nil {
return r.OnExportProgress(completed, total)
}
return nil
}
// rasterRenderer 保留页面物理尺寸的光栅渲染器
type rasterRenderer struct {
*rasterizer.Rasterizer
@@ -288,8 +298,8 @@ func (r *Renderer) RenderToMultiPagePDF(writer io.Writer, indices ...int) error
if err != nil {
return err
}
if r.OnExportProgress != nil {
r.OnExportProgress(0, len(indices))
if err := r.exportProgress(0, len(indices)); err != nil {
return err
}
pages := make([]pdfPage, len(indices))
for i, index := range indices {
@@ -313,8 +323,8 @@ func (r *Renderer) RenderPagesToPDF(contents []*PageContent, writer io.Writer) e
if len(contents) == 0 {
return fmt.Errorf("no pages found")
}
if r.OnExportProgress != nil {
r.OnExportProgress(0, len(contents))
if err := r.exportProgress(0, len(contents)); err != nil {
return err
}
pages := make([]pdfPage, len(contents))
for i, page := range contents {
@@ -330,7 +340,7 @@ func (r *Renderer) RenderPagesToPDF(contents []*PageContent, writer io.Writer) e
// renderPDFPages 渲染页面并复用调用方的字节缓冲
// 入参: pages 页面列表, writer 输出流, progress 页面处理进度
// 返回: error 错误信息
func (r *Renderer) renderPDFPages(pages []pdfPage, writer io.Writer, progress func(int, int)) error {
func (r *Renderer) renderPDFPages(pages []pdfPage, writer io.Writer, progress func(int, int) error) error {
navigation := newPDFNavigation(r, r.Reader.doc, pages)
buf, direct := writer.(*bytes.Buffer)
if !direct {
@@ -354,7 +364,10 @@ func (r *Renderer) renderPDFPages(pages []pdfPage, writer io.Writer, progress fu
return fmt.Errorf("failed to render page %d: %w", i+1, err)
}
if progress != nil {
progress(i+1, len(pages))
if err := progress(i+1, len(pages)); err != nil {
buf.Truncate(start)
return err
}
}
}
if err := p.Close(); err != nil {