Browse Source

Multipage support

jhonnymertz 10 years ago
parent
commit
6052ff0ed4

+ 11 - 7
README.md

@@ -11,16 +11,20 @@ Usage
 ------------
 ```
 Pdf pdf = new Pdf();
-pdf.addHtmlInput("<html><head><meta charset=\"utf-8\"></head><h1>Müller</h1></html>");
-```
 
-The `wkhtmltopdf` shell command accepts different types of options such as global, page, headers and footers, and toc. Please see `wkhtmltopdf -H` for a full explanation. All options are passed as array, for example:
+pdf.addPage("<html><head><meta charset=\"utf-8\"></head><h1>Müller</h1></html>", PageType.htmlAsString);
+pdf.addPage("http://www.google.com", PageType.url);
 
-Options can be defined through an abstract param object:
+// Add a Table of contents
+pdf.addToc();
 
-```
-Pdf pdf = new Pdf();
-pdf.addParam(new Param("--enable-javascript"), new Param("--html-header", "file:///header.html"));
+// The `wkhtmltopdf` shell command accepts different types of options such as global, page, headers and footers, and toc. Please see `wkhtmltopdf -H` for a full explanation.
+// All options are passed as array, for example:
+pdf.addParam(new Param("--no-footer-line"), new Param("--html-header", "file:///header.html"));
+pdf.addParam(new Param("--enable-javascript"));
+
+// Save the PDF
+pdf.saveAs("output.pdf");
 ```
 
 Wrapper options

+ 68 - 53
src/main/java/br/eti/mertz/wkhtmltopdf/wrapper/Pdf.java

@@ -1,57 +1,61 @@
 package br.eti.mertz.wkhtmltopdf.wrapper;
 
-import java.io.*;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
 import br.eti.mertz.wkhtmltopdf.wrapper.configurations.WrapperConfig;
 import br.eti.mertz.wkhtmltopdf.wrapper.configurations.WrapperConfigBuilder;
+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 org.apache.commons.lang3.StringUtils;
 
