I'm using iText to convert HTML file structure to PDF. My HTML files contain code snippets in <pre>
blocks, but iText doesn't leave them formatted as they are.
Example of my <pre>
block:
<something>
<somethingelse>
some content
</somethingelse>
</something>
This is what iText outputs to PDF:
<something> <somethingelse> some content </somethingelse> </something>
Is there a way to configure iText to format this correctly?
My iText code snippet:
FileOutputStream os = new FileOutputStream(...);
Document doc = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(doc, os);
CSSResolver cssResolver = XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
HtmlPipelineContext htmlContext = new HtmlPipelineContext();
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
htmlContext.setImageProvider(new AbstractImageProvider() {
public String getImageRootPath() {
...
}
});
Pipeline<?> pipeline = new CssResolverPipeline(cssResolver,
new HtmlPipeline(htmlContext,
new PdfWriterPipeline(doc, writer)));
XMLWorker worker = new XMLWorker(pipeline, true);
XMLParser parser = new XMLParser(worker);
doc.open();
for (String inputFile : inputFiles) {
parser.parse(new FileInputStream(inputFile), StandardCharsets.UTF_8);
}
doc.close();
答案 0 :(得分:1)
您可以实现自己的TagProcessor并在TagProcessorFactory上注册它:
[...]
HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
TagProcessorFactory tagFactory = Tags.getHtmlTagProcessorFactory();
tagFactory.addProcessor(new TagProcessor() {
@Override
public List<Element> startElement(WorkerContext ctx, Tag tag) {
return null;
}
@Override
public List<Element> content(WorkerContext ctx, Tag tag, String content) {
return null;
}
@Override
public List<Element> endElement(WorkerContext ctx, Tag tag, List<Element> currentContent) {
return null;
}
@Override
public boolean isStackOwner() {
return false;
}
}, "pre");
htmlContext.setTagFactory(tagFactory);
[...]
然后,您可以使用Tag对象创建iText元素并将其返回到List对象中。您如何格式化和处理内容完全取决于您。
答案 1 :(得分:1)
以下代码段(基于您的代码段和XMLWorker Documentation)会创建一个包含<pre>
块的PDF。
public class HtmlToPdf {
// proper exception handling needs to be implemented
public static void main(String[] args) throws Exception {
Document document = new Document(PageSize.A4);
PdfWriter pdfWriter = PdfWriter.getInstance(document,
new FileOutputStream("r:/temp/testpdf.pdf")
);
CSSResolver cssResolver = XMLWorkerHelper.getInstance()
.getDefaultCssResolver(true);
HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
Pipeline<?> pipeline = new CssResolverPipeline(cssResolver,
new HtmlPipeline(htmlContext,
new PdfWriterPipeline(document, pdfWriter)
)
);
XMLWorker worker = new XMLWorker(pipeline, true);
XMLParser parser = new XMLParser(worker);
document.open();
String str = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \n"
+ " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\" xml:lang=\"en\">\n"
+ " <head>\n"
+ " <title>sample html</title>\n"
+ " </head>\n"
+ " <body>\n"
+ " <h2>sample text</h2>\n"
+ " <pre>\n"
+ " <something>\n"
+ " <somethingelse>\n"
+ " some content\n"
+ " </somethingelse>\n"
+ " </something>\n"
+ " </pre>\n"
+ " </body>\n"
+ "</html>";
parser.parse(new StringReader(str));
document.close();
}
}