]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document/src/org/simantics/document/Exportable.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document / src / org / simantics / document / Exportable.java
1 /*******************************************************************************\r
2  * Copyright (c) 2012 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\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
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.document;\r
13 \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
20 \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
31 \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
40 \r
41 public class Exportable implements IExportable {\r
42 \r
43         final private String html;\r
44         final private DocumentSettings settings;\r
45 \r
46         private static final String DEFAULT_CSS;\r
47         public static final String DEFAULT_MODEL_CSS;\r
48 \r
49         private static String getBundleFileContents(String path, String defaultValue) {\r
50                 URL url = BundleUtils.find(Activator.getContext().getBundle(), path);\r
51                 if (url == null)\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
58                 }\r
59         }\r
60 \r
61         static {\r
62                 DEFAULT_CSS = getBundleFileContents("simantics-wiki-documents.css", "");\r
63                 DEFAULT_MODEL_CSS = getBundleFileContents("simantics-wiki-documents-default-model.css", "");\r
64         }\r
65         \r
66         public Exportable(ReadGraph graph, Resource res, String wiki, String css, DocumentSettings settings, boolean print) {\r
67 \r
68                 try {\r
69                         wiki = DocumentDialect.INSTANCE.apply(graph, res, wiki);\r
70                 } catch (DatabaseException e) {\r
71                         Logger.defaultLogError(e);\r
72                 }\r
73                 \r
74                 this.settings = settings;\r
75                 \r
76                 MarkupParser markupParser = new MarkupParser();\r
77                 MediaWikiLanguage language = new MediaWikiLanguage();\r
78                 markupParser.setMarkupLanguage(language);\r
79                 String html = markupParser.parseToHtml(wiki);\r
80                 \r
81                 String width = "width:" + (210-settings.marginLeft-settings.marginRight) + "mm;";\r
82 \r
83                 if(print) {\r
84                         html = html.replace("<body>", "<body style=\"background-color:#fff\"><div style=\"background-color:#FFF;" + width + "\">");\r
85                         html = html.replace("</body>", "</div></body>");\r
86                 } else {\r
87                         String div1 = "margin-left:3mm;margin-top:3mm;background-color:#FFF;width:210mm;"; \r
88                         String div2 = "background-color:#FFF;width:210mm;padding-top:" + settings.marginTop + "mm;";\r
89                         String div3 = "overflow-x:hidden;margin-left:" + settings.marginLeft + "mm;background-color:#FFF;" + width; \r
90                         html = html.replace("<body>", "<body><div style=\"" + div1 + "\"><div style=\"" + div2 + "\"><div style=\"" + div3 + "\">");\r
91                         html = html.replace("</body>", "</div></div></div></body>");\r
92                 }\r
93                 \r
94                 html = html.replace("<td>", "<td><div>");\r
95                 html = html.replace("<th>", "<th><div>");\r
96                 html = html.replace("</td>", "</div></td>");\r
97                 html = html.replace("</th>", "</div></th>");\r
98                 html = html.replace("</head>", "<style type=\"text/css\">" + DEFAULT_CSS + css +  "</style></head>");\r
99                 \r
100                 this.html = html;\r
101                 \r
102         }\r
103         \r
104         public String getHTML() {\r
105                 return html;\r
106         }\r
107 \r
108         @Override\r
109         public void export(Document document, PdfWriter writer) throws DocumentException {\r
110 \r
111                 File temp = Simantics.getTempfile("wikiPdfExport", "pdf");\r
112                 try {\r
113                         \r
114                         temp.getParentFile().mkdirs();\r
115                         PhantomJSDriver.print(html, settings, temp);\r
116                         \r
117                 PdfContentByte cb = writer.getDirectContent();\r
118                 PdfReader reader = new PdfReader(new BufferedInputStream(new FileInputStream(temp)));\r
119                 for (int i = 1; i <= reader.getNumberOfPages(); i++) {\r
120                         document.setPageSize(PageSize.A4);\r
121                         document.newPage();\r
122                         //import the page from source pdf\r
123                         PdfImportedPage page = writer.getImportedPage(reader, i);\r
124                         //add the page to the destination pdf\r
125                         float pts = Utilities.millimetersToPoints(10);\r
126                         cb.addTemplate(page, pts, pts);\r
127                 }\r
128 \r
129                 } catch (IOException e) {\r
130 \r
131                         throw new DocumentException(e);\r
132                         \r
133                 }\r
134 \r
135         }\r
136 \r
137 }