From: Simon Steiner Date: Fri, 13 Oct 2017 12:12:52 +0000 (+0000) Subject: FOP-2753: PDF to PS allow fop fonts as fallback X-Git-Tag: fop-2_3~24 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a2382d7d247ad4bc12df79a691b21d58077f689b;p=xmlgraphics-fop.git FOP-2753: PDF to PS allow fop fonts as fallback git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1812122 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/fop-core/src/main/java/org/apache/fop/render/ps/PSFontUtils.java b/fop-core/src/main/java/org/apache/fop/render/ps/PSFontUtils.java index f2f6bdaf3..568a22f70 100644 --- a/fop-core/src/main/java/org/apache/fop/render/ps/PSFontUtils.java +++ b/fop-core/src/main/java/org/apache/fop/render/ps/PSFontUtils.java @@ -36,6 +36,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.fontbox.cff.CFFStandardString; import org.apache.xmlgraphics.fonts.Glyphs; +import org.apache.xmlgraphics.java2d.GeneralGraphics2DImagePainter; import org.apache.xmlgraphics.ps.DSCConstants; import org.apache.xmlgraphics.ps.PSGenerator; import org.apache.xmlgraphics.ps.PSResource; @@ -50,6 +51,7 @@ import org.apache.fop.fonts.CustomFont; import org.apache.fop.fonts.EmbeddingMode; import org.apache.fop.fonts.Font; import org.apache.fop.fonts.FontInfo; +import org.apache.fop.fonts.FontTriplet; import org.apache.fop.fonts.FontType; import org.apache.fop.fonts.LazyFont; import org.apache.fop.fonts.MultiByteFont; @@ -907,4 +909,12 @@ public class PSFontUtils extends org.apache.xmlgraphics.ps.PSFontUtils { gen.getResourceTracker().registerSuppliedResource(res); return res; } + + public static void addFallbackFonts(FontInfo fontInfo, GeneralGraphics2DImagePainter painter) throws IOException { + for (Map.Entry x : fontInfo.getFontTriplets().entrySet()) { + String name = x.getKey().getName(); + Typeface typeface = fontInfo.getFonts().get(x.getValue()); + painter.addFallbackFont(name, typeface); + } + } } diff --git a/fop-core/src/main/java/org/apache/fop/render/ps/PSGraphics2DAdapter.java b/fop-core/src/main/java/org/apache/fop/render/ps/PSGraphics2DAdapter.java index 2ed64e770..3988fdf09 100644 --- a/fop-core/src/main/java/org/apache/fop/render/ps/PSGraphics2DAdapter.java +++ b/fop-core/src/main/java/org/apache/fop/render/ps/PSGraphics2DAdapter.java @@ -31,6 +31,7 @@ import org.apache.xmlgraphics.java2d.Graphics2DImagePainter; import org.apache.xmlgraphics.java2d.ps.PSGraphics2D; import org.apache.xmlgraphics.ps.PSGenerator; +import org.apache.fop.fonts.FontInfo; import org.apache.fop.pdf.PDFFactory; import org.apache.fop.render.AbstractGraphics2DAdapter; import org.apache.fop.render.ImageHandlerUtil; @@ -45,15 +46,17 @@ public class PSGraphics2DAdapter extends AbstractGraphics2DAdapter { private PSGenerator gen; private boolean clip = true; + private FontInfo fontInfo; /** * Creates a new instance. * @param gen the PostScript generator * @param clip true if the image should be clipped */ - public PSGraphics2DAdapter(PSGenerator gen, boolean clip) { + public PSGraphics2DAdapter(PSGenerator gen, boolean clip, FontInfo fontInfo) { this.gen = gen; this.clip = clip; + this.fontInfo = fontInfo; } /** {@inheritDoc} */ @@ -113,6 +116,9 @@ public class PSGraphics2DAdapter extends AbstractGraphics2DAdapter { / context.getUserAgent().getTargetResolution(); graphics.drawImage(bi, new AffineTransform(scale, 0, 0, scale, 0, 0), null); } else { + if (painter instanceof GeneralGraphics2DImagePainter) { + PSFontUtils.addFallbackFonts(fontInfo, (GeneralGraphics2DImagePainter) painter); + } Rectangle2D area = new Rectangle2D.Double(0.0, 0.0, imw, imh); painter.paint(graphics, area); } diff --git a/fop-core/src/main/java/org/apache/fop/render/ps/PSImageHandlerGraphics2D.java b/fop-core/src/main/java/org/apache/fop/render/ps/PSImageHandlerGraphics2D.java index f7f22020a..f128ecc8d 100644 --- a/fop-core/src/main/java/org/apache/fop/render/ps/PSImageHandlerGraphics2D.java +++ b/fop-core/src/main/java/org/apache/fop/render/ps/PSImageHandlerGraphics2D.java @@ -37,6 +37,7 @@ import org.apache.xmlgraphics.ps.FormGenerator; import org.apache.xmlgraphics.ps.PSGenerator; import org.apache.xmlgraphics.ps.PSProcSets; +import org.apache.fop.fonts.FontInfo; import org.apache.fop.render.RenderingContext; /** @@ -94,6 +95,9 @@ public class PSImageHandlerGraphics2D implements PSImageHandler { transform.translate(fx, fy); gen.getCurrentState().concatMatrix(transform); Rectangle2D area = new Rectangle2D.Double(0.0, 0.0, imw, imh); + if (painter instanceof GeneralGraphics2DImagePainter) { + PSFontUtils.addFallbackFonts(psContext.getFontInfo(), (GeneralGraphics2DImagePainter) painter); + } painter.paint(graphics, area); gen.restoreGraphicsState(); gen.commentln("%FOPEndGraphics2D"); @@ -107,7 +111,7 @@ public class PSImageHandlerGraphics2D implements PSImageHandler { final ImageGraphics2D imageG2D = (ImageGraphics2D)image; ImageInfo info = image.getInfo(); - FormGenerator formGen = buildFormGenerator(gen.getPSLevel(), form, info, imageG2D); + FormGenerator formGen = buildFormGenerator(gen.getPSLevel(), form, info, imageG2D, psContext.getFontInfo()); formGen.generate(gen); } /** {@inheritDoc} */ @@ -133,8 +137,8 @@ public class PSImageHandlerGraphics2D implements PSImageHandler { return false; } - private FormGenerator buildFormGenerator(int psLanguageLevel, final PSImageFormResource form, - final ImageInfo info, final ImageGraphics2D imageG2D) { + private FormGenerator buildFormGenerator(int psLanguageLevel, final PSImageFormResource form, final ImageInfo info, + final ImageGraphics2D imageG2D, final FontInfo fontInfo) { String imageDescription = info.getMimeType() + " " + info.getOriginalURI(); final Dimension2D dimensionsPt = info.getSize().getDimensionPt(); final Dimension2D dimensionsMpt = info.getSize().getDimensionMpt(); @@ -145,7 +149,7 @@ public class PSImageHandlerGraphics2D implements PSImageHandler { @Override void doGeneratePaintProc(PSGenerator gen) throws IOException { - paintImageG2D(imageG2D, dimensionsMpt, gen); + paintImageG2D(imageG2D, dimensionsMpt, gen, fontInfo); } }; } else { @@ -157,7 +161,7 @@ public class PSImageHandlerGraphics2D implements PSImageHandler { gen.writeln(" /Filter /SubFileDecode"); gen.writeln(" /DecodeParms << /EODCount 0 /EODString (%FOPEndOfData) >>"); gen.writeln(">> /ReusableStreamDecode filter"); - paintImageG2D(imageG2D, dimensionsMpt, gen); + paintImageG2D(imageG2D, dimensionsMpt, gen, fontInfo); gen.writeln("%FOPEndOfData"); gen.writeln("def"); } @@ -179,8 +183,8 @@ public class PSImageHandlerGraphics2D implements PSImageHandler { } protected void paintImageG2D(final ImageGraphics2D imageG2D, Dimension2D dimensionsMpt, - PSGenerator gen) throws IOException { - PSGraphics2DAdapter adapter = new PSGraphics2DAdapter(gen, false); + PSGenerator gen, FontInfo fontInfo) throws IOException { + PSGraphics2DAdapter adapter = new PSGraphics2DAdapter(gen, false, fontInfo); adapter.paintImage(imageG2D.getGraphics2DImagePainter(), null, 0, 0, diff --git a/fop-core/src/test/java/org/apache/fop/render/ps/PSGraphics2DAdapterTestCase.java b/fop-core/src/test/java/org/apache/fop/render/ps/PSGraphics2DAdapterTestCase.java new file mode 100644 index 000000000..b3ca7205b --- /dev/null +++ b/fop-core/src/test/java/org/apache/fop/render/ps/PSGraphics2DAdapterTestCase.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.fop.render.ps; + +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.geom.Rectangle2D; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import org.junit.Assert; +import org.junit.Test; + +import org.apache.xmlgraphics.java2d.GeneralGraphics2DImagePainter; +import org.apache.xmlgraphics.java2d.ps.PSGraphics2D; +import org.apache.xmlgraphics.ps.PSGenerator; + +import org.apache.fop.fonts.FontInfo; + +public class PSGraphics2DAdapterTestCase { + @Test + public void testFontFallback() throws IOException { + PSGenerator gen = new PSGenerator(new ByteArrayOutputStream()); + FontInfo fi = new FontInfo(); + fi.addFontProperties("a", "b", "c", 400); + PSGraphics2DAdapter psGraphics2DAdapter = new PSGraphics2DAdapter(gen, true, fi); + MyPainter painter = new MyPainter(); + psGraphics2DAdapter.paintImage(painter, null, 0, 0, 0, 0); + Assert.assertEquals(painter.font, "b"); + } + + static class MyPainter implements GeneralGraphics2DImagePainter { + String font; + public Graphics2D getGraphics(boolean textAsShapes, PSGenerator gen) { + return new PSGraphics2D(true); + } + + public void addFallbackFont(String name, Object font) { + this.font = name; + } + + public void paint(Graphics2D g2d, Rectangle2D area) { + } + + public Dimension getImageSize() { + return new Dimension(); + } + } +} diff --git a/fop/lib/xmlgraphics-commons-svn-trunk.jar b/fop/lib/xmlgraphics-commons-svn-trunk.jar index 7dad52a1f..0e5af7b47 100644 Binary files a/fop/lib/xmlgraphics-commons-svn-trunk.jar and b/fop/lib/xmlgraphics-commons-svn-trunk.jar differ