Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BP] Switch from iText to OpenPDF for PDF map rendering #6392

Merged
merged 2 commits into from
Jun 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion core/pom.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright (C) 2001-2016 Food and Agriculture Organization of the
~ Copyright (C) 2001-2022 Food and Agriculture Organization of the
~ United Nations (FAO-UN), United Nations World Food Programme (WFP)
~ and United Nations Environment Programme (UNEP)
~
Expand Down Expand Up @@ -390,6 +390,10 @@
</dependency>

<!-- Print service: MapFish -->
<dependency>
<groupId>com.github.librepdf</groupId>
<artifactId>openpdf</artifactId>
</dependency>
<dependency>
<groupId>org.mapfish.print</groupId>
<artifactId>print-lib</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//=============================================================================
//=== Copyright (C) 2001-2014 Food and Agriculture Organization of the
//=== Copyright (C) 2001-2022 Food and Agriculture Organization of the
//=== United Nations (FAO-UN), United Nations World Food Programme (WFP)
//=== and United Nations Environment Programme (UNEP)
//===
Expand All @@ -24,8 +24,6 @@
package org.fao.geonet.kernel.thumbnail;

import jeeves.server.context.ServiceContext;

import org.dom4j.DocumentException;
import org.fao.geonet.constants.Geonet;
import org.fao.geonet.utils.IO;
import org.fao.geonet.utils.Log;
Expand All @@ -36,20 +34,14 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;

import java.awt.Graphics2D;
import java.awt.Transparency;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;

import javax.imageio.ImageIO;

