@@ -214,6 +214,149 @@ if err != nil {
214214fmt.Println (doc.Content )
215215```
216216
217+ ## 高级配置
218+
219+ ### 精确控制读取内容
220+
221+ DocReader 提供了强大的配置系统,允许你精确控制要读取的页面和行。
222+
223+ #### 基本配置示例
224+
225+ ``` go
226+ // 示例 1: 读取指定页码
227+ config := docreader.NewReadConfig ().
228+ WithPages (0 , 2 , 4 ) // 读取第 0、2、4 页
229+
230+ result , err := docreader.ReadDocumentWithConfig (" document.pdf" , config)
231+
232+ // 示例 2: 读取页码范围
233+ config := docreader.NewReadConfig ().
234+ WithPageRange (0 , 5 ) // 读取第 0-5 页
235+
236+ // 示例 3: 读取指定行
237+ config := docreader.NewReadConfig ().
238+ WithLines (0 , 5 , 10 ) // 每页只读取第 0、5、10 行
239+
240+ // 示例 4: 读取行范围
241+ config := docreader.NewReadConfig ().
242+ WithLineRange (5 , 15 ) // 每页只读取第 5-15 行
243+
244+ // 示例 5: 组合多个范围
245+ config := docreader.NewReadConfig ().
246+ WithPageRange (0 , 2 ).
247+ WithPageRange (5 , 7 ). // 读取第 0-2 页和第 5-7 页
248+ WithLineRange (0 , 10 ) // 每页读取第 0-10 行
249+ ```
250+
251+ #### 为不同页面设置不同的行配置
252+
253+ ``` go
254+ // 为特定页面配置不同的行
255+ config := docreader.NewReadConfig ().
256+ AddPageLines (0 , 1 , 3 , 5 ). // 第 0 页:读取第 1、3、5 行
257+ AddPageLineRange (1 , 0 , 10 ). // 第 1 页:读取第 0-10 行
258+ AddPageConfig (2 , []int {2 , 4 }, [][2 ]int {{6 , 8 }}) // 第 2 页:读取第 2、4 行和第 6-8 行
259+
260+ result , err := docreader.ReadDocumentWithConfig (" document.pdf" , config)
261+ ```
262+
263+ #### XLSX 工作表筛选
264+
265+ ``` go
266+ // 只读取指定的工作表
267+ config := docreader.NewReadConfig ().
268+ WithSheetNames (" Sheet1" , " Summary" )
269+
270+ result , err := docreader.ReadDocumentWithConfig (" spreadsheet.xlsx" , config)
271+ ```
272+
273+ #### 处理结构化结果
274+
275+ ``` go
276+ result , err := docreader.ReadDocumentWithConfig (" document.pdf" , config)
277+ if err != nil {
278+ log.Fatal (err)
279+ }
280+
281+ // 访问结构化数据
282+ fmt.Printf (" 总页数: %d \n " , result.TotalPages )
283+ fmt.Printf (" 总行数: %d \n " , result.TotalLines )
284+
285+ // 遍历每一页
286+ for _ , page := range result.Pages {
287+ fmt.Printf (" 页码: %d , 行数: %d \n " , page.PageNumber , page.TotalLines )
288+ for i , line := range page.Lines {
289+ fmt.Printf (" 行 %d : %s \n " , i, line)
290+ }
291+ }
292+
293+ // 获取完整内容
294+ fmt.Println (result.Content )
295+ ```
296+
297+ ### 文本清理
298+
299+ DocReader 提供了智能的文本清理功能,可以优化提取的文本内容,特别适合用于大模型处理。
300+
301+ #### 使用预设清理配置
302+
303+ ``` go
304+ // 使用默认清理(推荐)
305+ doc , err := docreader.ReadDocumentWithClean (" document.pdf" )
306+ // 效果:移除行首尾空格、压缩多余空格、移除控制字符、最多保留1个连续空行
307+
308+ // 最小清理(保留格式)
309+ doc , err := docreader.ReadDocument (" document.txt" )
310+ doc.CleanContentMinimal ()
311+ // 效果:仅移除行首尾空格、压缩多余空格、移除控制字符,保留所有空行
312+
313+ // 激进清理(最大压缩)
314+ doc , err := docreader.ReadDocument (" document.docx" )
315+ doc.CleanContentAggressive ()
316+ // 效果:移除所有空行,压缩空格,移除控制字符
317+ ```
318+
319+ #### 自定义清理配置
320+
321+ ``` go
322+ // 创建自定义清理器
323+ cleaner := &docreader.TextCleaner {
324+ TrimSpaces : true , // 移除行首行尾空格
325+ RemoveExtraSpaces : true , // 压缩连续空格为一个
326+ RemoveControlChars : true , // 移除控制字符
327+ MaxBlankLines : 2 , // 最多保留 2 个连续空行(-1=不限制,0=移除所有)
328+ }
329+
330+ // 在读取时应用清理
331+ doc , err := docreader.ReadDocumentWithCleanConfig (" document.pdf" , cleaner)
332+
333+ // 或者对已读取的文档应用清理
334+ doc , err := docreader.ReadDocument (" document.txt" )
335+ doc.CleanContentWith (cleaner)
336+ ```
337+
338+ #### TextCleaner 配置说明
339+
340+ ``` go
341+ type TextCleaner struct {
342+ // TrimSpaces: 是否移除行首行尾空格
343+ TrimSpaces bool
344+
345+ // RemoveExtraSpaces: 是否将连续空格压缩为一个
346+ RemoveExtraSpaces bool
347+
348+ // RemoveControlChars: 是否移除特殊控制字符(保留换行符和制表符)
349+ RemoveControlChars bool
350+
351+ // MaxBlankLines: 最大连续空行数
352+ // -1: 不限制,保留所有空行
353+ // 0: 移除所有空行
354+ // 1: 最多保留 1 个连续空行(压缩多余空行)
355+ // N: 最多保留 N 个连续空行
356+ MaxBlankLines int
357+ }
358+ ```
359+
217360## API 文档
218361
219362### 核心接口
@@ -222,13 +365,93 @@ fmt.Println(doc.Content)
222365
223366自动识别文件格式并读取内容,返回包含内容和元数据的 Document 对象。
224367
368+ #### ` ReadDocumentWithClean(filePath string) (*Document, error) `
369+
370+ 读取文档并自动应用默认文本清理。
371+
372+ #### ` ReadDocumentWithCleanConfig(filePath string, cleaner *TextCleaner) (*Document, error) `
373+
374+ 读取文档并应用自定义文本清理配置。
375+
376+ #### ` ReadDocumentWithConfig(filePath string, config *ReadConfig) (*DocumentResult, error) `
377+
378+ 根据配置精确读取文档,返回结构化的结果。
379+
380+ #### ` NewReadConfig() *ReadConfig `
381+
382+ 创建一个新的读取配置对象,支持链式调用。
383+
225384#### ` DocumentReader ` 接口
226385
227386所有读取器都实现此接口:
228387
229388- ` ReadText(filePath string) (string, error) ` - 读取文本内容
230389- ` GetMetadata(filePath string) (map[string]string, error) ` - 获取元数据
231390
391+ #### ` ConfigurableReader ` 接口
392+
393+ 支持高级配置的读取器接口(所有读取器都实现):
394+
395+ - ` ReadWithConfig(filePath string, config *ReadConfig) (*DocumentResult, error) ` - 根据配置读取文档
396+
397+ ### 配置结构
398+
399+ #### ReadConfig 配置方法
400+
401+ ``` go
402+ // 页面选择
403+ config.WithPages (pages ...int ) // 设置要读取的离散页码
404+ config.WithPageRange (start, end int ) // 添加页码范围
405+
406+ // 全局行选择(应用到所有页)
407+ config.WithLines (lines ...int ) // 设置要读取的离散行号
408+ config.WithLineRange (start, end int ) // 添加行号范围
409+
410+ // 页面级行配置(覆盖全局配置)
411+ config.AddPageLines (pageIndex int , lines ...int ) // 为指定页添加离散行
412+ config.AddPageLineRange (pageIndex, start, end int ) // 为指定页添加行范围
413+ config.AddPageConfig (pageIndex int , lineIndexes []int , lineRanges [][2 ]int ) // 为指定页添加完整配置
414+
415+ // XLSX 特有
416+ config.WithSheetNames (names ...string ) // 设置要读取的工作表名称
417+ ```
418+
419+ #### 核心数据结构
420+
421+ ``` go
422+ // Selector 统一的选择器,用于选择页码或行号
423+ type Selector struct {
424+ Indexes []int // 离散索引:[0, 2, 5]
425+ Ranges [][2 ]int // 连续范围:[[0,2], [5,10]]
426+ }
427+
428+ // ReadConfig 读取配置
429+ type ReadConfig struct {
430+ PageSelector Selector // 页面选择器
431+ LineSelector Selector // 全局行选择器
432+ PageConfigs []PageConfig // 页面级配置(优先级高于全局)
433+ SheetNames []string // XLSX 工作表名称
434+ }
435+
436+ // DocumentResult 结构化的文档读取结果
437+ type DocumentResult struct {
438+ FilePath string
439+ Pages []PageContent // 结构化页面内容
440+ TotalPages int
441+ TotalLines int
442+ Metadata map [string ]string
443+ Content string // 完整文本内容
444+ }
445+
446+ // PageContent 单页内容
447+ type PageContent struct {
448+ PageNumber int
449+ PageName string // 工作表名称(XLSX)
450+ Lines []string
451+ TotalLines int
452+ }
453+ ```
454+
232455### 专用读取器
233456
234457#### DocxReader
0 commit comments