+import java.io.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 public class Pdf implements PdfService {
 
-    private static final String STDOUT = "-";
+    private static final String STDINOUT = "-";
 
     private WrapperConfig wrapperConfig;
 
     private List<Param> params;
 
-	private String htmlInput = null;
-    private boolean htmlFromString = false;
+    private List<Page> pages;
 
-	public Pdf(WrapperConfig wrapperConfig) {
+    private boolean hasToc = false;
+
+    public Pdf(WrapperConfig wrapperConfig) {
         this.wrapperConfig = wrapperConfig;
         this.params = new ArrayList<Param>();
-	}
-
-	public Pdf() {
-		this(new WrapperConfigBuilder().build());
-	}
-
-    public void addHtmlInput(String input) {
-        this.htmlFromString = true;
-        this.htmlInput = input;
-	}
-
-	public void addParam(Param param) {
-		params.add(param);
-	}
-
-	public void addParam(Param... params) {
-		for (Param param : params) {
-			addParam(param);
-		}
-	}
-
-	/**
-	 * @throws IOException
-	 * @throws InterruptedException
-	 */
-	public void saveAs(String path) throws IOException, InterruptedException {
+        this.pages = new ArrayList<Page>();
+    }
+
+    public Pdf() {
+        this(new WrapperConfigBuilder().build());
+    }
+
+    public void addPage(String source, PageType type) {
+        this.pages.add(new Page(source, type));
+    }
+
+    public void addToc() {
+        this.hasToc = true;
+    }
+
+    public void addParam(Param param) {
+        params.add(param);
+    }
+
+    public void addParam(Param... params) {
+        for (Param param : params) {
+            addParam(param);
+        }
+    }
+
+    public void saveAs(String path) throws IOException, InterruptedException {
         saveAs(path, getPDF());
-	}
+    }
 
     private File saveAs(String path, byte[] document) throws IOException {
         File file = new File(path);
@@ -66,17 +70,15 @@ public class Pdf implements PdfService {
 
     public byte[] getPDF() throws IOException, InterruptedException {
 
-        if(htmlFromString && !this.params.contains(new Param("-"))) {
-            this.addParam(new Param("-"));
-        }
-
         Runtime runtime = Runtime.getRuntime();
         Process process = runtime.exec(getCommandAsArray());
 
-        if(htmlFromString) {
-            OutputStream stdInStream = process.getOutputStream();
-            stdInStream.write(htmlInput.getBytes("UTF-8"));
-            stdInStream.close();
+        for(Page page: pages){
+            if (page.getType().equals(PageType.htmlAsString)) {
+                OutputStream stdInStream = process.getOutputStream();
+                stdInStream.write(page.getSource().getBytes("UTF-8"));
+                stdInStream.close();
+            }
         }
 
         InputStream stdOutStream = process.getInputStream();
@@ -86,39 +88,52 @@ public class Pdf implements PdfService {
         ByteArrayOutputStream stdOut = new ByteArrayOutputStream();
         ByteArrayOutputStream stdErr = new ByteArrayOutputStream();
 
-        while(stdOutStream.available()>0) {
+        while (stdOutStream.available() > 0) {
             stdOut.write((char) stdOutStream.read());
         }
         stdOutStream.close();
-        while(stdErrStream.available()>0) {
+        while (stdErrStream.available() > 0) {
             stdErr.write((char) stdErrStream.read());
         }
         stdErrStream.close();
 
-        if(process.exitValue() != 0) {
-            throw new RuntimeException("Process (" + getCommand() + ") exited with status code " + process.exitValue() + ":\n"+new String(stdErr.toByteArray()));
+        if (process.exitValue() != 0) {
+            throw new RuntimeException("Process (" + getCommand() + ") exited with status code " + process.exitValue() + ":\n" + new String(stdErr.toByteArray()));
         }
 
         return stdOut.toByteArray();
     }
 
-    private String[] getCommandAsArray(){
+    private String[] getCommandAsArray() {
         List<String> commandLine = new ArrayList<String>();
         commandLine.add(wrapperConfig.getWkhtmltopdfCommand());
-        for(Param p : params) {
+
+        if(hasToc)
+            commandLine.add("toc");
+
+        for (Param p : params) {
             commandLine.add(p.getKey());
 
             String value = p.getValue();
 
-            if(value != null) {
+            if (value != null) {
                 commandLine.add(p.getValue());
             }
         }
-        commandLine.add(STDOUT);
+
+        for(Page page: pages){
+            if (page.getType().equals(PageType.htmlAsString)) {
+                commandLine.add(STDINOUT);
+            }
+            else{
+                commandLine.add(page.getSource());
+            }
+        }
+        commandLine.add(STDINOUT);
         return commandLine.toArray(new String[commandLine.size()]);
     }
 
-    public String getCommand(){
+    public String getCommand() {
         return StringUtils.join(getCommandAsArray(), " ");
     }
 

+ 8 - 6
src/main/java/br/eti/mertz/wkhtmltopdf/wrapper/PdfService.java

@@ -1,19 +1,21 @@
 package br.eti.mertz.wkhtmltopdf.wrapper;
 
+import br.eti.mertz.wkhtmltopdf.wrapper.page.PageType;
 import br.eti.mertz.wkhtmltopdf.wrapper.params.Param;
 
-import java.io.File;
 import java.io.IOException;
 
 public interface PdfService {
-	
-	void addHtmlInput(String page);
+
+    void addPage(String page, PageType type);
+
+    void addToc();
 
     void addParam(Param param);
 
     void addParam(Param... params);
-	
-	void saveAs(String path) throws IOException, InterruptedException;
 
-	byte[] getPDF() throws IOException, InterruptedException;
+    void saveAs(String path) throws IOException, InterruptedException;
+
+    byte[] getPDF() throws IOException, InterruptedException;
 }

+ 29 - 0
src/main/java/br/eti/mertz/wkhtmltopdf/wrapper/page/Page.java

@@ -0,0 +1,29 @@
+package br.eti.mertz.wkhtmltopdf.wrapper.page;
+
+public class Page {
+
+    private String source;
+
+    private PageType type;
+
+    public Page(String source, PageType type) {
+        this.source = source;
+        this.type = type;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    public PageType getType() {
+        return type;
+    }
+
+    public void setType(PageType type) {
+        this.type = type;
+    }
+}

+ 7 - 0
src/main/java/br/eti/mertz/wkhtmltopdf/wrapper/page/PageType.java

@@ -0,0 +1,7 @@
+package br.eti.mertz.wkhtmltopdf.wrapper.page;
+
+public enum PageType {
+    htmlAsString,
+    url,
+    file
+}

+ 15 - 15
src/main/java/br/eti/mertz/wkhtmltopdf/wrapper/params/Param.java

@@ -2,18 +2,18 @@ package br.eti.mertz.wkhtmltopdf.wrapper.params;
 
 public class Param {
 
-	private String key;
+    private String key;
 
-	private String value;
+    private String value;
 
-	public Param(String key, String value) {
-		this.key = key;
-		this.value = value;
-	}
+    public Param(String key, String value) {
+        this.key = key;
+        this.value = value;
+    }
 
-	public Param(String key) {
-		this(key, null);
-	}
+    public Param(String key) {
+        this(key, null);
+    }
 
     public String getKey() {
         return key;
@@ -32,11 +32,11 @@ public class Param {
     }
 
     public String toString() {
-		StringBuilder sb = new StringBuilder().append(Symbol.separator)
-				.append(Symbol.param).append(key);
-		if (value != null)
-			sb.append(Symbol.separator).append(value);
-		return sb.toString();
-	}
+        StringBuilder sb = new StringBuilder().append(Symbol.separator)
+                .append(Symbol.param).append(key);
+        if (value != null)
+            sb.append(Symbol.separator).append(value);
+        return sb.toString();
+    }
 
 }

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

@@ -5,28 +5,28 @@ import java.util.List;
 
 public class Params {
 
-	private List<Param> params;
-
-	public Params() {
-		this.params = new ArrayList<Param>();
-	}
-
-	public void add(Param param) {
-		params.add(param);
-	}
-
-	public void add(Param... params) {
-		for (Param param : params) {
-			add(param);
-		}
-	}
-	
-	public String toString(){
-		StringBuilder sb = new StringBuilder();
-		for(Param param : params){
-			sb.append(param);
-		}
-		return sb.toString();
-	}
+    private List<Param> params;
+
+    public Params() {
+        this.params = new ArrayList<Param>();
+    }
+
+    public void add(Param param) {
+        params.add(param);
+    }
+
+    public void add(Param... params) {
+        for (Param param : params) {
+            add(param);
+        }
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        for (Param param : params) {
+            sb.append(param);
+        }
+        return sb.toString();
+    }
 
 }

+ 9 - 9
src/main/java/br/eti/mertz/wkhtmltopdf/wrapper/params/Symbol.java

@@ -2,17 +2,17 @@ package br.eti.mertz.wkhtmltopdf.wrapper.params;
 
 public enum Symbol {
 
-	separator(" "), param("");
+    separator(" "), param("");
 
-	private String symbol;
+    private String symbol;
 
-	Symbol(String symbol) {
-		this.symbol = symbol;
-	}
+    Symbol(String symbol) {
+        this.symbol = symbol;
+    }
 
-	@Override
-	public String toString() {
-		return symbol;
-	}
+    @Override
+    public String toString() {
+        return symbol;
+    }
 
 }

+ 9 - 2
src/tests/java/br/eti/mertz/wkhtmltopdf/wrapper/PdfTest.java

@@ -2,6 +2,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;
 import org.apache.pdfbox.pdmodel.PDDocument;
@@ -18,8 +19,10 @@ public class PdfTest {
     @Test
     public void testCommand() throws Exception {
         Pdf pdf = new Pdf();
+        pdf.addToc();
         pdf.addParam(new Param("--enable-javascript"), new Param("--html-header", "file:///example.html"));
-        Assert.assertThat("command params should contain the --enable-javascript and --html-header", pdf.getCommand(), containsString("wkhtmltopdf --enable-javascript --html-header file:///example.html"));
+        pdf.addPage("http://www.google.com", PageType.url);
+        Assert.assertThat("command params should contain the --enable-javascript and --html-header", pdf.getCommand(), containsString("--enable-javascript --html-header file:///example.html"));
     }
 
     @Test
@@ -27,7 +30,9 @@ public class PdfTest {
 
         // GIVEN a html template containing special characters that java stores in utf-16 internally
         Pdf pdf = new Pdf();
-        pdf.addHtmlInput("<html><head><meta charset=\"utf-8\"></head><h1>Müller</h1></html>");
+        pdf.addPage("<html><head><meta charset=\"utf-8\"></head><h1>Müller</h1></html>", PageType.htmlAsString);
+
+        pdf.saveAs("output.pdf");
 
         // WHEN
         byte[] pdfBytes =  pdf.getPDF();
@@ -42,5 +47,7 @@ public class PdfTest {
         Assert.assertThat("document should contain the creditorName", pdfText, containsString("Müller"));
 
 
+
+
     }
 }