diff --git a/docx_test/testdata/sample_3.docx b/docx_test/testdata/sample_3.docx new file mode 100644 index 0000000..c01b78a Binary files /dev/null and b/docx_test/testdata/sample_3.docx differ diff --git a/pptx.go b/pptx.go new file mode 100644 index 0000000..a0cb839 --- /dev/null +++ b/pptx.go @@ -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 +} diff --git a/pptx_test/pptx_test.go b/pptx_test/pptx_test.go new file mode 100644 index 0000000..b936e3f --- /dev/null +++ b/pptx_test/pptx_test.go @@ -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) + } +} diff --git a/pptx_test/testdata/sample.pptx b/pptx_test/testdata/sample.pptx new file mode 100644 index 0000000..e90b71c Binary files /dev/null and b/pptx_test/testdata/sample.pptx differ