diff --git a/jasperreports/docs/config.reference.xml b/jasperreports/docs/config.reference.xml index 3f599f2fe5..f59be90a61 100644 --- a/jasperreports/docs/config.reference.xml +++ b/jasperreports/docs/config.reference.xml @@ -7589,9 +7589,9 @@ Flag that determines whether glyph substitution based on Apache FOP is enabled. The flag is set to false by default, disabling glyph substitution.

When Apache FOP is present on the classpath, glyph substitution can only be disabled -by using a patched version of OpenPDF (1.3.30.jaspersoft.x from +when using OpenPDF 1.3.32 and newer, or a version patched by Jaspersoft (1.3.30.jaspersoft.x from https://jaspersoft.jfrog.io/jaspersoft/third-party-ce-artifacts/com/github/librepdf/openpdf/). -The property needs to be explicitly set to true when using a standard/unpatched version of OpenPDF together with Apache FOP. +The property needs to be explicitly set to true when using an unpatched version of OpenPDF older than 1.3.32 together with Apache FOP.

Also see the net.sf.jasperreports.export.pdf.classic.document.language diff --git a/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/PdfXmpCreator.java b/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/PdfXmpCreator.java index f1e33bf95a..094484cf41 100644 --- a/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/PdfXmpCreator.java +++ b/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/PdfXmpCreator.java @@ -181,7 +181,11 @@ else if (this.conformance == PdfaConformanceEnum.PDFA_3U) } xmp.setProperty(XMPConst.NS_XMP, XMP_CREATE_DATE, ((PdfDate) info.get(PdfName.CREATIONDATE)).getW3CDate()); - xmp.setProperty(XMPConst.NS_XMP, XMP_MODIFY_DATE, ((PdfDate) info.get(PdfName.MODDATE)).getW3CDate()); + PdfDate modifiedDate = (PdfDate) info.get(PdfName.MODDATE); + if (modifiedDate != null) + { + xmp.setProperty(XMPConst.NS_XMP, XMP_MODIFY_DATE, modifiedDate.getW3CDate()); + } String title = extractInfo(PdfName.TITLE); if (title != null) diff --git a/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/classic/ClassicPdfProducer.java b/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/classic/ClassicPdfProducer.java index 6bb1a3cd11..c63da0d68f 100644 --- a/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/classic/ClassicPdfProducer.java +++ b/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/classic/ClassicPdfProducer.java @@ -27,8 +27,6 @@ import java.awt.geom.Rectangle2D; import java.io.IOException; import java.io.OutputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.text.AttributedCharacterIterator.Attribute; import java.util.HashMap; import java.util.Locale; @@ -61,7 +59,6 @@ import net.sf.jasperreports.engine.JRPrintImage; import net.sf.jasperreports.engine.JRPrintText; import net.sf.jasperreports.engine.JRPropertiesUtil; -import net.sf.jasperreports.engine.JRRuntimeException; import net.sf.jasperreports.engine.PrintPageFormat; import net.sf.jasperreports.engine.type.ModeEnum; import net.sf.jasperreports.engine.util.JRStyledText; @@ -125,21 +122,6 @@ public class ClassicPdfProducer implements PdfProducer ) public static final String PROPERTY_DOCUMENT_LANGUAGE = JRPropertiesUtil.PROPERTY_PREFIX + "export.pdf.classic.document.language"; - private final static Method SET_GLYPH_SUBSTITUTION_ENABLED_METHOD; - static - { - Method setGlyphSubstitutionEnabledMethod = null; - try - { - setGlyphSubstitutionEnabledMethod = Document.class.getMethod("setGlyphSubstitutionEnabled", Boolean.TYPE); - } - catch (NoSuchMethodException | SecurityException e) - { - log.debug("Failed to detect com.lowagie.text.Document.setGlyphSubstitutionEnabled method: " + e); - } - SET_GLYPH_SUBSTITUTION_ENABLED_METHOD = setGlyphSubstitutionEnabledMethod; - } - private PdfProducerContext context; private ClassicPdfStructure pdfStructure; @@ -206,19 +188,7 @@ protected void setDocumentProperties(Document pdfDocument) PROPERTY_FOP_GLYPH_SUBSTITUTION_ENABLED, false); if (!glyphSubstitutionEnabled && FopGlyphProcessor.isFopSupported()) { - if (SET_GLYPH_SUBSTITUTION_ENABLED_METHOD == null) - { - throw new PatchedPdfLibraryUnavailableException(); - } - - try - { - SET_GLYPH_SUBSTITUTION_ENABLED_METHOD.invoke(pdfDocument, false); - } - catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) - { - throw new JRRuntimeException("Failed to invoke com.lowagie.text.Document.setGlyphSubstitutionEnabled", e); - } + pdfDocument.setGlyphSubstitutionEnabled(false); } } diff --git a/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/classic/ClassicRadioCheck.java b/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/classic/ClassicRadioCheck.java index 55c125db1f..9932c50dc7 100644 --- a/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/classic/ClassicRadioCheck.java +++ b/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/classic/ClassicRadioCheck.java @@ -76,7 +76,7 @@ public void add() { try { - PdfFormField ck = radioCheckField.getCheckField(); + PdfFormField ck = radioCheckField.getFullField(); pdfProducer.getPdfWriter().addAnnotation(ck); } catch (Exception e) diff --git a/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/classic/PatchedPdfLibraryUnavailableException.java b/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/classic/PatchedPdfLibraryUnavailableException.java index 15dd46ea4d..83bd232136 100644 --- a/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/classic/PatchedPdfLibraryUnavailableException.java +++ b/jasperreports/ext/pdf/src/main/java/net/sf/jasperreports/pdf/classic/PatchedPdfLibraryUnavailableException.java @@ -26,9 +26,15 @@ import net.sf.jasperreports.engine.JRConstants; import net.sf.jasperreports.engine.JRRuntimeException; +//TODO delete? + /** + * No longer used, OpenPDF 1.3.32 supports disabling glyph substitution. + * + *

* Exception raised when Apache FOP based glyph substitution is disabled, but * the patched version OpenPDF library has not been detected. + *

* *

* The OpenPDF library (used by the JasperReports PDF exporter) performs glyph diff --git a/jasperreports/src/net/sf/jasperreports/components/ComponentsXmlWriter.java b/jasperreports/src/net/sf/jasperreports/components/ComponentsXmlWriter.java index 97295ed4d7..eb5f600df0 100644 --- a/jasperreports/src/net/sf/jasperreports/components/ComponentsXmlWriter.java +++ b/jasperreports/src/net/sf/jasperreports/components/ComponentsXmlWriter.java @@ -29,6 +29,7 @@ import net.sf.jasperreports.components.items.Item; import net.sf.jasperreports.components.items.ItemData; import net.sf.jasperreports.components.items.ItemProperty; +import net.sf.jasperreports.components.items.ItemXmlFactory; import net.sf.jasperreports.components.list.ListComponent; import net.sf.jasperreports.components.list.ListContents; import net.sf.jasperreports.components.map.MapComponent; @@ -285,7 +286,7 @@ private void writeMarkerItemDataContent(String name, MarkerItemData markerItemDa private void writeItem(Item item, JRXmlWriteHelper writer, JRXmlWriter reportWriter, XmlNamespace namespace, JRComponentElement componentElement) throws IOException { - writer.startElement(MapXmlFactory.ELEMENT_item, namespace); + writer.startElement(ItemXmlFactory.ELEMENT_item, namespace); List itemProperties = item.getProperties(); for(ItemProperty property : itemProperties) { @@ -296,7 +297,7 @@ private void writeItem(Item item, JRXmlWriteHelper writer, JRXmlWriter reportWri private void writeItemProperty(ItemProperty itemProperty, JRXmlWriteHelper writer, JRXmlWriter reportWriter, XmlNamespace namespace, JRComponentElement componentElement) throws IOException { - writer.startElement(MapXmlFactory.ELEMENT_itemProperty, namespace); + writer.startElement(ItemXmlFactory.ELEMENT_itemProperty, namespace); writer.addEncodedAttribute(JRXmlConstants.ATTRIBUTE_name, itemProperty.getName()); if(itemProperty.getValue() != null) { diff --git a/jasperreports/src/net/sf/jasperreports/components/items/ItemXmlFactory.java b/jasperreports/src/net/sf/jasperreports/components/items/ItemXmlFactory.java index 1b7cc685a3..b878130882 100644 --- a/jasperreports/src/net/sf/jasperreports/components/items/ItemXmlFactory.java +++ b/jasperreports/src/net/sf/jasperreports/components/items/ItemXmlFactory.java @@ -33,6 +33,8 @@ */ public class ItemXmlFactory extends JRBaseFactory { + public static final String ELEMENT_item = "item"; + public static final String ELEMENT_itemProperty = "itemProperty"; @Override public Object createObject(Attributes atts) diff --git a/jasperreports/src/net/sf/jasperreports/components/map/MapXmlFactory.java b/jasperreports/src/net/sf/jasperreports/components/map/MapXmlFactory.java index 3b7f45dce5..514631120a 100644 --- a/jasperreports/src/net/sf/jasperreports/components/map/MapXmlFactory.java +++ b/jasperreports/src/net/sf/jasperreports/components/map/MapXmlFactory.java @@ -25,6 +25,7 @@ import org.xml.sax.Attributes; +import net.sf.jasperreports.components.items.ItemXmlFactory; import net.sf.jasperreports.components.map.type.MapImageTypeEnum; import net.sf.jasperreports.components.map.type.MapScaleEnum; import net.sf.jasperreports.components.map.type.MapTypeEnum; @@ -48,7 +49,10 @@ public class MapXmlFactory extends JRBaseFactory public static final String ATTRIBUTE_onErrorType = "onErrorType"; public static final String ATTRIBUTE_markerClustering = "markerClustering"; public static final String ATTRIBUTE_markerSpidering = "markerSpidering"; - public static final String ELEMENT_item = "item"; + /** + * @deprecated Replaced by {@link ItemXmlFactory#ELEMENT_item}. + */ + public static final String ELEMENT_item = ItemXmlFactory.ELEMENT_item; public static final String ELEMENT_markerData = "markerData"; public static final String ELEMENT_legendItem = "legendItem"; public static final String ELEMENT_resetMapItem = "resetMapItem"; @@ -56,7 +60,10 @@ public class MapXmlFactory extends JRBaseFactory public static final String ELEMENT_markerClusteringExpression = "markerClusteringExpression"; public static final String ELEMENT_markerSpideringExpression = "markerSpideringExpression"; public static final String ELEMENT_legendIconExpression = "legendIconExpression"; - public static final String ELEMENT_itemProperty = "itemProperty"; + /** + * @deprecated Replaced by {@link ItemXmlFactory#ELEMENT_itemProperty}. + */ + public static final String ELEMENT_itemProperty = ItemXmlFactory.ELEMENT_itemProperty; public static final String ELEMENT_pathStyle = "pathStyle"; public static final String ELEMENT_pathData = "pathData";