Ignore:
Timestamp:
03/10/08 08:08:44 (4 years ago)
Author:
jharrop
Message:

Basic support for embedding appropriate fonts in PDF.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/docx4j/src/main/java/org/docx4j/openpackaging/packages/WordprocessingMLPackage.java

    r163 r164  
    2121 
    2222 
    23 import java.io.File; 
    24 import java.io.FileOutputStream; 
    25 import java.io.IOException; 
    2623import java.io.OutputStream; 
    27 import java.nio.ByteBuffer; 
     24 
     25import java.util.Iterator; 
     26import java.util.Map; 
    2827 
    2928import javax.xml.bind.JAXBContext; 
    3029import javax.xml.bind.Marshaller; 
    31 import javax.xml.parsers.DocumentBuilderFactory; 
    32  
     30 
     31import org.apache.fop.fonts.EmbedFontInfo; 
    3332import org.apache.log4j.Logger; 
    3433import org.docx4j.fonts.Substituter; 
    3534import org.docx4j.jaxb.Context; 
    36 import org.docx4j.openpackaging.Base; 
    3735import org.docx4j.openpackaging.parts.DocPropsCorePart; 
    3836import org.docx4j.openpackaging.parts.DocPropsExtendedPart; 
    3937import org.docx4j.openpackaging.parts.Part; 
    40 import org.docx4j.openpackaging.parts.PartName; 
    4138import org.docx4j.openpackaging.parts.WordprocessingML.FontTablePart; 
    4239import org.docx4j.openpackaging.parts.WordprocessingML.GlossaryDocumentPart; 
    4340import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; 
    4441import org.docx4j.openpackaging.parts.relationships.Namespaces; 
    45 import org.docx4j.openpackaging.parts.relationships.RelationshipsPart; 
    4642 
    4743import org.docx4j.openpackaging.contenttype.ContentType; 
    4844import org.docx4j.openpackaging.contenttype.ContentTypeManager; 
    49 import org.docx4j.openpackaging.contenttype.ContentTypeManagerImpl; 
    5045import org.docx4j.openpackaging.contenttype.ContentTypes; 
    5146import org.docx4j.openpackaging.exceptions.Docx4JException; 
     
    269264                // 2.  For each font, find the closest match on the system (use OO's VCL.xcu to do this) 
    270265                //     - do this in a general way, since docx4all needs this as well to display fonts            
    271                 Substituter s = new Substituter(); 
     266                fontSubstituter = new Substituter(); 
    272267                FontTablePart fontTablePart= this.getMainDocumentPart().getFontTablePart();              
    273268                org.docx4j.wml.Fonts fonts = (org.docx4j.wml.Fonts)fontTablePart.getJaxbElement();               
    274269                 
    275                 s.populateFontMappings(fontsInUse, fonts); 
     270                fontSubstituter.populateFontMappings(fontsInUse, fonts); 
    276271                 
    277272                // 3.  Ensure that the font names in the XHTML have been mapped to these matches 
    278273                //     possibly via an extension function in the XSLT 
    279                 xformer.setParameter("substituterInstance", s); 
     274                xformer.setParameter("substituterInstance", fontSubstituter); 
    280275                xformer.setParameter("fontFamilyStack", fontFamilyStack); 
    281276                 
     
    292287    } 
    293288 
     289    private Substituter fontSubstituter; 
     290     
    294291        /** Create a pdf version of the document.  
    295292         *  
     
    331328                 
    332329                        // See https://xhtmlrenderer.dev.java.net/r7/users-guide-r7.html#xil_32 
    333                 org.xhtmlrenderer.extend.FontResolver resolver = renderer.getFontResolver(); 
    334                  
    335                 log.info("OS: " + System.getProperty("os.name") ); 
    336                 if (System.getProperty("os.name").toUpperCase().indexOf("WINDOWS")>-1) { 
    337                         log.info("Detected Windows - "); 
    338                         renderer.getFontResolver().addFont("C:\\WINDOWS\\FONTS\\ARIAL.TTF", true); 
    339                         renderer.getFontResolver().addFont("C:\\WINDOWS\\FONTS\\COMIC.TTF", true); 
    340                         renderer.getFontResolver().addFont("C:\\WINDOWS\\FONTS\\TREBUC.TTF", true); 
    341                         renderer.getFontResolver().addFont("C:\\WINDOWS\\FONTS\\VERDANA.TTF", true); 
    342                          
    343                 } 
     330                org.xhtmlrenderer.extend.FontResolver resolver = renderer.getFontResolver();             
     331                                 
     332                Map fontMappings = fontSubstituter.getFontMappings(); 
     333                Iterator fontMappingsIterator = fontMappings.entrySet().iterator(); 
     334            while (fontMappingsIterator.hasNext()) { 
     335                Map.Entry pairs = (Map.Entry)fontMappingsIterator.next(); 
     336                if(pairs.getKey()==null) { 
     337                        log.info("Skipped null key"); 
     338                        pairs = (Map.Entry)fontMappingsIterator.next(); 
     339                } 
     340                 
     341                String fontName = (String)pairs.getKey(); 
     342                Substituter.FontMapping fm = (Substituter.FontMapping)pairs.getValue(); 
     343                 
     344                        log.info("Substituting " + fontName + " with " + fm.getTripletName() + " from " + fm.getEmbeddedFile() ); 
     345                        if (fm.getEmbeddedFile()!=null) { 
     346                                try { 
     347                                        renderer.getFontResolver().addFont(fm.getEmbeddedFile(), true); 
     348                                } catch (com.lowagie.text.DocumentException e) { 
     349                                        /* 
     350                                         * com.lowagie.text.DocumentException: file:/usr/share/fonts/truetype/ttf-tamil-fonts/lohit_ta.ttf cannot be embedded due to licensing restrictions. 
     351                                                at com.lowagie.text.pdf.TrueTypeFont.<init>(TrueTypeFont.java:364) 
     352                                                at com.lowagie.text.pdf.TrueTypeFont.<init>(TrueTypeFont.java:335) 
     353                                                at com.lowagie.text.pdf.BaseFont.createFont(BaseFont.java:399) 
     354                                                at com.lowagie.text.pdf.BaseFont.createFont(BaseFont.java:345) 
     355                                                at org.xhtmlrenderer.pdf.ITextFontResolver.addFont(ITextFontResolver.java:164) 
     356                                         */ 
     357                                        log.warn(e.getMessage());  
     358                                } catch (java.io.IOException e) { 
     359                                 
     360                                /*  
     361                                 * [AWT-EventQueue-0] INFO  packages.WordprocessingMLPackage - Substituting symbol with standardsymbolsl from file:/usr/share/fonts/type1/gsfonts/s050000l.pfb  
     362java.io.IOException: Unsupported font type 
     363        at org.xhtmlrenderer.pdf.ITextFontResolver.addFont(ITextFontResolver.java:199) 
     364                                 */ 
     365                                        log.warn(e.getMessage() + ": " + fm.getEmbeddedFile());  
     366                                } 
     367                        } else { 
     368                                log.warn("Can't addFont for: " + fontName);  
     369                        } 
     370            } 
    344371                 
    345372                renderer.setDocument(xhtmlDoc, null); 
Note: See TracChangeset for help on using the changeset viewer.