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

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
}