1 /*******************************************************************************
\r
2 * Copyright (c) 2012 Association for Decentralized Information Management in
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.document;
\r
14 import java.io.BufferedInputStream;
\r
15 import java.io.File;
\r
16 import java.io.FileInputStream;
\r
17 import java.io.IOException;
\r
18 import java.io.InputStream;
\r
19 import java.net.URL;
\r
21 import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
\r
22 import org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage;
\r
23 import org.simantics.Simantics;
\r
24 import org.simantics.db.ReadGraph;
\r
25 import org.simantics.db.Resource;
\r
26 import org.simantics.db.common.utils.Logger;
\r
27 import org.simantics.db.exception.DatabaseException;
\r
28 import org.simantics.utils.FileUtils;
\r
29 import org.simantics.utils.ui.BundleUtils;
\r
30 import org.simantics.wiki.ui.editor.IExportable;
\r
32 import com.lowagie.text.Document;
\r
33 import com.lowagie.text.DocumentException;
\r
34 import com.lowagie.text.PageSize;
\r
35 import com.lowagie.text.Utilities;
\r
36 import com.lowagie.text.pdf.PdfContentByte;
\r
37 import com.lowagie.text.pdf.PdfImportedPage;
\r
38 import com.lowagie.text.pdf.PdfReader;
\r
39 import com.lowagie.text.pdf.PdfWriter;
\r
41 public class Exportable implements IExportable {
\r
43 final private String html;
\r
44 final private DocumentSettings settings;
\r
46 private static final String DEFAULT_CSS;
\r
47 public static final String DEFAULT_MODEL_CSS;
\r
49 private static String getBundleFileContents(String path, String defaultValue) {
\r
50 URL url = BundleUtils.find(Activator.getContext().getBundle(), path);
\r
52 return defaultValue;
\r
53 try (InputStream in = url.openStream()) {
\r
54 return FileUtils.getContents(in);
\r
55 } catch (IOException e) {
\r
56 Logger.defaultLogError(e);
\r
57 return defaultValue;
\r
62 DEFAULT_CSS = getBundleFileContents("simantics-wiki-documents.css", "");
\r
63 DEFAULT_MODEL_CSS = getBundleFileContents("simantics-wiki-documents-default-model.css", "");
\r
66 public Exportable(ReadGraph graph, Resource res, String wiki, String css, DocumentSettings settings, boolean print) {
\r
69 wiki = DocumentDialect.INSTANCE.apply(graph, res, wiki);
\r
70 } catch (DatabaseException e) {
\r
71 Logger.defaultLogError(e);
\r
74 this.settings = settings;
\r
76 MarkupParser markupParser = new MarkupParser();
\r
77 markupParser.setMarkupLanguage(new MediaWikiLanguage());
\r
78 String html = markupParser.parseToHtml(wiki);
\r
80 String width = "width:" + (210-settings.marginLeft-settings.marginRight) + "mm;";
\r
83 html = html.replace("<body>", "<body style=\"background-color:#fff\"><div style=\"background-color:#FFF;" + width + "\">");
\r
84 html = html.replace("</body>", "</div></body>");
\r
86 String div1 = "margin-left:3mm;margin-top:3mm;background-color:#FFF;width:210mm;";
\r
87 String div2 = "background-color:#FFF;width:210mm;padding-top:" + settings.marginTop + "mm;";
\r
88 String div3 = "overflow-x:hidden;margin-left:" + settings.marginLeft + "mm;background-color:#FFF;" + width;
\r
89 html = html.replace("<body>", "<body><div style=\"" + div1 + "\"><div style=\"" + div2 + "\"><div style=\"" + div3 + "\">");
\r
90 html = html.replace("</body>", "</div></div></div></body>");
\r
93 html = html.replace("<td>", "<td><div>");
\r
94 html = html.replace("<th>", "<th><div>");
\r
95 html = html.replace("</td>", "</div></td>");
\r
96 html = html.replace("</th>", "</div></th>");
\r
97 html = html.replace("</head>", "<style type=\"text/css\">\n" + DEFAULT_CSS + css + "\n</style>\n</head>\n");
\r
103 public String getHTML() {
\r
108 public void export(Document document, PdfWriter writer) throws DocumentException {
\r
110 File temp = Simantics.getTempfile("wikiPdfExport", "pdf");
\r
113 temp.getParentFile().mkdirs();
\r
114 PhantomJSDriver.print(html, settings, temp);
\r
116 PdfContentByte cb = writer.getDirectContent();
\r
117 PdfReader reader = new PdfReader(new BufferedInputStream(new FileInputStream(temp)));
\r
118 for (int i = 1; i <= reader.getNumberOfPages(); i++) {
\r
119 document.setPageSize(PageSize.A4);
\r
120 document.newPage();
\r
121 //import the page from source pdf
\r
122 PdfImportedPage page = writer.getImportedPage(reader, i);
\r
123 //add the page to the destination pdf
\r
124 float pts = Utilities.millimetersToPoints(10);
\r
125 cb.addTemplate(page, pts, pts);
\r
128 } catch (IOException e) {
\r
130 throw new DocumentException(e);
\r