Prechádzať zdrojové kódy

Automatically finding wkhtmltopdf executable

Jhonny Mertz 9 rokov pred
rodič
commit
315b056d08

+ 51 - 1
src/main/java/br/eti/mertz/wkhtmltopdf/wrapper/configurations/WrapperConfig.java

@@ -1,10 +1,15 @@
 package br.eti.mertz.wkhtmltopdf.wrapper.configurations;
 
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
 public class WrapperConfig {
-    private String wkhtmltopdfCommand = "wkhtmltopdf";
 
     public WrapperConfig(String wkhtmltopdfCommand) {
         this.wkhtmltopdfCommand = wkhtmltopdfCommand;
+        if (wkhtmltopdfCommand == null)
+            findExecutable();
     }
 
     public String getWkhtmltopdfCommand() {
@@ -14,4 +19,49 @@ public class WrapperConfig {
     public void setWkhtmltopdfCommand(String wkhtmltopdfCommand) {
         this.wkhtmltopdfCommand = wkhtmltopdfCommand;
     }
+
+    /**
+     * Attempts to find the `wkhtmltopdf` executable in the system path.
+     *
+     * @return
+     */
+    private String wkhtmltopdfCommand = "wkhtmltopdf";
+
+    public String findExecutable() {
+
+        try {
+
+            String osname = System.getProperty("os.name").toLowerCase();
+
+            String cmd;
+            if (osname.contains("windows"))
+                cmd = "where wkhtmltopdf";
+            else cmd = "which wkhtmltopdf";
+
+            Process p = Runtime.getRuntime().exec(cmd);
+            p.waitFor();
+
+            BufferedReader reader =
+                    new BufferedReader(new InputStreamReader(p.getInputStream()));
+
+            StringBuilder sb = new StringBuilder();
+            String line = "";
+            while ((line = reader.readLine()) != null) {
+                sb.append(line + "\n");
+            }
+
+            if (sb.toString().isEmpty())
+                throw new RuntimeException();
+
+            setWkhtmltopdfCommand(sb.toString());
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (RuntimeException e) {
+            e.printStackTrace();
+        }
+
+        return getWkhtmltopdfCommand();
+    }
 }

+ 1 - 1
src/main/java/br/eti/mertz/wkhtmltopdf/wrapper/configurations/WrapperConfigBuilder.java

@@ -1,7 +1,7 @@
 package br.eti.mertz.wkhtmltopdf.wrapper.configurations;
 
 public class WrapperConfigBuilder {
-    private String wkhtmltopdfCommand = "wkhtmltopdf";
+    private String wkhtmltopdfCommand;
 
     public WrapperConfigBuilder setWkhtmltopdfCommand(String wkhtmltopdfCommand) {
         this.wkhtmltopdfCommand = wkhtmltopdfCommand;

+ 8 - 0
src/tests/java/br/eti/mertz/wkhtmltopdf/wrapper/PdfTest.java

@@ -1,5 +1,7 @@
 package br.eti.mertz.wkhtmltopdf.wrapper;
 
+import br.eti.mertz.wkhtmltopdf.wrapper.configurations.WrapperConfig;
+import br.eti.mertz.wkhtmltopdf.wrapper.configurations.WrapperConfigBuilder;
 import br.eti.mertz.wkhtmltopdf.wrapper.page.PageType;
 import br.eti.mertz.wkhtmltopdf.wrapper.params.Param;
 import org.apache.pdfbox.pdfparser.PDFParser;
@@ -23,6 +25,12 @@ public class PdfTest {
         Assert.assertThat("command params should contain the --enable-javascript and --html-header", pdf.getCommand(), containsString("--enable-javascript --html-header file:///example.html"));
     }
 
+    @Test
+    public void findExecutable() throws Exception {
+        WrapperConfig wc = new WrapperConfigBuilder().build();
+        Assert.assertThat("executable should be /usr/bin/wkhtmltopdf", wc.findExecutable(), containsString("/usr/bin/wkhtmltopdf"));
+    }
+
     @Test
     public void testPdfFromStringTo() throws Exception {