如何使用docx4j将带有马拉地语文本的HTML文本写入PDF文档?

我使用docx4j从HTML文本创建PDF文档。 HTML文本中包含一些英文和马拉地语文本。 英文文本在pdf中正确显示。 但是马拉地语文本没有显示在生成的pdf中。

它代替文本显示方框。

以下是我正在使用的代码。

import java.io.FileOutputStream; import org.docx4j.Docx4J; import org.docx4j.convert.in.xhtml.XHTMLImporterImpl; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; public class ConvertInXHTMLFragment { static String DEST_PDF = "/home/Downloads/Sample.pdf"; public static void main(String[] args) throws Exception { // String content = "Hello"; String content = "पासवर्ड"; WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage(); XHTMLImporterImpl XHTMLImporter = new XHTMLImporterImpl(wordMLPackage); wordMLPackage.getMainDocumentPart().getContent().addAll(XHTMLImporter.convert(content, null)); Docx4J.toPDF(wordMLPackage, new FileOutputStream(DEST_PDF)); } } 

编辑1: –

这是来自XSLFO的一个样本

 import java.io.OutputStream; import org.docx4j.Docx4J; import org.docx4j.convert.out.FOSettings; import org.docx4j.fonts.IdentityPlusMapper; import org.docx4j.fonts.Mapper; import org.docx4j.fonts.PhysicalFont; import org.docx4j.fonts.PhysicalFonts; import org.docx4j.model.fields.FieldUpdater; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.samples.AbstractSample; public class ConvertOutPDFviaXSLFO extends AbstractSample { static { inputfilepath = "/home/Downloads/100.docx";; saveFO = true; } static boolean saveFO; public static void main(String[] args) throws Exception { try { getInputFilePath(args); } catch (IllegalArgumentException e) { } String regex = null; PhysicalFonts.setRegex(regex); WordprocessingMLPackage wordMLPackage; System.out.println("Loading file from " + inputfilepath); wordMLPackage = WordprocessingMLPackage.load(new java.io.File(inputfilepath)); FieldUpdater updater = null; Mapper fontMapper = new IdentityPlusMapper(); wordMLPackage.setFontMapper(fontMapper); PhysicalFont font = PhysicalFonts.get("Arial Unicode MS"); fontMapper.put("Mangal", font); FOSettings foSettings = Docx4J.createFOSettings(); if (saveFO) { foSettings.setFoDumpFile(new java.io.File(inputfilepath + ".fo")); } foSettings.setWmlPackage(wordMLPackage); String outputfilepath; if (inputfilepath==null) { outputfilepath = System.getProperty("user.dir") + "/OUT_FontContent.pdf"; } else { outputfilepath = inputfilepath + ".pdf"; } OutputStream os = new java.io.FileOutputStream(outputfilepath); Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); System.out.println("Saved: " + outputfilepath); if (wordMLPackage.getMainDocumentPart().getFontTablePart()!=null) { wordMLPackage.getMainDocumentPart().getFontTablePart().deleteEmbeddedFontTempFiles(); } // This would also do it, via finalize() methods updater = null; foSettings = null; wordMLPackage = null; } } 

现在,我在输出PDF中用####代替马拉地语文本。

Docx4j v3.3通过2种完全不同的方式支持PDF输出。

默认是使用Plutext的PDF转换器。 如果链接到的mangal字体安装在Conveter中,并在docx中指定,则事情有效:

      पासवर्ड  

同样适用于Arial Unicode MS。

另一种方式是PDF格式的XSL FO; 请参阅https://github.com/plutext/docx4j-export-FO

如果你安装了相关的字体,它应该工作。 如果不这样做,那么您需要告诉它使用哪种字体。

例如,假设docx指定了我没有的mangal字体。 但我有Arial Unicode MS。 所以我告诉XSL FO进程使用它:

 fontMapper.put("mangal", PhysicalFonts.get("Arial Unicode MS")); 

请注意,您需要知道docx指定的字体,以及如何指定所需的字体。 要在XHTML导入中执行此操作,请从我之前的问题的答案中复制: –

字体由https://github.com/plutext/docx4j-ImportXHTML/blob/master/src/main/java/org/docx4j/convert/in/xhtml/FontHandler.java#L58处理

Marathi可能依赖于RFonts对象中的其他属性之一。 您需要查看工作docx才能看到。 您可以使用https://github.com/plutext/docx4j-ImportXHTML/blob/master/src/main/java/org/docx4j/convert/in/xhtml/FontHandler.java#L54来注入合适的字体映射。