2013-05-31 5 views
1

Я хотел бы преобразовать все шрифты, встроенные или иным образом, из PDF в другой шрифт с помощью iText. Я понимаю, что линейная высота, кернинг и куча других вещей будут испорчены, но это я действительно не против, насколько уродливый выход.Заменить шрифты в PDF с помощью iText (Java)

Я видел, как встроить шрифты в существующие pdf-файлы here, но я не знаю, как установить ВСЕ СУЩЕСТВУЮЩИЙ текст в документе на этот шрифт.

Я понимаю, что это не так просто, как я это делаю. Возможно, было бы проще просто взять весь необработанный текст из документа и создать новый документ с использованием нового шрифта (опять же, макет/читаемость для меня не проблема)

+0

Прежде всего, вы уверены, что ваш исходный документ содержит информацию, необходимую для этой замены? Если текущие внедренные шрифты используют пользовательскую кодировку без дополнительной информации, программное обеспечение не имеет представления о том, какие оригинальные коды глифов заменить на какой из новых шрифтов. – mkl

+0

@mkl, к сожалению, нет, это случайные файлы. Я понимаю, что невозможно преобразовать эти файлы так, как я хочу, но если бы я мог получить другой вид, это было бы здорово –

ответ

0

Пример EmbedFontPostFacto.java из главы 16 iText in Action — 2nd Edition показывает, как внедрить первоначально не встроенный шрифт. Центральный метод заключается в следующем:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
    // the font file 
    RandomAccessFile raf = new RandomAccessFile(FONT, "r"); 
    byte fontfile[] = new byte[(int)raf.length()]; 
    raf.readFully(fontfile); 
    raf.close(); 
    // create a new stream for the font file 
    PdfStream stream = new PdfStream(fontfile); 
    stream.flateCompress(); 
    stream.put(PdfName.LENGTH1, new PdfNumber(fontfile.length)); 
    // create a reader object 
    PdfReader reader = new PdfReader(RESULT1); 
    int n = reader.getXrefSize(); 
    PdfObject object; 
    PdfDictionary font; 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(RESULT2)); 
    PdfName fontname = new PdfName(FONTNAME); 
    for (int i = 0; i < n; i++) { 
     object = reader.getPdfObject(i); 
     if (object == null || !object.isDictionary()) 
      continue; 
     font = (PdfDictionary)object; 
     if (PdfName.FONTDESCRIPTOR.equals(font.get(PdfName.TYPE)) 
      && fontname.equals(font.get(PdfName.FONTNAME))) { 
      PdfIndirectObject objref = stamper.getWriter().addToBody(stream); 
      font.put(PdfName.FONTFILE2, objref.getIndirectReference()); 
     } 
    } 
    stamper.close(); 
    reader.close(); 
} 

Это (без теста fontname.equals(font.get(PdfName.FONTNAME))) может стать отправной точкой для простых случаев вашей задачи.

Вам нужно будет сделать довольно много тестов относительно кодирования и добавить отдельные переводы для более общего решения. Вы можете изучить раздел 9 Текст спецификации PDF ISO 32000-1 для этого.

Смежные вопросы