mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-29 08:46:55 +08:00
1 parent
5e0da3da28
commit
ee6c9f6a16
82 files changed
+4316
-4310
No files matched your search
+59
-59
@@ -87,30 +87,6 @@ func (r *Renderer) RenderTo(page *PageContent, writer io.Writer, format string)
|
||||
return render(page, writer)
|
||||
}
|
||||
|
||||
// outputRenderer 获取格式扩展名和渲染方法
|
||||
// 入参: format 输出格式
|
||||
// 返回: string 扩展名, func 渲染方法, error 错误信息
|
||||
func (r *Renderer) outputRenderer(format string) (string, func(*PageContent, io.Writer) error, error) {
|
||||
switch strings.ToLower(strings.TrimSpace(format)) {
|
||||
case "svg":
|
||||
return "svg", r.RenderToSVG, nil
|
||||
case "pdf":
|
||||
return "pdf", r.RenderToPDF, nil
|
||||
case "txt":
|
||||
return "txt", r.RenderToText, nil
|
||||
case "eps":
|
||||
return "eps", r.RenderToEPS, nil
|
||||
case "png":
|
||||
return "png", r.RenderToPNG, nil
|
||||
case "jpg", "jpeg":
|
||||
return "jpg", func(page *PageContent, writer io.Writer) error {
|
||||
return r.RenderToJPEG(page, writer, &jpeg.Options{Quality: 95})
|
||||
}, nil
|
||||
default:
|
||||
return "", nil, fmt.Errorf("unsupported output format %s", format)
|
||||
}
|
||||
}
|
||||
|
||||
// RenderToZIP 逐页渲染并写入ZIP,文件编号按总页数补零,出错时调用方应丢弃输出
|
||||
// 入参: writer 输出流, format svg、pdf、eps、png、jpg、jpeg或txt, indices 零基页面索引,省略则全部,按原页序去重
|
||||
// 返回: error 错误信息
|
||||
@@ -203,16 +179,6 @@ func (r *Renderer) RenderToMultiPageText(writer io.Writer, indices ...int) error
|
||||
return nil
|
||||
}
|
||||
|
||||
// exportProgress 回报导出进度并传递调用方的停止原因
|
||||
// 入参: completed 已处理页数, total 总页数
|
||||
// 返回: error 停止原因
|
||||
func (r *Renderer) exportProgress(completed, total int) error {
|
||||
if r.OnExportProgress != nil {
|
||||
return r.OnExportProgress(completed, total)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// RenderToImage 渲染为光栅图
|
||||
// 入参: page 页面内容
|
||||
// 返回: image.Image 图像对象, error 错误信息
|
||||
@@ -257,31 +223,6 @@ func (r *Renderer) RenderToJPEG(page *PageContent, writer io.Writer, options *jp
|
||||
return jpeg.Encode(&imageMetadataWriter{writer: writer, skip: 2, data: segment}, fillWhiteBackground(img), options)
|
||||
}
|
||||
|
||||
// fillWhiteBackground 填充白色背景,复用当前导出图片的RGBA像素
|
||||
// 入参: img 图片对象
|
||||
// 返回: image.Image 图片对象
|
||||
func fillWhiteBackground(img image.Image) image.Image {
|
||||
bounds := img.Bounds()
|
||||
if rgba, ok := img.(*image.RGBA); ok {
|
||||
for y := 0; y < bounds.Dy(); y++ {
|
||||
row := rgba.Pix[y*rgba.Stride : y*rgba.Stride+bounds.Dx()*4]
|
||||
for i := 0; i < len(row); i += 4 {
|
||||
if alpha := 255 - row[i+3]; alpha != 0 {
|
||||
row[i] += alpha
|
||||
row[i+1] += alpha
|
||||
row[i+2] += alpha
|
||||
row[i+3] = 255
|
||||
}
|
||||
}
|
||||
}
|
||||
return rgba
|
||||
}
|
||||
dst := image.NewRGBA(bounds)
|
||||
draw.Draw(dst, bounds, image.White, image.Point{}, draw.Src)
|
||||
draw.Draw(dst, bounds, img, bounds.Min, draw.Over)
|
||||
return dst
|
||||
}
|
||||
|
||||
// RenderToSVG 渲染为SVG
|
||||
// 入参: page 页面内容, writer 输出流
|
||||
// 返回: error 错误信息
|
||||
@@ -363,6 +304,65 @@ func (r *Renderer) RenderPagesToPDF(contents []*PageContent, writer io.Writer) e
|
||||
return r.renderPDFPages(pages, writer, r.OnExportProgress)
|
||||
}
|
||||
|
||||
// outputRenderer 获取格式扩展名和渲染方法
|
||||
// 入参: format 输出格式
|
||||
// 返回: string 扩展名, func 渲染方法, error 错误信息
|
||||
func (r *Renderer) outputRenderer(format string) (string, func(*PageContent, io.Writer) error, error) {
|
||||
switch strings.ToLower(strings.TrimSpace(format)) {
|
||||
case "svg":
|
||||
return "svg", r.RenderToSVG, nil
|
||||
case "pdf":
|
||||
return "pdf", r.RenderToPDF, nil
|
||||
case "txt":
|
||||
return "txt", r.RenderToText, nil
|
||||
case "eps":
|
||||
return "eps", r.RenderToEPS, nil
|
||||
case "png":
|
||||
return "png", r.RenderToPNG, nil
|
||||
case "jpg", "jpeg":
|
||||
return "jpg", func(page *PageContent, writer io.Writer) error {
|
||||
return r.RenderToJPEG(page, writer, &jpeg.Options{Quality: 95})
|
||||
}, nil
|
||||
default:
|
||||
return "", nil, fmt.Errorf("unsupported output format %s", format)
|
||||
}
|
||||
}
|
||||
|
||||
// exportProgress 回报导出进度并传递调用方的停止原因
|
||||
// 入参: completed 已处理页数, total 总页数
|
||||
// 返回: error 停止原因
|
||||
func (r *Renderer) exportProgress(completed, total int) error {
|
||||
if r.OnExportProgress != nil {
|
||||
return r.OnExportProgress(completed, total)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// fillWhiteBackground 填充白色背景,复用当前导出图片的RGBA像素
|
||||
// 入参: img 图片对象
|
||||
// 返回: image.Image 图片对象
|
||||
func fillWhiteBackground(img image.Image) image.Image {
|
||||
bounds := img.Bounds()
|
||||
if rgba, ok := img.(*image.RGBA); ok {
|
||||
for y := 0; y < bounds.Dy(); y++ {
|
||||
row := rgba.Pix[y*rgba.Stride : y*rgba.Stride+bounds.Dx()*4]
|
||||
for i := 0; i < len(row); i += 4 {
|
||||
if alpha := 255 - row[i+3]; alpha != 0 {
|
||||
row[i] += alpha
|
||||
row[i+1] += alpha
|
||||
row[i+2] += alpha
|
||||
row[i+3] = 255
|
||||
}
|
||||
}
|
||||
}
|
||||
return rgba
|
||||
}
|
||||
dst := image.NewRGBA(bounds)
|
||||
draw.Draw(dst, bounds, image.White, image.Point{}, draw.Src)
|
||||
draw.Draw(dst, bounds, img, bounds.Min, draw.Over)
|
||||
return dst
|
||||
}
|
||||
|
||||
// renderPDFPages 将已解析页面交给指定PDF后端
|
||||
// 入参: pages 页面列表, writer 输出流, progress 页面处理进度
|
||||
// 返回: error 错误信息
|
||||
|
||||
Reference in new issue
Block a user