从 HTML 转换为 DocX 时如何处理特殊字符
How to handle special characters when converting from HTML to DocX
我有一个应用程序可以使用 DocX4J 将 html 文件转换为 DocX。
我在使用 ç、á、é、í、ã 等特殊字符时遇到问题。
我在 html 文件中的文本字体是 Arial,但是当我将它们转换为 DocX 时,前面提到的特殊字符被设置为 calibri 字体。因此,在同一个词中(例如 Cláudio),我用 Arial 字体写 "Cl",用 Calibri 字体写“á”字符,用 Arial 字体写 "udio"。
我看到也许我必须在 w:r 中设置字体 属性,但我很难理解如何对所有已转换的文本进行设置。此外,我在下面列出的转换代码中看不到如何执行此操作(带有示例 html)。
关于如何进行此转换和处理这些特殊字符的任何提示或建议都非常棒。
干杯。
public WordprocessingMLPackage export(String xhtml) {
WordprocessingMLPackage wordMLPackage = null;
try {
wordMLPackage = WordprocessingMLPackage.createPackage();
XHTMLImporter importer = new XHTMLImporterImpl(wordMLPackage);
List<Object> content = importer.convert(xhtml,null);
wordMLPackage.getMainDocumentPart().getContent().addAll(content);
}
catch (Docx4JException e) {
// ...
}
return wordMLPackage;
}
<html>
<head>
<meta charset="ISO-8859-1" />
<style type="text/css">
h1 {
page-break-before: always;
}
p, h1 {
font-family: Arial;
font-size: 12pt;
}
p {
line-height: 150%;
}
h1 {
font-weight: bold;
line-height: 130%
}
</style>
</head>
<body>
<h1>RESUMO<br /></h1>
<p>
<span>Um resumo para o relatório.</span><br />
</p>
</body>
</html>
根据 JasonPlutext 的提示,我在 DocX4J 论坛 (http://www.docx4java.org/forums/docx-java-f6/docx-to-html-and-back-to-docx-t1913.html) 找到了一个如何将字体映射到 XHTMLImporter 的示例。
现在我的代码可以运行了!
请参阅下面的最终版本。
public WordprocessingMLPackage export(String xhtml) {
WordprocessingMLPackage wordMLPackage = null;
try {
RFonts arialRFonts = Context.getWmlObjectFactory().createRFonts();
arialRFonts.setAscii("Arial");
arialRFonts.setHAnsi("Arial");
XHTMLImporterImpl.addFontMapping("Arial", arialRFonts);
wordMLPackage = WordprocessingMLPackage.createPackage();
XHTMLImporter importer = new XHTMLImporterImpl(wordMLPackage);
List<Object> content = importer.convert(xhtml,null);
wordMLPackage.getMainDocumentPart().getContent().addAll(content);
}
catch (Docx4JException e) {
// ...
}
return wordMLPackage;
}
我有一个应用程序可以使用 DocX4J 将 html 文件转换为 DocX。 我在使用 ç、á、é、í、ã 等特殊字符时遇到问题。 我在 html 文件中的文本字体是 Arial,但是当我将它们转换为 DocX 时,前面提到的特殊字符被设置为 calibri 字体。因此,在同一个词中(例如 Cláudio),我用 Arial 字体写 "Cl",用 Calibri 字体写“á”字符,用 Arial 字体写 "udio"。
我看到也许我必须在 w:r 中设置字体 属性,但我很难理解如何对所有已转换的文本进行设置。此外,我在下面列出的转换代码中看不到如何执行此操作(带有示例 html)。
关于如何进行此转换和处理这些特殊字符的任何提示或建议都非常棒。
干杯。
public WordprocessingMLPackage export(String xhtml) {
WordprocessingMLPackage wordMLPackage = null;
try {
wordMLPackage = WordprocessingMLPackage.createPackage();
XHTMLImporter importer = new XHTMLImporterImpl(wordMLPackage);
List<Object> content = importer.convert(xhtml,null);
wordMLPackage.getMainDocumentPart().getContent().addAll(content);
}
catch (Docx4JException e) {
// ...
}
return wordMLPackage;
}
<html>
<head>
<meta charset="ISO-8859-1" />
<style type="text/css">
h1 {
page-break-before: always;
}
p, h1 {
font-family: Arial;
font-size: 12pt;
}
p {
line-height: 150%;
}
h1 {
font-weight: bold;
line-height: 130%
}
</style>
</head>
<body>
<h1>RESUMO<br /></h1>
<p>
<span>Um resumo para o relatório.</span><br />
</p>
</body>
</html>
根据 JasonPlutext 的提示,我在 DocX4J 论坛 (http://www.docx4java.org/forums/docx-java-f6/docx-to-html-and-back-to-docx-t1913.html) 找到了一个如何将字体映射到 XHTMLImporter 的示例。
现在我的代码可以运行了! 请参阅下面的最终版本。
public WordprocessingMLPackage export(String xhtml) {
WordprocessingMLPackage wordMLPackage = null;
try {
RFonts arialRFonts = Context.getWmlObjectFactory().createRFonts();
arialRFonts.setAscii("Arial");
arialRFonts.setHAnsi("Arial");
XHTMLImporterImpl.addFontMapping("Arial", arialRFonts);
wordMLPackage = WordprocessingMLPackage.createPackage();
XHTMLImporter importer = new XHTMLImporterImpl(wordMLPackage);
List<Object> content = importer.convert(xhtml,null);
wordMLPackage.getMainDocumentPart().getContent().addAll(content);
}
catch (Docx4JException e) {
// ...
}
return wordMLPackage;
}