#java #itext #uitextrange
#java #itext #uitextrange
Вопрос:
Форматируется PDF, но он становится пустым, я хочу получить данные содержимого html в pdf без потери форматирования, поэтому я попробовал этот код в этом, только пустой pdf генерируется
package config;
import com.lowagie.text.DocumentException;
import org.apache.commons.io.FileUtils;
import org.docx4j.org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
public class removeHtmlTag {
public static void main(String [] args) throws DocumentException, IOException {
FileUtils.writeByteArrayToFile(new File("removeHtmlTag.pdf"), toPdf("<b>YouAAA gotta walk and don't look back</b>"));
}
/**
* Generate a PDF document
* @param html HTML as a string
* @return bytes of PDF document
*/
private static byte[] toPdf(String html) throws DocumentException, IOException {
final ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
renderer.layout();
try (ByteArrayOutputStream fos = new ByteArrayOutputStream(html.length())) {
renderer.createPDF(fos);
return fos.toByteArray();
}
}
}
Ответ №1:
Причина в том, что вы используете неправильный ITextRenderer из пакета docx4j. Docx4j предполагается использовать для обработки docx, а не для преобразования xhtml в PDF. Вы должны использовать, например, «Рендеринг PDF-файла Flying Saucer», в этом случае pdf подходит.
<!-- https://mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf -->
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.1.15</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-core -->
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-core</artifactId>
<version>9.1.15</version>
</dependency>
В этом случае импорт выполняется
import org.xhtmlrenderer.pdf.ITextRenderer;
Кроме того, лучше инкапсулировать строку xhtml в html-теги, например
StringBuilder sb = new StringBuilder();
sb.append("<html>").append(System.lineSeparator())
.append("<body>").append(System.lineSeparator())
.append("<b>YouAAA gotta walk and don't look back</b>").append(System.lineSeparator())
.append("</body>").append(System.lineSeparator())
.append("</html>");
Комментарии:
1. Получение этого исключения , Exception в потоке «main» java.lang. Ошибка NoClassDefFoundError: org/xhtmlrenderer/css/style/CssContext в config.removeHtmlTag.toPdf(removeHtmlTag.java:27) в config.removeHtmlTag.main(removeHtmlTag.java:18), вызванная: java.lang. Исключение ClassNotFoundException: org.xhtmlrenderer.css.style. CssContext в java.net.URLClassLoader.FindClass(неизвестный источник) в java.lang. ClassLoader.loadClass(неизвестный источник) в sun.разное. Запустите $AppClassLoader.loadClass(неизвестный источник) на java.lang. ClassLoader.loadClass(неизвестный источник) … еще 2
2. Что ж, я попробовал вызов, он сработал в моем проекте. Похоже, у вас нет класса org.xtmlrenderer.css.style. CssContex. По этой ссылке github.com/flyingsaucerproject/flyingsaucer/blob/master/… Добавьте еще один пакет maven flying-saucer-core, я добавил зависимость maven внутри ответа