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

时间:2017-05-30 12:27:10

标签: java pdf docx4j

我使用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 = "<html>Hello</html>";
        String content = "<html>पासवर्ड</html>";

        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中用####代替马拉地文本。

1 个答案:

答案 0 :(得分:0)

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

默认使用Plutext的PDF Converter。如果链接到的mangal字体安装在Conveter中,并在docx中指定:

,则情况有效
  <w:r>
    <w:rPr>
      <w:rFonts w:ascii="mangal" w:eastAsia="mangal" w:hAnsi="mangal" w:cs="mangal"/>
    </w:rPr>
    <w:t>पासवर्ड</w:t>
  </w:r>

同样适用于Arial Unicode MS。

另一种方式是通过XSL FO的PDF;见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   注入合适的字体映射。