2025-04-22 14:40:16 +00:00
|
|
|
package documenttext
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"fmt"
|
|
|
|
|
"io"
|
2025-04-25 17:02:50 +00:00
|
|
|
"log/slog"
|
2025-04-22 14:40:16 +00:00
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
documenttypes "queryorchestration/internal/document/types"
|
|
|
|
|
)
|
|
|
|
|
|
2025-05-28 12:36:47 +00:00
|
|
|
func (s *Service) GetDocumentText(ctx context.Context, doc documenttypes.File) (io.Reader, error) {
|
2025-04-22 14:40:16 +00:00
|
|
|
pagesNum, err := doc.GetPageCount(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-25 17:02:50 +00:00
|
|
|
group := s.cfg.GetThreadPool().NewGroup()
|
|
|
|
|
|
2025-04-22 14:40:16 +00:00
|
|
|
textPages := make([]string, pagesNum)
|
|
|
|
|
for i := range pagesNum {
|
2025-04-25 17:02:50 +00:00
|
|
|
index := i
|
|
|
|
|
group.SubmitErr(func() error {
|
|
|
|
|
slog.Debug("extracting page text", "index", index)
|
|
|
|
|
|
|
|
|
|
text, err := s.getPageText(ctx, doc, index)
|
|
|
|
|
if err != nil {
|
|
|
|
|
slog.Error("error extracting page text", "index", index, "error", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
textPages[index] = text
|
|
|
|
|
|
2025-06-02 10:44:45 +00:00
|
|
|
slog.Info("extracted page text", "index", index)
|
|
|
|
|
|
2025-04-25 17:02:50 +00:00
|
|
|
return nil
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = group.Wait()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
2025-04-22 14:40:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
text, err := s.mergeDocument(textPages)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return text, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *Service) mergeDocument(pages []string) (io.Reader, error) {
|
|
|
|
|
var builder strings.Builder
|
|
|
|
|
for i, page := range pages {
|
|
|
|
|
builder.WriteString(fmt.Sprintf("Start of Page No. = %d\n\n", i+1))
|
|
|
|
|
builder.WriteString(page)
|
|
|
|
|
builder.WriteString("\n\n")
|
|
|
|
|
}
|
|
|
|
|
return strings.NewReader(builder.String()), nil
|
|
|
|
|
}
|