Documentation
¶
Overview ¶
Package converter 提供 OFD 文档到 PDF、HTML、文本、Markdown 和图像等格式的转换能力。
Index ¶
- Variables
- func Convert(from, to string, input any, output io.Writer, opts ...Option) error
- func Encode(format string, input any, output io.Writer, opts ...Option) error
- func EncodeDocuments(format string, documents []*render.Document, output io.Writer, opts ...Option) error
- func HTML(input any, output io.Writer, opts ...Option) error
- func HTMLDocuments(documents []*render.Document, output io.Writer, opts ...Option) error
- func Image(input interface{}, opts ...Option) error
- func ImageDocument(doc *render.Document, opts ...Option) error
- func ImageDocuments(documents []*render.Document, opts ...Option) error
- func ImportFormats() []string
- func IsImageFormat(format string) bool
- func Markdown(input any, output io.Writer, opts ...Option) error
- func MarkdownDocument(doc *parser.Document, output io.Writer, opts ...Option) error
- func MarkdownDocuments(documents []*parser.Document, output io.Writer, opts ...Option) error
- func PDF(input any, output io.Writer, opts ...Option) error
- func PDFDocuments(documents []*render.Document, output io.Writer, opts ...Option) error
- func Register(enc Encoder)
- func RegisterImporter(imp Importer)
- func RegisterTransformer(transformer Transformer)
- func Text(input any, output io.Writer, opts ...Option) error
- func TextDocument(doc *parser.Document, output io.Writer, opts ...Option) error
- func TextDocuments(documents []*parser.Document, output io.Writer, opts ...Option) error
- type Converter
- func (c *Converter) AllowRemoteResources() bool
- func (c *Converter) ChromePath() string
- func (c *Converter) MarkdownTables() bool
- func (c *Converter) NoSandbox() bool
- func (c *Converter) OfficeTimeout() time.Duration
- func (c *Converter) Paper() Paper
- func (c *Converter) PrintBackground() bool
- func (c *Converter) SofficePath() string
- func (c *Converter) TempDir() string
- type Encoder
- type Format
- type Importer
- type Kind
- type Option
- func BgColor(bg color.Color) Option
- func DPI(dpi float64) Option
- func EPS() Option
- func HTMLJPG() Option
- func HTMLPNG() Option
- func HTMLSVG() Option
- func ImageWriter(f func(page int, img image.Image) error) Option
- func JPG() Option
- func PDFParallel(enabled bool) Option
- func PNG() Option
- func Page(page int) Option
- func PageCache(capacity int, maxBytes int64) Option
- func RasterBackend(name string) Option
- func SVG() Option
- func TeX() Option
- func Thumbnail(s int) Option
- func WithAllowRemoteResources(enabled bool) Option
- func WithChrome(path string) Option
- func WithChromeNoSandbox(enabled bool) Option
- func WithFormat(format string) Option
- func WithLandscape(landscape bool) Option
- func WithMarkdownTables(enabled bool) Option
- func WithOfficeTimeout(timeout time.Duration) Option
- func WithPaperDimensions(width, height float64) Option
- func WithPaperSize(name string) Option
- func WithPrintBackground(enabled bool) Option
- func WithSoffice(path string) Option
- func WithTempDir(dir string) Option
- func Writer(f func(page int) (io.WriteCloser, error)) Option
- type Paper
- type Transformer
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ErrInvalidPage = errors.New("页码无效")
ErrInvalidPage 表示请求的全局页码无效。
var NamedPaperSizes = map[string][2]float64{
"A4": {210, 297},
"A3": {297, 420},
"A5": {148, 210},
"Letter": {215.9, 279.4},
"Legal": {215.9, 355.6},
"B5": {176, 250},
"16开": {185, 260},
"16K": {185, 260},
}
NamedPaperSizes 是支持的命名纸张尺寸(毫米)。
Functions ¶
func Convert ¶ added in v0.1.2
Convert 在输入格式 from 与输出格式 to 之间转换。from 为空时按文件扩展名或 内容识别。to 为 "ofd" 时使用导入器(X→OFD);from 为 "ofd" 时使用导出器 (OFD→X);两者都不是时先导入为 OFD 再导出。
Example ¶
package main
import (
"bytes"
"fmt"
"github.com/zc310/ofd/pkg/converter"
_ "github.com/zc310/ofd/pkg/converter/mdimport"
_ "github.com/zc310/ofd/pkg/converter/pdfimport"
)
func main() {
var output bytes.Buffer
err := converter.Convert("ofd", "pdf", "../../test/testdata/helloworld.ofd", &output)
fmt.Println(err == nil && bytes.HasPrefix(output.Bytes(), []byte("%PDF-")))
}
Output: true
Example (MarkdownToOFD) ¶
package main
import (
"bytes"
"fmt"
"github.com/zc310/ofd/pkg/converter"
_ "github.com/zc310/ofd/pkg/converter/mdimport"
_ "github.com/zc310/ofd/pkg/converter/pdfimport"
)
func main() {
var output bytes.Buffer
err := converter.Convert("md", "ofd", "../../test/testdata/markdown/sample.md", &output)
fmt.Println(err == nil && bytes.HasPrefix(output.Bytes(), []byte("PK")))
}
Output: true
Example (PdfToOFD) ¶
package main
import (
"bytes"
"fmt"
"github.com/zc310/ofd/pkg/converter"
_ "github.com/zc310/ofd/pkg/converter/mdimport"
_ "github.com/zc310/ofd/pkg/converter/pdfimport"
)
func main() {
var output bytes.Buffer
err := converter.Convert("pdf", "ofd", "../../test/testdata/pdf/sample0.pdf", &output)
fmt.Println(err == nil && bytes.HasPrefix(output.Bytes(), []byte("PK")))
}
Output: true
func Encode ¶ added in v0.1.2
Encode 解析 input 中的 OFD 文档,并按 format 选择注册的编码器写入 output。 format 可以是注册名("pdf"、"text"、"markdown"、"jpeg")、别名("txt"、"md"、 "jpg")或带点/不带点的文件扩展名(".png"、"svg")。
func EncodeDocuments ¶ added in v0.1.2
func EncodeDocuments(format string, documents []*render.Document, output io.Writer, opts ...Option) error
EncodeDocuments 按 format 选择注册的编码器,直接写入已解析的文档。 当 output 为 nil 时,逐页图像格式使用 Option 中通过 Writer 或 ImageWriter 提供的写入器。
func HTML ¶ added in v0.1.1
HTML 将 input 中的 OFD 文档转换为单个 HTML 文件。 默认每页使用内嵌 PNG 图片,也可以通过 HTMLJPG 或 HTMLSVG 选择 JPG 或 SVG。
Example ¶
package main
import (
"bytes"
"fmt"
"github.com/zc310/ofd/pkg/converter"
_ "github.com/zc310/ofd/pkg/converter/mdimport"
_ "github.com/zc310/ofd/pkg/converter/pdfimport"
)
func main() {
var output bytes.Buffer
err := converter.HTML("../../test/testdata/helloworld.ofd", &output, converter.Page(1), converter.DPI(72))
fmt.Println(err == nil && bytes.Contains(output.Bytes(), []byte("data:image/png;base64,")))
}
Output: true
func HTMLDocuments ¶ added in v0.1.1
HTMLDocuments 将多个已解析的 OFD 文档体按全局页码写入单个 HTML 文件。
func Image ¶
Image 渲染 OFD 文档。输出格式由 PNG、JPG、SVG、EPS、TeX 或 WithFormat 选项决定, 默认 PNG;输出目标由 Writer 或 ImageWriter 选项提供。
func ImageDocument ¶ added in v0.0.6
ImageDocument 将已解析的 OFD 文档渲染为图像或矢量格式。
func ImageDocuments ¶ added in v0.0.6
ImageDocuments 将多个已解析的 OFD 文档体按全局页码渲染为图像或矢量格式。
func ImportFormats ¶ added in v0.1.2
func ImportFormats() []string
ImportFormats 返回所有已注册输入格式的名称快照,按名称排序。
func IsImageFormat ¶ added in v0.1.2
IsImageFormat 判断给定格式名、别名或扩展名是否逐页输出图像。
func Markdown ¶ added in v0.1.1
Markdown 提取 input 中 OFD 文档的文字并写入 Markdown 文档。 “第 X 章”识别为二级标题,其他标题按字号和编号层级输出。
Example ¶
package main
import (
"bytes"
"fmt"
"github.com/zc310/ofd/pkg/converter"
_ "github.com/zc310/ofd/pkg/converter/mdimport"
_ "github.com/zc310/ofd/pkg/converter/pdfimport"
)
func main() {
var output bytes.Buffer
err := converter.Markdown("../../test/testdata/helloworld.ofd", &output, converter.Page(1))
// 标题使用 OFD 文档的 DocInfo.Title,没有标题时回退为 “OFD 文档”。
fmt.Println(err == nil && bytes.Contains(output.Bytes(), []byte("# Hello World")))
}
Output: true
func MarkdownDocument ¶ added in v0.1.1
MarkdownDocument 提取已解析 OFD 文档中的文字并写入 Markdown 文档。
func MarkdownDocuments ¶ added in v0.1.1
MarkdownDocuments 按全局页码提取多个已解析 OFD 文档体中的文字并写入 Markdown 文档。
func PDF ¶
PDF 解析 input 中的 OFD 文档并按全局页码写入一个 PDF。
Example ¶
package main
import (
"fmt"
"os"
"github.com/zc310/ofd/pkg/converter"
_ "github.com/zc310/ofd/pkg/converter/mdimport"
_ "github.com/zc310/ofd/pkg/converter/pdfimport"
)
func main() {
output, err := os.CreateTemp("", "ofd-example-*.pdf")
if err == nil {
defer os.Remove(output.Name())
err = converter.PDF("../../test/testdata/intro.ofd", output)
if closeErr := output.Close(); err == nil {
err = closeErr
}
}
fmt.Println(err == nil)
}
Output: true
func PDFDocuments ¶ added in v0.0.6
PDFDocuments 将多个已解析的 OFD 文档体按全局页码写入同一个 PDF。
func RegisterImporter ¶ added in v0.1.2
func RegisterImporter(imp Importer)
RegisterImporter 注册一个导入器。通常在 init() 中调用。
func RegisterTransformer ¶ added in v0.1.2
func RegisterTransformer(transformer Transformer)
RegisterTransformer 注册一个直接转换器。通常在 init() 中调用。
func Text ¶ added in v0.0.6
Text 提取 input 中 OFD 文档的文字并写入 output。 不会保留字体、颜色和布局信息;不同文字对象按行输出,不同页面使用分页符分隔。
func TextDocument ¶ added in v0.0.6
TextDocument 提取已解析 OFD 文档中的文字并写入 output。
Types ¶
type Converter ¶
type Converter struct {
// contains filtered or unexported fields
}
Converter 配置转换器
func (*Converter) AllowRemoteResources ¶ added in v0.1.2
AllowRemoteResources 返回是否允许加载外部资源。
func (*Converter) ChromePath ¶ added in v0.1.2
ChromePath 返回配置的 Chrome/Chromium 可执行文件路径;为空表示自动查找。
func (*Converter) MarkdownTables ¶ added in v0.1.3
MarkdownTables 返回 OFD 转 Markdown 时是否识别并输出表格,默认关闭。
func (*Converter) OfficeTimeout ¶ added in v0.1.2
OfficeTimeout 返回 Office 文档转换超时时间;为 0 表示使用默认值。
func (*Converter) PrintBackground ¶ added in v0.1.2
PrintBackground 返回是否打印背景。
func (*Converter) SofficePath ¶ added in v0.1.2
SofficePath 返回配置的 LibreOffice 可执行文件路径;为空表示自动查找。
type Encoder ¶ added in v0.1.2
type Encoder interface {
// Name 返回格式名称,如 "pdf"、"png"、"html"。
Name() string
// Kind 返回格式类别,调用方据此区分文档输出和逐页图像输出。
Kind() Kind
// Extensions 返回支持的文件扩展名,如 [".pdf"]、[".png", ".jpg"]。
Extensions() []string
// MIME 返回 MIME 类型,如 "application/pdf"。
MIME() string
// Encode 把 input 写入 output。input 可以是原始 OFD 输入(路径、[]byte、
// io.Reader),也可以是已解析的 []*render.Document。
// 需要解析 OFD 的编码器应通过 encodeOFD 复用统一的解析逻辑。
Encode(input any, output io.Writer, conv *Converter) error
}
Encoder 是所有输出格式编码器必须实现的接口。 各格式文件在 init() 中调用 Register 注册。
type Format ¶ added in v0.1.2
type Format struct {
Name string
Kind Kind
Extensions []string
MIME string
// contains filtered or unexported fields
}
Format 是已注册格式的元信息。
func FormatByExtension ¶ added in v0.1.2
FormatByExtension 根据文件扩展名查找格式,如 ".pdf" → Format。
func FormatByName ¶ added in v0.1.2
FormatByName 根据格式名(或别名)查找格式。
type Importer ¶ added in v0.1.2
type Importer interface {
// Name 返回输入格式名,如 "pdf"、"docx"、"pptx"。
Name() string
// Extensions 返回支持的文件扩展名,如 [".pdf"]。
Extensions() []string
// MIME 返回 MIME 类型,如 "application/pdf"。
MIME() string
// Import 把 input 读取为 OFD 并写入 output。
Import(input any, output io.Writer, conv *Converter) error
}
Importer 是非 OFD 输入(如 PDF、DOCX、PPTX)到 OFD 的导入器。 各输入格式包在 init() 中调用 RegisterImporter 注册,并按需空白导入, 使不使用的导入依赖不进最终二进制。
func ImporterByExtension ¶ added in v0.1.2
ImporterByExtension 按文件扩展名查找导入器。
func ImporterByName ¶ added in v0.1.2
ImporterByName 按输入格式名(含别名或扩展名)查找导入器。
type Option ¶
type Option func(*Converter)
Option 配置选项类型
func EPS ¶ added in v0.0.6
func EPS() Option
EPS 设置为 Encapsulated PostScript 格式
Example ¶
package main
import (
"bytes"
"fmt"
"io"
"github.com/zc310/ofd/pkg/converter"
_ "github.com/zc310/ofd/pkg/converter/mdimport"
_ "github.com/zc310/ofd/pkg/converter/pdfimport"
)
type exampleBufferWriteCloser struct {
*bytes.Buffer
}
func (exampleBufferWriteCloser) Close() error { return nil }
func main() {
var output bytes.Buffer
err := converter.Image("../../test/testdata/helloworld.ofd",
converter.Writer(func(int) (io.WriteCloser, error) {
return exampleBufferWriteCloser{Buffer: &output}, nil
}),
converter.EPS(),
converter.Page(1),
)
fmt.Println(err == nil && bytes.Contains(output.Bytes(), []byte("%!PS-Adobe-3.0 EPSF-3.0")))
}
Output: true
func HTMLJPG ¶ added in v0.1.1
func HTMLJPG() Option
HTMLJPG 设置 HTML 页面使用内嵌 JPG 图片。
Example ¶
package main
import (
"bytes"
"fmt"
"github.com/zc310/ofd/pkg/converter"
_ "github.com/zc310/ofd/pkg/converter/mdimport"
_ "github.com/zc310/ofd/pkg/converter/pdfimport"
)
func main() {
var output bytes.Buffer
err := converter.HTML("../../test/testdata/helloworld.ofd", &output, converter.HTMLJPG(), converter.Page(1))
fmt.Println(err == nil && bytes.Contains(output.Bytes(), []byte("data:image/jpeg;base64,")))
}
Output: true
func HTMLSVG ¶ added in v0.1.1
func HTMLSVG() Option
HTMLSVG 设置 HTML 页面使用内嵌 SVG 内容。
Example ¶
package main
import (
"bytes"
"fmt"
"github.com/zc310/ofd/pkg/converter"
_ "github.com/zc310/ofd/pkg/converter/mdimport"
_ "github.com/zc310/ofd/pkg/converter/pdfimport"
)
func main() {
var output bytes.Buffer
err := converter.HTML("../../test/testdata/helloworld.ofd", &output, converter.HTMLSVG(), converter.Page(1))
fmt.Println(err == nil && bytes.Contains(output.Bytes(), []byte("<svg")))
}
Output: true
func ImageWriter ¶
ImageWriter 设置图像写入器
func JPG ¶
func JPG() Option
JPG 设置为JPEG格式
Example ¶
package main
import (
"fmt"
"image/color"
"io"
"os"
"path/filepath"
"github.com/zc310/ofd/pkg/converter"
_ "github.com/zc310/ofd/pkg/converter/mdimport"
_ "github.com/zc310/ofd/pkg/converter/pdfimport"
)
func main() {
dir, err := os.MkdirTemp("", "ofd-example-")
if err == nil {
defer os.RemoveAll(dir)
err = converter.Image("../../test/testdata/intro.ofd",
converter.Writer(func(page int) (io.WriteCloser, error) {
return os.Create(filepath.Join(dir, fmt.Sprintf("intro_%d.jpg", page)))
}),
converter.BgColor(color.White),
converter.JPG(),
converter.Page(40),
converter.DPI(300),
)
}
fmt.Println(err == nil)
}
Output: true
func PDFParallel ¶ added in v0.1.1
PDFParallel 控制 PDF 页面是否并行渲染;默认关闭。
func PNG ¶
func PNG() Option
PNG 设置为PNG格式
Example ¶
package main
import (
"fmt"
"image/color"
"io"
"os"
"path/filepath"
"github.com/zc310/ofd/pkg/converter"
_ "github.com/zc310/ofd/pkg/converter/mdimport"
_ "github.com/zc310/ofd/pkg/converter/pdfimport"
)
func main() {
dir, err := os.MkdirTemp("", "ofd-example-")
if err == nil {
defer os.RemoveAll(dir)
err = converter.Image("../../test/testdata/ano.ofd",
converter.Writer(func(page int) (io.WriteCloser, error) {
return os.Create(filepath.Join(dir, fmt.Sprintf("ano_%d.png", page)))
}),
converter.BgColor(color.White),
converter.PNG(),
)
}
fmt.Println(err == nil)
}
Output: true
func RasterBackend ¶ added in v0.1.3
RasterBackend 指定 PNG/JPG 输出使用的栅格后端名(如 "canvas"、"gg"、 "ftgg"、"tinyskia")。仅对 PNG/JPEG 生效;空字符串表示使用 canvas 矢量 表面光栅化(默认)。使用 canvas 之外的后端需在程序中空白导入对应插件包, 例如 import _ "github.com/zc310/ofd/internal/render/backends/gg"。
func SVG ¶ added in v0.0.6
func SVG() Option
SVG 设置为 SVG 格式
Example ¶
package main
import (
"bytes"
"fmt"
"io"
"github.com/zc310/ofd/pkg/converter"
_ "github.com/zc310/ofd/pkg/converter/mdimport"
_ "github.com/zc310/ofd/pkg/converter/pdfimport"
)
type exampleBufferWriteCloser struct {
*bytes.Buffer
}
func (exampleBufferWriteCloser) Close() error { return nil }
func main() {
var output bytes.Buffer
err := converter.Image("../../test/testdata/helloworld.ofd",
converter.Writer(func(int) (io.WriteCloser, error) {
return exampleBufferWriteCloser{Buffer: &output}, nil
}),
converter.SVG(),
converter.Page(1),
)
fmt.Println(err == nil && bytes.Contains(output.Bytes(), []byte("<svg")))
}
Output: true
func TeX ¶ added in v0.0.6
func TeX() Option
TeX 设置为 TeX/PGF 格式
Example ¶
package main
import (
"bytes"
"fmt"
"io"
"github.com/zc310/ofd/pkg/converter"
_ "github.com/zc310/ofd/pkg/converter/mdimport"
_ "github.com/zc310/ofd/pkg/converter/pdfimport"
)
type exampleBufferWriteCloser struct {
*bytes.Buffer
}
func (exampleBufferWriteCloser) Close() error { return nil }
func main() {
var output bytes.Buffer
err := converter.Image("../../test/testdata/helloworld.ofd",
converter.Writer(func(int) (io.WriteCloser, error) {
return exampleBufferWriteCloser{Buffer: &output}, nil
}),
converter.TeX(),
converter.Page(1),
)
fmt.Println(err == nil && bytes.Contains(output.Bytes(), []byte("\\begin{pgfpicture}")))
}
Output: true
func WithAllowRemoteResources ¶ added in v0.1.2
WithAllowRemoteResources 设置是否允许加载外部资源(默认禁止,仅允许本地与 data: 资源)。仅在 HTML/MHTML 转 PDF 时生效。
func WithChrome ¶ added in v0.1.2
WithChrome 设置 Chrome/Chromium 可执行文件路径,供 HTML/MHTML 导入使用; 为空时按 OFD_CHROME、PATH 和常见安装路径自动查找。
func WithChromeNoSandbox ¶ added in v0.1.2
WithChromeNoSandbox 设置是否禁用 Chrome 沙箱。容器或 root 环境下可能需要, 但会降低安全性,默认关闭。
func WithFormat ¶ added in v0.1.2
WithFormat 按注册的格式名(或别名)设置输出格式。
func WithLandscape ¶ added in v0.1.2
WithLandscape 设置横向打印。
func WithMarkdownTables ¶ added in v0.1.3
WithMarkdownTables 设置 OFD 转 Markdown 时是否识别并输出表格,默认关闭。 表格识别基于文字位置(X 对齐与空白间隔),对无边框表格有效,但双栏正文、 公式排版等也可能被误判,因此默认关闭,按需开启。
func WithOfficeTimeout ¶ added in v0.1.2
WithOfficeTimeout 设置 Office 文档转换超时时间;0 表示使用默认值。
func WithPaperDimensions ¶ added in v0.1.2
WithPaperDimensions 以毫米设置自定义纸张尺寸。
func WithPaperSize ¶ added in v0.1.2
WithPaperSize 按名称设置输出纸张尺寸,支持 A4、A3、A5、Letter、Legal、B5、16开。
func WithPrintBackground ¶ added in v0.1.2
WithPrintBackground 设置是否打印背景颜色和图片(默认开启)。
func WithSoffice ¶ added in v0.1.2
WithSoffice 设置 LibreOffice 可执行文件路径,供 Office 文档导入使用; 为空时按 OFD_SOFFICE、PATH 和常见安装路径自动查找。
func WithTempDir ¶ added in v0.1.2
WithTempDir 设置外部工具(LibreOffice/Chrome)转换使用的临时文件根目录; 为空表示使用系统临时目录。目录不存在时会按需创建子目录。
type Paper ¶ added in v0.1.2
type Paper struct {
// Width 是纸张宽度(毫米)。
Width float64
// Height 是纸张高度(毫米)。
Height float64
// Landscape 为真时交换宽高。
Landscape bool
}
Paper 描述输出纸张尺寸(毫米)与方向。
func PaperByName ¶ added in v0.1.2
PaperByName 按名称(大小写不敏感,支持 A4/A3/A5/Letter/Legal/B5/16开)返回纸张。
func (Paper) EffectiveDimensions ¶ added in v0.1.2
EffectiveDimensions 返回考虑方向后的实际宽高(毫米)。
type Transformer ¶ added in v0.1.2
type Transformer interface {
// From 返回支持的输入格式名,如 "docx"、"doc"。
From() []string
// To 返回输出格式名,如 "pdf"。
To() string
// Transform 把 input 直接转换为 output。
Transform(input any, output io.Writer, conv *Converter) error
}
Transformer 是某类输入到某个输出格式的直接转换器,用于避免"先导入 OFD 再导出"的中间损失(例如 docx→pdf 直接由 LibreOffice 完成)。各格式包在 init() 中调用 RegisterTransformer 注册。
func TransformerFor ¶ added in v0.1.2
func TransformerFor(from, to string) (Transformer, bool)
TransformerFor 查找 from→to 的直接转换器。
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
Package htmlimport 为 converter 注册 HTML/MHTML 导入器,以及到 PDF 的直接 转换器。
|
Package htmlimport 为 converter 注册 HTML/MHTML 导入器,以及到 PDF 的直接 转换器。 |
|
Package mdimport 为 converter 注册 Markdown→OFD 导入器(输入格式 "markdown")。
|
Package mdimport 为 converter 注册 Markdown→OFD 导入器(输入格式 "markdown")。 |
|
Package officeimport 为 converter 注册 Office 文档(doc/docx/odt/rtf/wps/ pptx/xlsx 等)的导入器,以及到 PDF 的直接转换器。
|
Package officeimport 为 converter 注册 Office 文档(doc/docx/odt/rtf/wps/ pptx/xlsx 等)的导入器,以及到 PDF 的直接转换器。 |
|
Package pdfimport 为 converter 注册 PDF→OFD 导入器(输入格式 "pdf")。
|
Package pdfimport 为 converter 注册 PDF→OFD 导入器(输入格式 "pdf")。 |