나는 아파치 포이 (poi poi)를 사용하여 HTML 문서로 변환하는 ms 워드 문서 파일을 가지고있다. 아파치 poi 변환기의 인코딩 문제
이
내가InputStream input = new FileInputStream (path);
HWPFDocument wordDocument = new HWPFDocument (input);
WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter (DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
List<Picture> pics = wordDocument.getPicturesTable().getAllPictures();
if (pics != null)
{
for (int i = 0; i <pics.size(); i++)
{
Picture pic = (Picture) pics.get (i);
try
{
pic.writeImageContent (new FileOutputStream (path + pic.hashCode() + '.' + pic.suggestFileExtension()));
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
}
}
wordToHtmlConverter.setPicturesManager (new PicturesManager()
{
public String savePicture (byte[] content, PictureType pictureType, String suggestedName, float widthInches, float heightInches)
{
for(Picture picName:pics)
{
return Integer.toString(picName.hashCode()) + '.' + picName.suggestFileExtension();
}
return null;
}
});
wordToHtmlConverter.processDocument(wordDocument);
Document htmlDocument = wordToHtmlConverter.getDocument();
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
DOMSource domSource = new DOMSource(htmlDocument);
StreamResult streamResult = new StreamResult (outStream);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer serializer = tf.newTransformer();
serializer.setOutputProperty (OutputKeys.ENCODING, "gbk");
serializer.setOutputProperty (OutputKeys.INDENT, "yes");
serializer.setOutputProperty (OutputKeys.METHOD, "html");
serializer.transform (domSource, streamResult);
outStream.close();
String html = new String (outStream.toByteArray());
코드는 잘 작동을하고 있는데 코드, 그것은 이미지와 스타일을 유지합니다. 그러나 html의 일부 문자에 문제가있는 것 같습니다. 제대로 인코딩되지 않았습니다. 예를 들어 원본 .doc 파일의 일부 글 머리 스타일이 올바르게 출력되지 않습니다. 나는 여러 글자 세트 (ASCII, UTF-8, gbk ...)를 시도했는데 모두 글 머리 점을 올바르게 생성하지 못했다.
인코딩 때문에 총알이 횡설수설하고 있다고 확신합니다 (%). 누구든지 아파치로 이런 문제를 보았습니까?
나는이 접근법을 시도해 보았다. 이전과 같이 최종 HTML 페이지에서 동일한 결함이있는 결과를 얻었다. – Acidburn73
그런 다음 Word에서 다른 글 머리 기호를 사용하고 있습니다. '//System.out.println((int)bulletText.charAt(0));'의 주석을 제거하고 어떤 문자 코드가 사용되었는지 살펴보고 그것을 16 진수로 변환하고 "\ u ...."문자를 대체하십시오. . –