Skip to content

Commit 55aa33a

Browse files
Optimize Siteplan export (#1591)
* Optimize Siteplan export * Update export siteplan xsl template * determine custom folding mark top/bottom * Add export ppm option * Update MapScale.ts * REmove debug code * Fix java format * remove test code * Fix Exception by image height greate than A0
1 parent 106ef99 commit 55aa33a

File tree

15 files changed

+532
-195
lines changed

15 files changed

+532
-195
lines changed

java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/pdf/SiteplanPdfExportBuilder.java

Lines changed: 78 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,17 @@
1616

1717
import java.awt.image.BufferedImage;
1818
import java.io.ByteArrayInputStream;
19+
import java.io.File;
1920
import java.io.IOException;
2021
import java.io.StringWriter;
22+
import java.nio.file.FileVisitOption;
23+
import java.nio.file.Files;
2124
import java.nio.file.Path;
2225
import java.nio.file.Paths;
26+
import java.util.Comparator;
2327
import java.util.List;
2428
import java.util.Map;
29+
import java.util.stream.Stream;
2530

2631
import javax.xml.parsers.ParserConfigurationException;
2732
import javax.xml.transform.Transformer;
@@ -30,6 +35,8 @@
3035
import javax.xml.transform.stream.StreamResult;
3136
import javax.xml.transform.stream.StreamSource;
3237

38+
import org.apache.pdfbox.io.MemoryUsageSetting;
39+
import org.apache.pdfbox.multipdf.PDFMergerUtility;
3340
import org.apache.poi.UnsupportedFileFormatException;
3441
import org.eclipse.set.basis.FreeFieldInfo;
3542
import org.eclipse.set.basis.OverwriteHandling;
@@ -63,6 +70,7 @@
6370
public class SiteplanPdfExportBuilder extends FopPdfExportBuilder {
6471

6572
private static final String SITEPLAN_EXPORT_NAME = "SI"; //$NON-NLS-1$
73+
private static final String SITEPLAN_TMP_DIR = "siteplanTmp"; //$NON-NLS-1$
6674

6775
/**
6876
* @param enumTranslationService
@@ -85,13 +93,13 @@ public void setFopService(final FopService fopService) {
8593
this.fopService = fopService;
8694
}
8795

88-
private static String createImageDocumentText(
89-
final List<BufferedImage> imagesData, final Titlebox titleBox,
90-
final FreeFieldInfo freeFieldInfo, final double ppm)
96+
private static String createImageDocumentText(final BufferedImage imageData,
97+
final Titlebox titleBox, final FreeFieldInfo freeFieldInfo,
98+
final double ppm)
9199
throws ParserConfigurationException, TransformerException {
92100
final TableToTableDocument tableToXmlFo = TableToTableDocument
93101
.createTransformation();
94-
final Document document = tableToXmlFo.transformToDocument(imagesData,
102+
final Document document = tableToXmlFo.transformToDocument(imageData,
95103
titleBox, freeFieldInfo, ppm);
96104
final Transformer documentToString = newTransformerFactory()
97105
.newTransformer();
@@ -132,45 +140,80 @@ public void exportSiteplanPdf(final List<BufferedImage> imagesData,
132140
final double ppm, final String outputDir,
133141
final ToolboxPaths toolboxPaths, final TableType tableType,
134142
final OverwriteHandling overwriteHandling) {
135-
143+
final Path exportTmpDir = Path.of(outputDir, SITEPLAN_TMP_DIR);
144+
if (!exportTmpDir.toFile().exists()) {
145+
exportTmpDir.toFile().mkdirs();
146+
}
147+
final PDFMergerUtility pdfMergerUtility = new PDFMergerUtility();
148+
pdfMergerUtility.setDestinationFileName(toolboxPaths
149+
.getTableExportPath(SITEPLAN_EXPORT_NAME, Paths.get(outputDir),
150+
ExportType.PLANNING_RECORDS, TABLE_PDF_EXPORT_EXTENSION)
151+
.toString());
136152
try {
137-
final String imageDocumentText = createImageDocumentText(imagesData,
138-
titleBox, freeFieldInfo, ppm);
139-
140-
if (ToolboxConfiguration.isDebugMode()) {
141-
exportTableDocument(
142-
Paths.get(outputDir,
143-
getFilename(SITEPLAN_EXPORT_NAME, "xml")), //$NON-NLS-1$
144-
imageDocumentText);
153+
for (int i = 0; i < imagesData.size(); i++) {
154+
final String imageDocumentText = createImageDocumentText(
155+
imagesData.get(i), titleBox, freeFieldInfo, ppm);
156+
final String siteplanExportName = SITEPLAN_EXPORT_NAME + "_" //$NON-NLS-1$
157+
+ i;
158+
if (ToolboxConfiguration.isDebugMode()) {
159+
exportTableDocument(
160+
Paths.get(exportTmpDir.toString(),
161+
getFilename(siteplanExportName, "xml")), //$NON-NLS-1$
162+
imageDocumentText);
163+
}
164+
final ByteArrayInputStream tableDocumentStream = new ByteArrayInputStream(
165+
imageDocumentText.getBytes(UTF_8));
166+
final StreamSource imageDocumentSource = new StreamSource(
167+
tableDocumentStream);
168+
final String exportFileName = getFilename(siteplanExportName,
169+
"xsl"); //$NON-NLS-1$
170+
final String pagePostFix = i == imagesData.size() - 1 ? "-" //$NON-NLS-1$
171+
: "+"; //$NON-NLS-1$
172+
final Pair<String, StreamSource> xslStreamSource = getSiteplanXSLTemplate(
173+
imagesData.get(i), ppm, tableType,
174+
exportTmpDir.toString(), exportFileName, i + 1,
175+
pagePostFix);
176+
final Path outputPath = toolboxPaths.getTableExportPath(
177+
String.format("%s_%s_%d", SITEPLAN_EXPORT_NAME, //$NON-NLS-1$
178+
xslStreamSource.getFirst(), Integer.valueOf(i)),
179+
exportTmpDir, ExportType.PLANNING_RECORDS,
180+
TABLE_PDF_EXPORT_EXTENSION);
181+
fopService.fop(OutputFormat.PDF, xslStreamSource.getSecond(),
182+
imageDocumentSource, outputPath, PdfAMode.PDF_A_3a,
183+
overwriteHandling, null);
184+
pdfMergerUtility.addSource(outputPath.toFile());
145185
}
146-
final ByteArrayInputStream tableDocumentStream = new ByteArrayInputStream(
147-
imageDocumentText.getBytes(UTF_8));
148-
final StreamSource imageDocumentSource = new StreamSource(
149-
tableDocumentStream);
150-
final Pair<String, StreamSource> xslStreamSource = getSiteplanXSLTemplate(
151-
imagesData, ppm, tableType, outputDir);
152-
final Path outputPath = toolboxPaths.getTableExportPath(
153-
SITEPLAN_EXPORT_NAME + "_" + xslStreamSource.getFirst(), //$NON-NLS-1$
154-
Paths.get(outputDir), ExportType.PLANNING_RECORDS,
155-
TABLE_PDF_EXPORT_EXTENSION);
156-
fopService.fop(OutputFormat.PDF, xslStreamSource.getSecond(),
157-
imageDocumentSource, outputPath, PdfAMode.PDF_A_3a,
158-
overwriteHandling, null);
159-
186+
pdfMergerUtility
187+
.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
160188
} catch (final Exception e) {
161189
throw new FileExportException(
162190
Path.of(outputDir, SITEPLAN_EXPORT_NAME), e);
163191
}
192+
193+
if (!ToolboxConfiguration.isDevelopmentMode()
194+
&& exportTmpDir.toFile().exists()) {
195+
try (Stream<Path> paths = Files.walk(exportTmpDir,
196+
FileVisitOption.values())) {
197+
paths.sorted(Comparator.reverseOrder())
198+
.map(Path::toFile)
199+
.forEach(File::delete);
200+
} catch (final IOException e) {
201+
throw new FileExportException(
202+
Path.of(outputDir, SITEPLAN_EXPORT_NAME), e);
203+
}
204+
}
205+
164206
}
165207

166208
private Pair<String, StreamSource> getSiteplanXSLTemplate(
167-
final List<BufferedImage> imagesData, final double ppm,
168-
final TableType tableType, final String outputDir)
169-
throws ParserConfigurationException, SAXException, IOException,
170-
NullPointerException, TransformerException,
171-
UnsupportedFileFormatException {
172-
final SiteplanXSL siteplanXSL = new SiteplanXSL(imagesData, ppm,
173-
translationTableType(tableType));
209+
final BufferedImage imageData, final double ppm,
210+
final TableType tableType, final String outputDir,
211+
final String exportFileName, final int pagePosition,
212+
final String pagePostfix) throws ParserConfigurationException,
213+
SAXException, IOException, NullPointerException,
214+
TransformerException, UnsupportedFileFormatException {
215+
final SiteplanXSL siteplanXSL = new SiteplanXSL(imageData, ppm,
216+
translationTableType(tableType), pagePosition, pagePostfix);
174217
final Document xslDoc = siteplanXSL.getXSLDocument();
175218
final String pageDIN = siteplanXSL.getPageStyle()
176219
.getPageDIN()
@@ -182,13 +225,9 @@ private Pair<String, StreamSource> getSiteplanXSLTemplate(
182225
final StringWriter writer = new StringWriter();
183226
final StreamResult result = new StreamResult(writer);
184227
documentToString.transform(source, result);
185-
exportTableDocument(
186-
Path.of(outputDir,
187-
getFilename(SITEPLAN_EXPORT_NAME + "_" + pageDIN, //$NON-NLS-1$
188-
"xsl")), //$NON-NLS-1$
228+
exportTableDocument(Path.of(outputDir, exportFileName),
189229
writer.toString());
190230
}
191231
return new Pair<>(pageDIN, toStreamSource(xslDoc));
192232
}
193-
194233
}

java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/pdf/TableToTableDocument.xtend

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,12 @@ class TableToTableDocument {
7777
static def TableToTableDocument createTransformation() throws ParserConfigurationException {
7878
return new TableToTableDocument
7979
}
80-
81-
def Document transformToDocument(List<BufferedImage> imagesData,
82-
Titlebox titleBox, FreeFieldInfo freeFieldInfo, double ppm) {
80+
81+
def Document transformToDocument(BufferedImage imageData, Titlebox titleBox, FreeFieldInfo freeFieldInfo, double ppm) {
8382
tablename = "siteplan export"
8483
logger.debug("transform siteplan to document")
8584
val rootNode = doc.createElement("Siteplan")
86-
imagesData.forEach[rootNode.appendChild(transform(ppm))]
85+
rootNode.appendChild(imageData.transform(ppm))
8786
rootNode.appendChild(titleBox.transform)
8887
rootNode.appendChild(freeFieldInfo.transform)
8988
doc.appendChild(rootNode)

java/bundles/org.eclipse.set.feature/rootdir/data/export/pdf/siteplan_template.xsl

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ http://www.eclipse.org/legal/epl-v20.html
1616

1717

1818
<!-- The Variables will be set value by Java-->
19-
<xsl:variable name="water-mark-content"/>
2019
<xsl:variable name="siteplan-freefeld-height" />
2120
<xsl:variable name="significant-width" />
2221
<xsl:variable name="significant-height" />
2322
<xsl:variable name="siteplan-folding-mark-right-width" />
24-
2523
<xsl:variable name="region-body-height" />
2624
<xsl:variable name="region-body-width" />
25+
<xsl:variable name="pagePosition" />
26+
<xsl:variable name="pagePostFix" />
2727

2828
<xsl:attribute-set name="page-master-style">
2929
<!-- Page layout -->
@@ -56,46 +56,28 @@ http://www.eclipse.org/legal/epl-v20.html
5656
<fo:region-start region-name="folding-mark-region-left" xsl:use-attribute-sets="siteplan-folding-mark-region-attribute"/>
5757
<fo:region-end region-name="title-box-region" xsl:use-attribute-sets="siteplan-title-box-region-style"/>
5858
</fo:simple-page-master>
59-
<fo:simple-page-master master-name="table-master-last" xsl:use-attribute-sets="page-master-style">
60-
<fo:region-body xsl:use-attribute-sets="siteplan-region-style"/>
61-
<fo:region-before region-name="folding-mark-region-top" xsl:use-attribute-sets="siteplan-folding-mark-region-attribute"/>
62-
<fo:region-after region-name="folding-mark-region-bottom" xsl:use-attribute-sets="siteplan-folding-mark-region-attribute"/>
63-
<fo:region-start region-name="folding-mark-region-left" xsl:use-attribute-sets="siteplan-folding-mark-region-attribute"/>
64-
<fo:region-end region-name="title-box-region-last" xsl:use-attribute-sets="siteplan-title-box-region-style"/>
65-
</fo:simple-page-master>
59+
6660
<fo:page-sequence-master master-name="page-sequence-master">
6761
<fo:repeatable-page-master-alternatives>
68-
<fo:conditional-page-master-reference master-reference="table-master-last" page-position="last"/>
6962
<fo:conditional-page-master-reference master-reference="table-master"/>
7063
</fo:repeatable-page-master-alternatives>
7164
</fo:page-sequence-master>
7265
</fo:layout-master-set>
7366

74-
<fo:page-sequence master-reference="page-sequence-master">
67+
<fo:page-sequence master-reference="page-sequence-master" initial-page-number="{$pagePosition}">
7568
<fo:static-content flow-name="folding-mark-region-top">
7669
<xsl:call-template name="CutMark" />
7770
<fo:block-container height="100%" width="100%">
7871
<xsl:call-template name="siteplan-folding-mark-top-bottom"/>
7972
</fo:block-container>
80-
<xsl:call-template name="WaterMark"/>
8173
</fo:static-content>
8274

8375

8476
<fo:static-content flow-name="title-box-region">
8577
<fo:block-container height="100%" width="100%">
8678
<fo:block>
8779
<xsl:call-template name="SiteplanTitleboxRegion">
88-
<xsl:with-param name="pagePostfix" select="'+'"/>
89-
</xsl:call-template>
90-
</fo:block>
91-
</fo:block-container>
92-
</fo:static-content>
93-
94-
<fo:static-content flow-name="title-box-region-last">
95-
<fo:block-container height="100%" width="100%">
96-
<fo:block>
97-
<xsl:call-template name="SiteplanTitleboxRegion">
98-
<xsl:with-param name="pagePostfix" select="'-'"/>
80+
<xsl:with-param name="pagePostfix" select="$pagePostFix"/>
9981
</xsl:call-template>
10082
</fo:block>
10183
</fo:block-container>
@@ -134,13 +116,6 @@ http://www.eclipse.org/legal/epl-v20.html
134116

135117
</fo:root>
136118
</xsl:template>
137-
<xsl:template name="WaterMark">
138-
<fo:block-container absolute-position="absolute" fox:transform="rotate(30)" top="-3.5cm" width="47cm">
139-
<fo:block color="#f5f5f5" font-size="200pt" font-weight="bold" text-align="center">
140-
<xsl:value-of select="$water-mark-content"/>
141-
</fo:block>
142-
</fo:block-container>
143-
</xsl:template>
144119

145120
<xsl:template name="SiteplanTitleboxRegion">
146121
<xsl:param name="pagePostfix" select="''"/>

java/bundles/org.eclipse.set.utils/src/org/eclipse/set/utils/export/xsl/XSLConstant.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,16 @@ public static class XSLNodeName {
8686
*/
8787
public static final String SITEPLAN_FOLDING_MARK_RIGHT_WIDTH = "siteplan-folding-mark-right-width";
8888

89+
/**
90+
* pagePosition
91+
*/
92+
public static final String SITEPLAN_PAGEPOSITION = "pagePosition";
93+
94+
/**
95+
* pagePostFix
96+
*/
97+
public static final String SITEPLAN_PAGE_POSTFIX = "pagePostFix";
98+
8999
}
90100

91101
/**

java/bundles/org.eclipse.set.utils/src/org/eclipse/set/utils/export/xsl/siteplan/SiteplanExportPage.java

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,9 @@
1111
package org.eclipse.set.utils.export.xsl.siteplan;
1212

1313
import static org.eclipse.set.utils.export.xsl.siteplan.SiteplanXSLExtension.PageDIN.*;
14-
import static org.eclipse.set.utils.export.xsl.siteplan.SiteplanXSLExtension.RegionPosition.*;
15-
16-
import java.util.List;
14+
import static org.eclipse.set.utils.export.xsl.siteplan.SiteplanXSLExtension.RegionPosition.END;
1715

1816
import org.eclipse.set.utils.export.xsl.XMLDocumentExtensions;
19-
import org.eclipse.set.utils.export.xsl.siteplan.SiteplanXSLExtension.FoldingMark;
2017

2118
/**
2219
* Contains site plan export page
@@ -37,40 +34,24 @@ private SiteplanExportPage() {
3734
static {
3835
SITEPLAN_PAGE_A3 = new SiteplanXSLPageBuilder(A3)
3936
.setRegionBody(205, 277)
40-
.setFoldingMarks(BEFORE, 125, 105, 190)
41-
.setFoldingMarks(AFTER, 125, 105, 190)
4237
.setTitleBoxRegion(END, 180, 197)
4338
.setSignificantInformation(205)
4439
.build();
4540

4641
SITEPLAN_PAGE_A2 = new SiteplanXSLPageBuilder(A2)
4742
.setRegionBody(377, 400)
48-
.setFoldingMarks(BEFORE, 210, 192, 192)
49-
.setFoldingMarks(AFTER, 210, 192, 192)
50-
.setFoldingMarks(START, 113, 287)
51-
.setFoldingMarks(new FoldingMark(END,
52-
List.of(Double.valueOf(113), Double.valueOf(287)), 12,
53-
FoldingMark.DEFAULT_MARK_WIDTH))
5443
.setTitleBoxRegion(END, 190, 320)
5544
.setSignificantInformation(187)
5645
.build();
5746

5847
SITEPLAN_PAGE_A1 = new SiteplanXSLPageBuilder(A1)
5948
.setRegionBody(626, 574)
60-
.setFoldingMarks(BEFORE, 210, 190, 125.5, 125.5, 190)
61-
.setFoldingMarks(AFTER, 210, 190, 125.5, 125.5, 190)
62-
.setFoldingMarks(START, 287, 287)
63-
.setFoldingMarks(END, 287, 287)
6449
.setTitleBoxRegion(END, 190, 494)
6550
.setSignificantInformation(246)
6651
.build();
6752

6853
SITEPLAN_PAGE_A0 = new SiteplanXSLPageBuilder(A0)
6954
.setRegionBody(974, 821)
70-
.setFoldingMarks(BEFORE, 210, 190, 190, 190, 109.5, 109.5, 190)
71-
.setFoldingMarks(AFTER, 210, 190, 190, 190, 109.5, 109.5, 190)
72-
.setFoldingMarks(START, 237, 297, 287)
73-
.setFoldingMarks(END, 237, 297, 287)
7455
.setTitleBoxRegion(END, 190, 741)
7556
.setSignificantInformation(214)
7657
.build();

0 commit comments

Comments
 (0)