diff -urN xml-fop.orig/src/org/apache/fop/pdf/PDFDocument.java xml-fop/src/org/apache/fop/pdf/PDFDocument.java
--- xml-fop.orig/src/org/apache/fop/pdf/PDFDocument.java	Sun Aug  5 15:53:57 2001
+++ xml-fop/src/org/apache/fop/pdf/PDFDocument.java	Sun Aug  5 15:54:20 2001
@@ -18,6 +18,7 @@
 import org.apache.fop.datatypes.ColorSpace;
 
 import org.apache.fop.render.pdf.CIDFont;
+import org.apache.fop.render.pdf.fonts.LazyFont;
 
 import org.apache.fop.datatypes.IDReferences;
 import org.apache.fop.layout.Page;
@@ -813,7 +814,12 @@
             font.setDescriptor(pdfdesc);
 
             if (subtype == PDFFont.TYPE0) {
-                CIDFont cidMetrics = (CIDFont)metrics;
+                CIDFont cidMetrics;
+                if(metrics instanceof LazyFont){
+                    cidMetrics = (CIDFont) ((LazyFont) metrics).getRealFont();
+                }else{
+                    cidMetrics = (CIDFont)metrics;
+                }
                 PDFCIDSystemInfo sysInfo =
                     new PDFCIDSystemInfo(cidMetrics.getRegistry(),
                                          cidMetrics.getOrdering(),
diff -urN xml-fop.orig/src/org/apache/fop/render/pdf/FontSetup.java xml-fop/src/org/apache/fop/render/pdf/FontSetup.java
--- xml-fop.orig/src/org/apache/fop/render/pdf/FontSetup.java	Sun Aug  5 15:53:57 2001
+++ xml-fop/src/org/apache/fop/render/pdf/FontSetup.java	Sun Aug  5 15:54:20 2001
@@ -156,11 +156,17 @@
                 if (metricsFile != null) {
                     internalName = "F" + num;
                     num++;
+                    /*
                     reader = new FontReader(metricsFile);
                     reader.useKerning(configFontInfo.getKerning());
                     reader.setFontEmbedPath(configFontInfo.getEmbedFile());
                     fontInfo.addMetrics(internalName, reader.getFont());
-
+                    */
+                    LazyFont font = new LazyFont(configFontInfo.getEmbedFile(),
+                                                 metricsFile,
+                                                 configFontInfo.getKerning());
+                    fontInfo.addMetrics(internalName, font);
+                    
                     Vector triplets = configFontInfo.getFontTriplets();
                     for (Enumeration t = triplets.elements();
                             t.hasMoreElements(); ) {
diff -urN xml-fop.orig/src/org/apache/fop/render/pdf/PDFRenderer.java xml-fop/src/org/apache/fop/render/pdf/PDFRenderer.java
--- xml-fop.orig/src/org/apache/fop/render/pdf/PDFRenderer.java	Sun Aug  5 15:53:57 2001
+++ xml-fop/src/org/apache/fop/render/pdf/PDFRenderer.java	Sun Aug  5 15:54:20 2001
@@ -22,6 +22,7 @@
 import org.apache.fop.image.*;
 import org.apache.fop.extensions.*;
 import org.apache.fop.datatypes.IDReferences;
+import org.apache.fop.render.pdf.fonts.LazyFont;
 
 import org.apache.batik.bridge.*;
 import org.apache.batik.swing.svg.*;
@@ -487,8 +488,13 @@
             boolean useMultiByte = false;
             Font f =
                 (Font)area.getFontState().getFontInfo().getFonts().get(name);
-            if (f instanceof CIDFont)
+            if (f instanceof LazyFont){
+                if(((LazyFont) f).getRealFont() instanceof CIDFont){
+                    useMultiByte = true;
+                }
+            }else if (f instanceof CIDFont){
                 useMultiByte = true;
+            }
             // String startText = useMultiByte ? "<FEFF" : "(";
             String startText = useMultiByte ? "<" : "(";
             String endText = useMultiByte ? "> " : ") ";
diff -urN xml-fop.orig/src/org/apache/fop/render/pdf/fonts/LazyFont.java xml-fop/src/org/apache/fop/render/pdf/fonts/LazyFont.java
--- xml-fop.orig/src/org/apache/fop/render/pdf/fonts/LazyFont.java	Thu Jan  1 09:00:00 1970
+++ xml-fop/src/org/apache/fop/render/pdf/fonts/LazyFont.java	Sun Aug  5 16:00:04 2001
@@ -0,0 +1,176 @@
+/*
+ * $Id$
+ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
+ * For details on use and redistribution please refer to the
+ * LICENSE file included with these sources.
+ */
+
+package org.apache.fop.render.pdf.fonts;
+
+import org.apache.fop.render.pdf.Font;
+import org.apache.fop.layout.FontDescriptor;
+import org.apache.fop.pdf.PDFStream;
+import org.apache.fop.messaging.MessageHandler;
+import java.util.Hashtable;
+
+import org.apache.fop.render.pdf.FontReader;
+
+public class LazyFont extends Font implements FontDescriptor {
+    
+    public String metricsFileName = null;
+    public String fontEmbedPath = null;
+    public boolean useKerning = false;
+    
+    private boolean isMetricsLoaded = false;
+    private Font realFont = null;
+    private FontDescriptor realFontDescriptor = null;
+    
+    public LazyFont(String fontEmbedPath, String metricsFileName, boolean useKerning){
+        this.metricsFileName = metricsFileName;
+        this.fontEmbedPath = fontEmbedPath;
+        this.useKerning = useKerning;
+    }
+    
+    private void load(){
+        if(! isMetricsLoaded){
+            try{
+                FontReader reader = new FontReader(metricsFileName);
+                reader.useKerning(useKerning);
+                reader.setFontEmbedPath(fontEmbedPath);
+                realFont = reader.getFont();
+                if(realFont instanceof FontDescriptor){
+                    realFontDescriptor = (FontDescriptor) realFont;
+                }
+                isMetricsLoaded = true;
+                // System.out.println("Metrics " + metricsFileName + " loaded.");
+            } catch (Exception ex) {
+                MessageHandler.error("Failed to read font metrics file "
+                                     + metricsFileName
+                                     + " : " + ex.getMessage());
+            }
+        }
+    }
+    
+    public Font getRealFont(){
+        return realFont;
+    }
+    
+    // Font
+    public String encoding(){
+        load();
+        return realFont.encoding();
+    }
+    
+    public String fontName(){
+        load();
+        return realFont.fontName();
+    }
+    
+    public byte getSubType(){
+        load();
+        return realFont.getSubType();
+    }
+    
+    public char mapChar(char c){
+        load();
+        return realFont.mapChar(c);
+    }
+    
+    // FontMetrics
+    public int getAscender(int size){
+        load();
+        return realFont.getAscender(size);
+    }
+    
+    public int getCapHeight(int size){
+        load();
+        return realFont.getCapHeight(size);
+    }
+    
+    public int getDescender(int size){
+        load();
+        return realFont.getDescender(size);
+    }
+    
+    public int getXHeight(int size){
+        load();
+        return realFont.getXHeight(size);
+    }
+    
+    public int getFirstChar(){
+        load();
+        return realFont.getFirstChar();
+    }
+    
+    public int getLastChar(){
+        load();
+        return realFont.getLastChar();
+    }
+    
+    public int width(int i, int size){
+        load();
+        return realFont.width(i, size);
+    }
+    
+    public int[] getWidths(int size){
+        load();
+        return realFont.getWidths(size);
+    }
+    
+    // FontDescriptor
+    public int getCapHeight(){
+        load();
+        return realFontDescriptor.getCapHeight();
+    }
+    
+    public int getDescender(){
+        load();
+        return realFontDescriptor.getDescender();
+    }
+    
+    public int getAscender(){
+        load();
+        return realFontDescriptor.getAscender();
+    }
+    
+    public int getFlags(){
+        load();
+        return realFontDescriptor.getFlags();
+    }
+    
+    public int[] getFontBBox(){
+        load();
+        return realFontDescriptor.getFontBBox();
+    }
+    
+    public int getItalicAngle(){
+        load();
+        return realFontDescriptor.getItalicAngle();
+    }
+    
+    public int getStemV(){
+        load();
+        return realFontDescriptor.getStemV();
+    }
+        
+    public boolean hasKerningInfo(){
+        load();
+        return realFontDescriptor.hasKerningInfo();
+    }
+    
+    public Hashtable getKerningInfo(){
+        load();
+        return realFontDescriptor.getKerningInfo();
+    }
+    
+    public boolean isEmbeddable(){
+        load();
+        return realFontDescriptor.isEmbeddable();
+    }
+    
+    public PDFStream getFontFile(int objNum){
+        load();
+        return realFontDescriptor.getFontFile(objNum);
+    }
+}
+

