Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(206)

Side by Side Diff: go/pdf/poppler.go

Issue 1216483002: golden/pdfxform a pdf rasterization server (Closed) Base URL: https://skia.googlesource.com/buildbot@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 package pdf
2
3 import (
4 "fmt"
5 "io"
6 "os"
7 "os/exec"
8 "time"
9 )
10
11 const (
12 pdftoppmExecutable = "pdftoppm" // provided by poppler-utils
13 pnmtopngExecutable = "pnmtopng" // provided by netpbm
14 )
15
16 type Poppler struct{}
17
18 func (Poppler) String() string { return "Poppler" }
19
20 func (Poppler) Enabled() bool {
21 return commandFound(pdftoppmExecutable) && commandFound(pnmtopngExecutab le)
22 }
23
24 // This does the following:
25 // `pdftoppm -r 72 -f 1 -l 1 < $PDF 2>/dev/null | pnmtopng 2> /dev/null > $PNG `
26 func (Poppler) Rasterize(pdfInputPath, pngOutputPath string) error {
27 if !(Poppler{}).Enabled() {
28 return fmt.Errorf("pdftoppm or pnmtopng is missing")
29 }
30
31 pdftoppm := exec.Command(pdftoppmExecutable, "-r", "72", "-f", "1", "-l" , "1")
32 pnmtopng := exec.Command(pnmtopngExecutable)
33
34 defer processKiller(pdftoppm)
35 defer processKiller(pnmtopng)
36
37 pr, pw, err := os.Pipe()
38 if err != nil {
39 return err
40 }
41 defer fileCloser(pw)
42 defer fileCloser(pr)
43 pdftoppm.Stdout = pw
44 pnmtopng.Stdin = pr
45
46 iFile, err := os.Open(pdfInputPath)
47 if err != nil {
48 return err
49 }
50 defer iFile.Close()
51 pdftoppm.Stdin = iFile
52
53 oFile, err := os.Create(pngOutputPath)
54 if err != nil {
55 return err
56 }
57 defer oFile.Close()
58 pnmtopng.Stdout = oFile
59
60 if err := pdftoppm.Start(); err != nil {
61 return err
62 }
63 if err := pnmtopng.Start(); err != nil {
64 return err
65 }
66
67 go func() {
68 time.Sleep(5 * time.Second)
69 _ = pdftoppm.Process.Kill()
70 }()
71 if err := pdftoppm.Wait(); err != nil {
72 return err
73 }
74 if err := pw.Close(); err != nil {
75 return err
76 }
77 if err := pnmtopng.Wait(); err != nil {
78 return err
79 }
80 return nil
81 }
82
83 // Prevents zombie processes
84 func processKiller(command *exec.Cmd) {
85 if command.Process != nil {
86 _ = command.Process.Kill()
87 _ = command.Wait()
88 }
89 }
90
91 func fileCloser(c io.Closer) {
92 _ = c.Close()
93 }
OLDNEW
« no previous file with comments | « go/pdf/pdfium.go ('k') | go/pdf/testdata/minimal.pdf » ('j') | golden/go/pdfxform/pdfxform.go » ('J')

Powered by Google App Engine
This is Rietveld 408576698