mirror of
https://github.com/sajari/docconv.git
synced 2026-10-16 21:21:59 +08:00
pptx: add support for MS PowerPoint files (#71)
This commit is contained in:
Vendored
BIN
Binary file not shown.
@@ -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
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
Vendored
BIN
Binary file not shown.
Reference in New Issue
Block a user