mirror of https://gitee.com/godoos/godoos.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.7 KiB
72 lines
1.7 KiB
package office
|
|
|
|
import (
|
|
"archive/zip"
|
|
"bufio"
|
|
"encoding/xml"
|
|
"errors"
|
|
"os"
|
|
)
|
|
|
|
func getMetaData(data *Document, ext string) (bool, error) {
|
|
file, err := os.Open(data.path)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
defer file.Close()
|
|
switch ext {
|
|
case ".docx", ".xlsx", ".pptx":
|
|
meta, err := GetContent(file)
|
|
if err != nil {
|
|
return true, errors.New("failed to get office meta data")
|
|
}
|
|
data.Title = meta.Title
|
|
data.Subject = meta.Subject
|
|
data.Creator = meta.Creator
|
|
data.Keywords = meta.Keywords
|
|
data.Description = meta.Description
|
|
data.Lastmodifiedby = meta.LastModifiedBy
|
|
data.Revision = meta.Revision
|
|
data.Category = meta.Category
|
|
default:
|
|
return true, nil
|
|
}
|
|
|
|
return true, nil
|
|
}
|
|
|
|
func GetContent(document *os.File) (fields XMLContent, err error) {
|
|
// Attempt to read the document file directly as a zip file.
|
|
z, err := zip.OpenReader(document.Name())
|
|
if err != nil {
|
|
return fields, errors.New("failed to open the file as zip")
|
|
}
|
|
defer z.Close()
|
|
|
|
var xmlFile string
|
|
for _, file := range z.File {
|
|
if file.Name == "docProps/core.xml" {
|
|
rc, err := file.Open()
|
|
if err != nil {
|
|
return fields, errors.New("failed to open docProps/core.xml")
|
|
}
|
|
defer rc.Close()
|
|
|
|
scanner := bufio.NewScanner(rc)
|
|
for scanner.Scan() {
|
|
xmlFile += scanner.Text()
|
|
}
|
|
if err := scanner.Err(); err != nil {
|
|
return fields, errors.New("failed to read from docProps/core.xml")
|
|
}
|
|
break // Exit loop after finding and reading core.xml
|
|
}
|
|
}
|
|
|
|
// Unmarshal the collected XML content into the XMLContent struct
|
|
if err := xml.Unmarshal([]byte(xmlFile), &fields); err != nil {
|
|
return fields, errors.New("failed to Unmarshal")
|
|
}
|
|
|
|
return fields, nil
|
|
}
|
|
|