/**
* Use MapFish print module to generate thumbnail.
*
Expand Down Expand Up @@ -155,7 +147,7 @@ private MapPrinter getMapPrinter() {
}

public Path generateThumbnail(String jsonConfig, Integer rotationAngle)
throws IOException, DocumentException, com.itextpdf.text.DocumentException {
throws IOException {

PJsonObject specJson = MapPrinter.parseSpec(jsonConfig);
if (Log.isDebugEnabled(LOGGER_NAME)) {
Expand Down
108 changes: 35 additions & 73 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -422,11 +422,6 @@
</dependency>

<!-- PDF stuff: Managed by Mapfish -->
<!--dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.0.6</version>
</dependency-->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>fop</artifactId>
Expand Down Expand Up @@ -858,10 +853,15 @@
<artifactId>dlib</artifactId>
<version>1.0</version> <!-- FIXME totally unknown -->
</dependency>
<dependency>
<groupId>com.github.librepdf</groupId>
<artifactId>openpdf</artifactId>
<version>1.3.26</version>
</dependency>
<dependency>
<groupId>org.mapfish.print</groupId>
<artifactId>print-lib</artifactId>
<version>2.1.6</version>
<version>2.2.0</version>
</dependency>

<!-- Lib utils -->
Expand Down Expand Up @@ -958,20 +958,12 @@
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<!-- Not permitted under oracle licensing rules
<dependency>
<groupId>ojdbc</groupId>
<artifactId>ojdbc</artifactId>
<version>14</version>
</dependency>
-->
<!-- Oracle changed policy, this is from maven central -->
<!-- Oracle Free Use Terms and Conditions (FUTC) -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.6.0.0</version>
</dependency>
<!-- Oracle Free Use Terms and Conditions (FUTC) -->
</dependency>
<dependency>
<groupId>org.codehaus.izpack</groupId>
<artifactId>izpack-standalone-compiler</artifactId>
Expand Down Expand Up @@ -1120,14 +1112,8 @@
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>${flying-saucer}</version>
<exclusions>
<exclusion>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
</exclusion>
</exclusions>
<artifactId>flying-saucer-pdf-openpdf</artifactId>
<version>${flying-saucer.version}</version>
</dependency>

<dependency>
Expand Down Expand Up @@ -1231,66 +1217,42 @@

<!-- ================================================================== -->
<!-- Repositories. This is where Maven looks for dependencies. The -->
<!-- Maven repository is implicit and doesn't need to be specified. -->
<!-- Maven central repo is implicit and doesn't need to be listed. -->
<!-- -->
<!-- Please do not add additional repositories as this increases -->
<!-- build times, instead upload third-party dependencies to osgeo -->
<!-- repo.osgeo.org geonetwork-cache repository, or configure osgeo -->
<!-- releases repository to cache additional repos of interest: -->
<!-- -->
<!-- The following are cached for geonetwork: -->
<!-- http://maven.k-int.com/content/repositories/releases/ -->
<!-- repo.osgeo.org geonetwork-cache -->
<!-- https://github.com/geonetwork/core-maven-repo/ -->
<!-- http://maven.seasar.org/maven2 -->
<!-- ================================================================== -->
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>osgeo</id>
<name>OSGeo repository</name>
<name>OSGeo Release repository</name>
<url>https://repo.osgeo.org/repository/release/</url>
</repository>

<!-- managed by repo.osgeo.org k-int-cache -->
<!-- /marcxml/marcxml/* -->
<!-- /marc4j/marc4j/* -->
<!--repository>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>k-int</id>
<name>Developer k-int repository</name>
<url>http://maven.k-int.com/content/repositories/releases/</url>
</repository-->

<!-- managed by repo.osgeo.org geonetwork-cache -->
<!-- third party jar upload -->
<!-- TODO: move this content to geonetwork-releases -->
<!--
</repository>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>osgeo-snapshot</id>
<name>OSGeo Snapshot repository</name>
<url>https://repo.osgeo.org/repository/snapshot/</url>
<releases>
<enabled>true</enabled>
<enabled>false</enabled>
</releases>
<id>core-maven-repo</id>
<name>GeoNetwork remote repository</name>
<url>https://github.com/geonetwork/core-maven-repo/master</url>
</repository>
-->
<!-- managed by repo.osgeo.org seasar-cache -->
<!-- /net.arnx.jsonic/jsonic/* -->
<!-- seasar repo, has jsonic - used by langdetect -->
<!--
<repository>
<id>maven.seasar.org</id>
<name>The Seasar Foundation Maven2 Repository</name>
<url>http://maven.seasar.org/maven2</url>
</repository>
-->
<!-- managed by repo.osgeo.org geonetwork-releases -->
<!-- third party jar upload -->
<!-- org.mapfish.print:print-lib-2.1.6.jar -->
<!--
<repository>
<id>georchestra-mfprint</id>
<name>build-releases</name>
<url>https://packages.georchestra.org/artifactory/mapfish-print</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
-->
</repositories>


Expand Down Expand Up @@ -1589,7 +1551,7 @@
<npm.version>5.8.0</npm.version>
<xmlunit.version>2.1.1</xmlunit.version>
<jackson.version>2.10.3</jackson.version>
<flying-saucer>9.0.7</flying-saucer>
<flying-saucer.version>9.1.22</flying-saucer.version>
<camel.version>2.14.4</camel.version>
<log4j.version>1.2.17</log4j.version>
<log4j2.version>2.17.1</log4j2.version>
Expand Down
4 changes: 2 additions & 2 deletions services/pom.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright (C) 2001-2016 Food and Agriculture Organization of the
~ Copyright (C) 2001-2022 Food and Agriculture Organization of the
~ United Nations (FAO-UN), United Nations World Food Programme (WFP)
~ and United Nations Environment Programme (UNEP)
~
Expand Down Expand Up @@ -142,7 +142,7 @@

<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<artifactId>flying-saucer-pdf-openpdf</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//==============================================================================
//=== Copyright (C) 2001-2008 Food and Agriculture Organization of the
//=== Copyright (C) 2001-2022 Food and Agriculture Organization of the
//=== United Nations (FAO-UN), United Nations World Food Programme (WFP)
//=== and United Nations Environment Programme (UNEP)
//===
Expand All @@ -23,31 +23,6 @@

package org.fao.geonet.api.records.formatters;

import static com.google.common.io.Files.getNameWithoutExtension;
import static org.fao.geonet.api.ApiParams.API_PARAM_RECORD_UUID;
import static org.fao.geonet.api.records.formatters.FormatterConstants.SCHEMA_PLUGIN_FORMATTER_DIR;
import static org.springframework.data.jpa.domain.Specifications.where;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.DirectoryStream;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
import java.util.concurrent.Callable;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
Expand All @@ -66,28 +41,13 @@
import org.fao.geonet.SystemInfo;
import org.fao.geonet.api.API;
import org.fao.geonet.api.ApiUtils;
import org.fao.geonet.api.records.formatters.cache.CacheConfig;
import org.fao.geonet.api.records.formatters.cache.ChangeDateValidator;
import org.fao.geonet.api.records.formatters.cache.FormatterCache;
import org.fao.geonet.api.records.formatters.cache.Key;
import org.fao.geonet.api.records.formatters.cache.NoCacheValidator;
import org.fao.geonet.api.records.formatters.cache.StoreInfoAndDataLoadResult;
import org.fao.geonet.api.records.formatters.cache.Validator;
import org.fao.geonet.api.records.extent.MapRenderer;
import org.fao.geonet.api.records.formatters.cache.*;
import org.fao.geonet.api.records.formatters.groovy.ParamValue;
import org.fao.geonet.api.tools.i18n.LanguageUtils;
import org.fao.geonet.constants.Geonet;
import org.fao.geonet.domain.AbstractMetadata;
import org.fao.geonet.domain.ISODate;
import org.fao.geonet.domain.Metadata;
import org.fao.geonet.domain.MetadataType;
import org.fao.geonet.domain.OperationAllowed;
import org.fao.geonet.domain.Pair;
import org.fao.geonet.domain.ReservedOperation;
import org.fao.geonet.kernel.AccessManager;
import org.fao.geonet.kernel.DataManager;
import org.fao.geonet.kernel.GeonetworkDataDirectory;
import org.fao.geonet.kernel.SchemaManager;
import org.fao.geonet.kernel.XmlSerializer;
import org.fao.geonet.domain.*;
import org.fao.geonet.kernel.*;
import org.fao.geonet.kernel.datamanager.IMetadataUtils;
import org.fao.geonet.kernel.search.SearchManager;
import org.fao.geonet.kernel.setting.SettingManager;
Expand All @@ -96,7 +56,6 @@
import org.fao.geonet.repository.MetadataRepository;
import org.fao.geonet.repository.OperationAllowedRepository;
import org.fao.geonet.repository.specification.OperationAllowedSpecs;
import org.fao.geonet.api.records.extent.MapRenderer;
import org.fao.geonet.util.XslUtil;
import org.fao.geonet.utils.GeonetHttpRequestFactory;
import org.fao.geonet.utils.IO;
Expand All @@ -118,17 +77,27 @@
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Controller;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.WebRequest;
import org.xhtmlrenderer.pdf.ITextRenderer;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.*;
import java.util.concurrent.Callable;

import static com.google.common.io.Files.getNameWithoutExtension;
import static org.fao.geonet.api.ApiParams.API_PARAM_RECORD_UUID;
import static org.fao.geonet.api.records.formatters.FormatterConstants.SCHEMA_PLUGIN_FORMATTER_DIR;
import static org.springframework.data.jpa.domain.Specifications.where;

/**
* Allows a user to display a metadata with a particular formatters
*
Expand Down Expand Up @@ -570,7 +539,7 @@ private String getXmlFromUrl(ServiceContext context, String lang, String url, We
return new String(ByteStreams.toByteArray(execute.getBody()), Constants.CHARSET);
}

private void writerAsPDF(ServiceContext context, HttpServletResponse response, byte[] bytes, String lang) throws IOException, com.itextpdf.text.DocumentException {
private void writerAsPDF(ServiceContext context, HttpServletResponse response, byte[] bytes, String lang) throws IOException, com.lowagie.text.DocumentException {
final String htmlContent = new String(bytes, Constants.CHARSET);
try {
XslUtil.setNoScript();
Expand Down
Loading