pptx: add support for MS PowerPoint files (#71)

This commit is contained in:
superxin
2020-06-24 08:32:35 +08:00
committed by GitHub
parent f04c8759ea
commit dd4e7b5a2c
4 changed files with 96 additions and 0 deletions
Binary file not shown.
+67
View File
@@ -0,0 +1,67 @@
package docconv
import (
"archive/zip"
"bytes"
"fmt"
"io"
"io/ioutil"
"os"
"strings"
)
// ConvertPptx converts an MS PowerPoint pptx file to text.
func ConvertPptx(r io.Reader) (string, map[string]string, error) {
var size int64
// Common case: if the reader is a file (or trivial wrapper), avoid
// loading it all into memory.
var ra io.ReaderAt
if f, ok := r.(interface {
io.ReaderAt
Stat() (os.FileInfo, error)
}); ok {
si, err := f.Stat()
if err != nil {
return "", nil, err
}
size = si.Size()
ra = f
} else {
b, err := ioutil.ReadAll(r)
if err != nil {
return "", nil, nil
}
size = int64(len(b))
ra = bytes.NewReader(b)
}
zr, err := zip.NewReader(ra, size)
if err != nil {
return "", nil, fmt.Errorf("could not unzip: %v", err)
}
zipFiles := mapZipFiles(zr.File)
contentTypeDefinition, err := getContentTypeDefinition(zipFiles["[Content_Types].xml"])
if err != nil {
return "", nil, err
}
meta := make(map[string]string)
var textBody string
for _, override := range contentTypeDefinition.Overrides {
f := zipFiles[override.PartName]
switch override.ContentType {
case "application/vnd.openxmlformats-officedocument.presentationml.slide+xml",
"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml":
body, err := parseDocxText(f)
if err != nil {
return "", nil, fmt.Errorf("could not parse pptx: %v", err)
}
textBody += body + "\n"
}
}
return strings.TrimSuffix(textBody, "\n"), meta, nil
}
+29
View File
@@ -0,0 +1,29 @@
package docx_test
import (
"os"
"strings"
"testing"
"code.sajari.com/docconv"
)
func TestConvertPptx(t *testing.T) {
f, err := os.Open("./testdata/sample.pptx")
defer f.Close()
if err != nil {
t.Fatalf("got error = %v, want nil", err)
}
resp, _, err := docconv.ConvertPptx(f)
if err != nil {
t.Fatalf("got error = %v, want nil", err)
}
if want := "Get text from pptx"; !strings.Contains(resp, want) {
t.Errorf("expected %v to contain %v", resp, want)
}
if want := "First"; !strings.Contains(resp, want) {
t.Errorf("expected %v to contain %v", resp, want)
}
}
BIN
View File
Binary file not shown.