Jhonny Mertz 10 лет назад
Родитель
Сommit
abceb80433

+ 15 - 0
README.md

@@ -27,6 +27,21 @@ pdf.addParam(new Param("--enable-javascript"));
 pdf.saveAs("output.pdf");
 ```
 
+Xvfb Support
+------------
+```
+XvfbConfig xc = new XvfbConfig();
+xc.addParams(new Param("--auto-servernum"), new Param("--server-num=1"));
+
+WrapperConfig wc = new WrapperConfig();
+wc.setXvfbConfig(xc);
+
+Pdf pdf = new Pdf(wc);
+pdf.addPage("http://www.google.com", PageType.url);
+
+pdf.saveAs("output.pdf");
+```
+
 Wrapper options
 -------------------
 TODO

+ 36 - 40
src/main/java/br/eti/mertz/wkhtmltopdf/wrapper/Pdf.java

@@ -4,7 +4,7 @@ import br.eti.mertz.wkhtmltopdf.wrapper.configurations.WrapperConfig;
 import br.eti.mertz.wkhtmltopdf.wrapper.page.Page;
 import br.eti.mertz.wkhtmltopdf.wrapper.page.PageType;
 import br.eti.mertz.wkhtmltopdf.wrapper.params.Param;
-
+import br.eti.mertz.wkhtmltopdf.wrapper.params.Params;
 import org.apache.commons.lang3.StringUtils;
 
 import java.io.*;
@@ -17,7 +17,7 @@ public class Pdf implements PdfService {
 
     private WrapperConfig wrapperConfig;
 
-    private List<Param> params;
+    private Params params;
 
     private List<Page> pages;
 
@@ -25,7 +25,7 @@ public class Pdf implements PdfService {
 
     public Pdf(WrapperConfig wrapperConfig) {
         this.wrapperConfig = wrapperConfig;
-        this.params = new ArrayList<Param>();
+        this.params = new Params();
         this.pages = new ArrayList<Page>();
     }
 
@@ -93,11 +93,11 @@ public class Pdf implements PdfService {
         }
 
         if (outputStreamEater.getError() != null) {
-        	throw outputStreamEater.getError();
+            throw outputStreamEater.getError();
         }
 
         if (errorStreamEater.getError() != null) {
-        	throw errorStreamEater.getError();
+            throw errorStreamEater.getError();
         }
 
         return outputStreamEater.getBytes();
@@ -105,20 +105,16 @@ public class Pdf implements PdfService {
 
     private String[] getCommandAsArray() {
         List<String> commandLine = new ArrayList<String>();
+
+        if (wrapperConfig.isXvfbEnabled())
+            commandLine.addAll(wrapperConfig.getXvfbConfig().getCommandLine());
+
         commandLine.add(wrapperConfig.getWkhtmltopdfCommand());
 
         if (hasToc)
             commandLine.add("toc");
 
-        for (Param p : params) {
-            commandLine.add(p.getKey());
-
-            String value = p.getValue();
-
-            if (value != null) {
-                commandLine.add(p.getValue());
-            }
-        }
+        commandLine.addAll(params.getParamsAsStringList());
 
         for (Page page : pages) {
             if (page.getType().equals(PageType.htmlAsString)) {
@@ -137,39 +133,39 @@ public class Pdf implements PdfService {
 
     private class StreamEater extends Thread {
 
-    	private InputStream stream;
-		private ByteArrayOutputStream bytes;
+        private InputStream stream;
+        private ByteArrayOutputStream bytes;
 
-		private IOException error;
+        private IOException error;
 
-		public StreamEater(InputStream stream) {
-			this.stream = stream;
+        public StreamEater(InputStream stream) {
+            this.stream = stream;
 
-	        bytes = new ByteArrayOutputStream();
-		}
+            bytes = new ByteArrayOutputStream();
+        }
 
-		public void run() {
-			try {
-				int bytesRead = stream.read();
-				while (bytesRead >= 0) {
-					bytes.write(bytesRead);
-					bytesRead = stream.read();
-				}
+        public void run() {
+            try {
+                int bytesRead = stream.read();
+                while (bytesRead >= 0) {
+                    bytes.write(bytesRead);
+                    bytesRead = stream.read();
+                }
 
-				stream.close();
-			} catch (IOException e) {
-				e.printStackTrace();
+                stream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
 
-				error = e;
-			}
-		}
+                error = e;
+            }
+        }
 
-		public IOException getError() {
-			return error;
-		}
+        public IOException getError() {
+            return error;
+        }
 
-		public byte[] getBytes() {
-			return bytes.toByteArray();
-		}
+        public byte[] getBytes() {
+            return bytes.toByteArray();
+        }
     }
 }

+ 17 - 22
src/main/java/br/eti/mertz/wkhtmltopdf/wrapper/configurations/WrapperConfig.java

@@ -6,11 +6,15 @@ import java.io.InputStreamReader;
 
 public class WrapperConfig {
 
+    private XvfbConfig xvfbConfig;
+
+    private String wkhtmltopdfCommand = "wkhtmltopdf";
+
     public WrapperConfig(String wkhtmltopdfCommand) {
         this.wkhtmltopdfCommand = wkhtmltopdfCommand;
     }
 
-    public WrapperConfig(){
+    public WrapperConfig() {
         this.wkhtmltopdfCommand = findExecutable();
     }
 
@@ -22,32 +26,11 @@ public class WrapperConfig {
         this.wkhtmltopdfCommand = wkhtmltopdfCommand;
     }
 
-    private boolean xvfbEnabled = false;
-    private String xvfbrunCommand = "xvfb-run";
-
-    public boolean isXvfbEnabled() {
-        return xvfbEnabled;
-    }
-
-    public void setXvfbEnabled(boolean xvfbEnabled) {
-        this.xvfbEnabled = xvfbEnabled;
-    }
-
-    public String getXvfbrunCommand() {
-        return xvfbrunCommand;
-    }
-
-    public void setXvfbrunCommand(String xvfbrunCommand) {
-        this.xvfbrunCommand = xvfbrunCommand;
-    }
-
     /**
      * Attempts to find the `wkhtmltopdf` executable in the system path.
      *
      * @return
      */
-    private String wkhtmltopdfCommand = "wkhtmltopdf";
-
     public String findExecutable() {
 
         try {
@@ -85,4 +68,16 @@ public class WrapperConfig {
 
         return getWkhtmltopdfCommand();
     }
+
+    public boolean isXvfbEnabled() {
+        return xvfbConfig != null;
+    }
+
+    public XvfbConfig getXvfbConfig() {
+        return xvfbConfig;
+    }
+
+    public void setXvfbConfig(XvfbConfig xvfbConfig) {
+        this.xvfbConfig = xvfbConfig;
+    }
 }

+ 47 - 0
src/main/java/br/eti/mertz/wkhtmltopdf/wrapper/configurations/XvfbConfig.java

@@ -0,0 +1,47 @@
+package br.eti.mertz.wkhtmltopdf.wrapper.configurations;
+
+import br.eti.mertz.wkhtmltopdf.wrapper.params.Param;
+import br.eti.mertz.wkhtmltopdf.wrapper.params.Params;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class XvfbConfig {
+
+    private String command;
+    private Params params;
+
+    public XvfbConfig(String command) {
+        this.command = command;
+        params = new Params();
+    }
+
+    public XvfbConfig() {
+        command = "xvfb-run";
+        params = new Params();
+    }
+
+    public void addParams(Param... params) {
+        for (Param param : params) {
+            this.params.add(param);
+        }
+    }
+
+    public String getCommand() {
+        return command;
+    }
+
+    public void setCommand(String command) {
+        this.command = command;
+    }
+
+    public List<String> getCommandLine() {
+        List<String> commandLine = new ArrayList<String>();
+
+        commandLine.add(getCommand());
+        commandLine.addAll(params.getParamsAsStringList());
+
+        return commandLine;
+    }
+
+}

+ 16 - 0
src/main/java/br/eti/mertz/wkhtmltopdf/wrapper/params/Params.java

@@ -21,6 +21,22 @@ public class Params {
         }
     }
 
+    public List<String> getParamsAsStringList() {
+        List<String> commandLine = new ArrayList<String>();
+
+        for (Param p : params) {
+            commandLine.add(p.getKey());
+
+            String value = p.getValue();
+
+            if (value != null) {
+                commandLine.add(p.getValue());
+            }
+        }
+
+        return commandLine;
+    }
+
     public String toString() {
         StringBuilder sb = new StringBuilder();
         for (Param param : params) {

+ 54 - 0
src/tests/java/br/eti/mertz/wkhtmltopdf/wrapper/XvfbTest.java

@@ -0,0 +1,54 @@
+package br.eti.mertz.wkhtmltopdf.wrapper;
+
+import br.eti.mertz.wkhtmltopdf.wrapper.configurations.WrapperConfig;
+import br.eti.mertz.wkhtmltopdf.wrapper.configurations.XvfbConfig;
+import br.eti.mertz.wkhtmltopdf.wrapper.page.PageType;
+import br.eti.mertz.wkhtmltopdf.wrapper.params.Param;
+import org.apache.pdfbox.pdfparser.PDFParser;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.util.PDFTextStripper;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+
+import static org.hamcrest.core.StringContains.containsString;
+
+public class XvfbTest {
+
+    @Test
+    public void testXvfbCommand() throws Exception {
+        WrapperConfig wc = new WrapperConfig();
+        wc.setXvfbConfig(new XvfbConfig());
+        Pdf pdf = new Pdf(wc);
+        Assert.assertThat("command should contain xvfb-run config", pdf.getCommand(), containsString("xvfb-run"));
+    }
+
+    @Test
+    public void testPdfWithXvfb() throws Exception {
+
+        XvfbConfig xc = new XvfbConfig();
+        xc.addParams(new Param("--auto-servernum"), new Param("--server-num=1"));
+
+        WrapperConfig wc = new WrapperConfig();
+        wc.setXvfbConfig(xc);
+
+        Pdf pdf = new Pdf(wc);
+        pdf.addPage("http://www.google.com", PageType.url);
+
+        pdf.saveAs("output.pdf");
+
+        // WHEN
+        byte[] pdfBytes = pdf.getPDF();
+
+        PDFParser parser = new PDFParser(new ByteArrayInputStream(pdfBytes));
+
+        // that is a valid PDF (otherwise an IOException occurs)
+        parser.parse();
+        PDFTextStripper pdfTextStripper = new PDFTextStripper();
+        String pdfText = pdfTextStripper.getText(new PDDocument(parser.getDocument()));
+
+        Assert.assertThat("document should be generated", pdfText, containsString("Google"));
+    }
+
+}