Apache POI HWPF - проблема при конвертации doc файла в pdf
В настоящее время я работаю над проектом Java с использованием apache poi. Теперь в моем проекте я хочу конвертировать файл DOC в файл PDF. Преобразование выполнено успешно, но я получаю только текст в формате PDF, но не текстовый стиль и цвет текста. Мой PDF-файл выглядит как черно-белый. В то время как мой файл документа окрашен и имеет другой стиль текста.
Это мой код,
POIFSFileSystem fs = null;
Document document = new Document();
try {
System.out.println("Starting the test");
fs = new POIFSFileSystem(new FileInputStream("/document/test2.doc"));
HWPFDocument doc = new HWPFDocument(fs);
WordExtractor we = new WordExtractor(doc);
OutputStream file = new FileOutputStream(new File("/document/test.pdf"));
PdfWriter writer = PdfWriter.getInstance(document, file);
Range range = doc.getRange();
document.open();
writer.setPageEmpty(true);
document.newPage();
writer.setPageEmpty(true);
String[] paragraphs = we.getParagraphText();
for (int i = 0; i < paragraphs.length; i++) {
org.apache.poi.hwpf.usermodel.Paragraph pr = range.getParagraph(i);
// CharacterRun run = pr.getCharacterRun(i);
// run.setBold(true);
// run.setCapitalized(true);
// run.setItalic(true);
paragraphs[i] = paragraphs[i].replaceAll("\\cM?\r?\n", "");
System.out.println("Length:" + paragraphs[i].length());
System.out.println("Paragraph" + i + ": " + paragraphs[i].toString());
// add the paragraph to the document
document.add(new Paragraph(paragraphs[i]));
}
System.out.println("Document testing completed");
} catch (Exception e) {
System.out.println("Exception during test");
e.printStackTrace();
} finally {
// close the document
document.close();
}
}
Помогите мне, пожалуйста.
Спасибо заранее.
2 ответа
Если вы посмотрите на Apache Tika, есть хороший пример чтения информации о стиле из документа HWPF. Код в Tika генерирует HTML на основе содержимого HWPF, но вы должны обнаружить, что что-то очень похожее работает для вашего случая.
Одна вещь, которую следует отметить в документах Word, это то, что ко всем в любом символьном прогоне применяется одинаковое форматирование. Таким образом, абзац состоит из одного или нескольких наборов символов. Некоторые стили применяются к абзацу, а другие части выполняются на ходу. В зависимости от того, какое форматирование вас интересует, оно может быть в абзаце или в прогоне
Если вы используете WordExtractor, вы получите только текст. Попробуйте использовать CharacterRun
учебный класс. Вы получите стиль вместе с текстом. Пожалуйста, ознакомьтесь с примером кода.
Range range = doc.getRange();
for (int i = 0; i < range.numParagraphs(); i++) {
org.apache.poi.hwpf.usermodel.Paragraph poiPara = range.getParagraph(i);
int j = 0;
while (true) {
CharacterRun run = poiPara.getCharacterRun(j++);
System.out.println("Color "+run.getColor());
System.out.println("Font size "+run.getFontSize());
System.out.println("Font Name "+run.getFontName());
System.out.println(run.isBold()+" "+run.isItalic()+" "+run.getUnderlineCode());
System.out.println("Text is "+run.text());
if (run.getEndOffset() == poiPara.getEndOffset()) {
break;
}
}
}