ho la necessità durante la conversione docx → pdf di forzare la sostituzione di un determinato font mancante(OpenSymbol) con un altro font (DejavuSans).
Per ottenere questo il risultato ho dovuto scrivere questo codice
in questo modo il font viene correttamente sostituito ma in questo modo tutti i font (non OpenSymbol) mancanti vengono sostituiti con il font DejavuSans.
Per risolvere il problema della sostituzione del font OpenSymbol con DejaVuSans senza influenzare gli altri font mancanti, segui questi passaggi:
Disabilita le sostituzioni generali: Assicurati di disabilitare le sostituzioni di font predefinite e quelle basate su configurazione, come hai già fatto nel tuo codice.
Configura la sostituzione specifica: Utilizza la sostituzione dei nomi dei font per specificare solo la sostituzione di OpenSymbol con DejaVuSans. Puoi farlo aggiungendo la sostituzione direttamente nella sezione di sostituzione dei nomi dei font.
Ecco un esempio di codice che potrebbe aiutarti:
// Disabilita le sostituzioni generali
doc.getFontSettings().getSubstitutionSettings().getDefaultFontSubstitution().setEnabled(false);
doc.getFontSettings().getSubstitutionSettings().getFontConfigSubstitution().setEnabled(false);
doc.getFontSettings().getSubstitutionSettings().getFontNameSubstitution().setEnabled(true); // Abilita solo la sostituzione dei nomi
doc.getFontSettings().getSubstitutionSettings().getFontInfoSubstitution().setEnabled(false);
doc.getFontSettings().getSubstitutionSettings().getTableSubstitution().setEnabled(false);
// Aggiungi la sostituzione specifica
doc.getFontSettings().getSubstitutionSettings().getFontNameSubstitution().addSubstitutes("OpenSymbol", "DejaVuSans");
In questo modo, solo il font OpenSymbol verrà sostituito con DejaVuSans, mentre gli altri font mancanti non verranno influenzati.
Ti invitiamo a implementare queste modifiche e a verificare se il problema è risolto. Se hai bisogno di ulteriore assistenza, non esitare a contattarmi!
@matteos È meglio cambiare il font nel documento prima della conversione. Puoi usare un codice come questo:
Document doc = new Document("C:\\Temp\\in.docx");
doc.accept(new FontChanger("OpenSymbol", "DejaVuSans"));
doc.save("C:\\Temp\\out.pdf");
public class FontChanger extends DocumentVisitor {
public FontChanger(String fontName, String changeFont) {
mFontName = fontName;
mChangeFont = changeFont;
}
/// <summary>
/// Called when a FieldEnd node is encountered in the document.
/// </summary>
@Override
public int visitFieldEnd(FieldEnd fieldEnd)
{
//Simply change font name
resetFont(fieldEnd.getFont());
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldSeparator node is encountered in the document.
/// </summary>
@Override
public int visitFieldSeparator(FieldSeparator fieldSeparator)
{
resetFont(fieldSeparator.getFont());
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FieldStart node is encountered in the document.
/// </summary>
@Override
public int visitFieldStart(FieldStart fieldStart)
{
resetFont(fieldStart.getFont());
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Footnote end is encountered in the document.
/// </summary>
@Override
public int visitFootnoteEnd(Footnote footnote)
{
resetFont(footnote.getFont());
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a FormField node is encountered in the document.
/// </summary>
@Override
public int visitFormField(FormField formField)
{
resetFont(formField.getFont());
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Paragraph end is encountered in the document.
/// </summary>
@Override
public int visitParagraphEnd(Paragraph paragraph)
{
resetFont(paragraph.getParagraphBreakFont());
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a Run node is encountered in the document.
/// </summary>
@Override
public int visitRun(Run run)
{
resetFont(run.getFont());
return VisitorAction.CONTINUE;
}
/// <summary>
/// Called when a SpecialChar is encountered in the document.
/// </summary>
@Override
public int visitSpecialChar(SpecialChar specialChar)
{
resetFont(specialChar.getFont());
return VisitorAction.CONTINUE;
}
private void resetFont(Font font)
{
if(font.getName().equals(mFontName)) {
font.setName(mChangeFont);
}
}
private String mFontName = "";
private String mChangeFont = "Arial";
}