You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2012/11/26 19:58:35 UTC
svn commit: r1413782 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
Author: lehmi
Date: Mon Nov 26 18:58:34 2012
New Revision: 1413782
URL: http://svn.apache.org/viewvc?rev=1413782&view=rev
Log:
PDFBOX-490: rebuild WinANSI-TTF-font using if the naming table is missing
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java?rev=1413782&r1=1413781&r2=1413782&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java Mon Nov 26 18:58:34 2012
@@ -18,6 +18,8 @@ package org.apache.pdfbox.pdmodel.font;
import java.awt.Font;
import java.awt.FontFormatException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -44,6 +46,7 @@ import org.apache.fontbox.ttf.NamingTabl
import org.apache.fontbox.ttf.OS2WindowsMetricsTable;
import org.apache.fontbox.ttf.PostScriptTable;
import org.apache.fontbox.ttf.TTFParser;
+import org.apache.fontbox.ttf.TTFSubFont;
import org.apache.fontbox.ttf.TrueTypeFont;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
@@ -437,7 +440,20 @@ public class PDTrueTypeFont extends PDSi
}
catch( FontFormatException f )
{
- log.info("Can't read the embedded font " + fd.getFontName() );
+ try
+ {
+ // as a workaround we try to rebuild the embedded subsfont
+ byte[] fontData = rebuildTTF(fd, ff2Stream.createInputStream());
+ if (fontData != null)
+ {
+ ByteArrayInputStream bais = new ByteArrayInputStream(fontData);
+ awtFont = Font.createFont( Font.TRUETYPE_FONT,bais);
+ }
+ }
+ catch (FontFormatException e)
+ {
+ log.info("Can't read the embedded font " + fd.getFontName() );
+ }
}
if (awtFont == null)
{
@@ -482,6 +498,25 @@ public class PDTrueTypeFont extends PDSi
return awtFont;
}
+ private byte[] rebuildTTF(PDFontDescriptorDictionary fd, InputStream inputStream) throws IOException
+ {
+ // this is one possible case of an incomplete subfont which leads to a font exception
+ if (getFontEncoding() instanceof WinAnsiEncoding)
+ {
+ TTFParser ttfParser = new TTFParser(true);
+ TrueTypeFont ttf = ttfParser.parseTTF(inputStream);
+ TTFSubFont ttfSub = new TTFSubFont(ttf, "PDFBox-Rebuild");
+ for (int i=getFirstChar();i<=getLastChar();i++)
+ {
+ ttfSub.addCharCode(i);
+ }
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ttfSub.writeToStream(baos);
+ return baos.toByteArray();
+ }
+ return null;
+ }
+
private InputStream getExternalTTFData() throws IOException
{
String ttfResource = externalFonts.getProperty( UNKNOWN_FONT );