import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
import java.util.*;
import java.io.*;

public class emb_font {
    
    static PdfReader reader;
    static final PdfName F1 = new PdfName("FontFile");
    static final PdfName F2 = new PdfName("FontFile2");
    static final PdfName F3 = new PdfName("FontFile3");
    static PdfIndirectReference refNum;
    
    public static void processResource(PdfDictionary resource) throws Exception {
        if (resource == null)
            return;
        PdfDictionary xos = (PdfDictionary)reader.getPdfObject(resource.get(PdfName.XOBJECT));
        if (xos != null) {
            for (Iterator it = xos.getKeys().iterator(); it.hasNext();) {
                PdfDictionary xo = (PdfDictionary)reader.getPdfObject(xos.get((PdfName)it.next()));
                processResource((PdfDictionary)reader.getPdfObject(xo.get(PdfName.RESOURCES)
                ));
            }
        }
        PdfDictionary fonts = (PdfDictionary)reader.getPdfObject(resource.get(PdfName.FONT));
        if (fonts == null)
            return;
        for (Iterator it = fonts.getKeys().iterator(); it.hasNext();) {
            PdfDictionary font = (PdfDictionary)reader.getPdfObject(fonts.get((PdfName)it.next()));
            String name = ((PdfName)reader.getPdfObject(font.get(PdfName.BASEFONT))).toString();
            if (name.equals("/BookvarNormal")) {
                refNum = (PdfIndirectReference)font.get(PdfName.FONTDESCRIPTOR);
            }
        }
    }
    
    public static void main(String[] args) {
        try {
            reader = new PdfReader("c:\\russian_test.pdf");
            for (int k = 1; k <= reader.getNumberOfPages(); ++k) {
                PdfDictionary page = reader.getPageN(k);
                processResource((PdfDictionary)reader.getPdfObject(page.get(PdfName.RESOURCES)));
            }
            RandomAccessFile ff = new RandomAccessFile("c:\\bon.ttf", "r");
            byte font[] = new byte[(int)ff.length()];
            ff.readFully(font);
            ff.close();
            PdfStamper stp = new PdfStamper(reader, new FileOutputStream("c:\\russian_emb.pdf"));
            PdfStream stream = new PdfStream(font);
            stream.flateCompress();
            stream.put(PdfName.LENGTH1, new PdfNumber(font.length));
            PdfDictionary fdesc = (PdfDictionary)PdfReader.getPdfObject(refNum);
            PdfIndirectReference refFont = stp.getWriter().addToBody(stream).getIndirectReference();
            fdesc.put(PdfName.FONTFILE2, refFont);
            stp.close();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}