Java iText HTML到PDF<;预处理>;块格式化
我正在使用iText将HTML文件结构转换为PDF。我的HTML文件包含Java iText HTML到PDF<;预处理>;块格式化,java,html,pdf,itext,Java,Html,Pdf,Itext,我正在使用iText将HTML文件结构转换为PDF。我的HTML文件包含块中的代码片段,但iText并没有保留它们的格式 <something> <somethingelse> some content </somethingelse> </something> 我的块示例: <something> <somethingelse> some content </somethingelse&
块中的代码片段,但iText并没有保留它们的格式
<something>
<somethingelse>
some content
</somethingelse>
</something>
我的
块示例:
<something> <somethingelse> some content </somethingelse> </something>
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();
一些内容
这是iText输出到PDF的内容:
[...]
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);
[...]
一些内容
有没有办法将iText配置为正确的格式
我的iText代码段:
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();
}
}
FileOutputStream os=newfileoutputstream(…);
文档文档=新文档(PageSize.A4);
PdfWriter writer=PdfWriter.getInstance(doc,os);
CSSResolver CSSResolver=XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
HtmlPipelineContext htmlContext=新的HtmlPipelineContext();
setTagFactory(Tags.getHtmlTagProcessorFactory());
htmlContext.setImageProvider(新的AbstractImageProvider(){
公共字符串getImageRootPath(){
...
}
});
管道管道=新的cssResolver管道(cssResolver,
新的HtmlPipeline(htmlContext,
新的PdfWriterPipeline(文档、编写器));
XMLWorker=newxmlworker(管道,true);
XMLParser=新的XMLParser(worker);
doc.open();
用于(字符串输入文件:输入文件){
parse(新文件inputstream(inputFile),StandardCharsets.UTF_8);
}
doc.close();
您可以实现自己的TagProcessor并在TagProcessor工厂注册:
<pre>
<code>
...
</code>
</pre>
[…]
HtmlPipelineContext htmlContext=新的HtmlPipelineContext(null);
TagProcessorFactory tagFactory=Tags.getHtmlTagProcessorFactory();
tagFactory.addProcessor(新的TagProcessor(){
@凌驾
公共列表startElement(WorkerContext ctx,标签标签){
返回null;
}
@凌驾
公共列表内容(WorkerContext ctx、标记、字符串内容){
返回null;
}
@凌驾
公共列表endElement(WorkerContext ctx、标记标签、列表当前内容){
返回null;
}
@凌驾
公共布尔值所有者(){
返回false;
}
},“pre”);
htmlContext.setTagFactory(tagFactory);
[...]
然后可以使用Tag对象创建iText元素,并将它们返回到列表对象中。如何格式化和处理内容完全取决于您。以下代码段(基于您的代码段和)创建一个包含
块的PDF
<pre>
...
</pre>
String text = FileUtils.readFileToString(file);
text = text.replaceAll("\\<code(.*?)\\>", "");
text = text.replaceAll("\\</code\\>", "");
FileUtils.writeStringToFile(file, text);
public类HtmlToPdf{
//需要执行适当的异常处理
公共静态void main(字符串[]args)引发异常{
文件=新文件(页面大小为A4);
PdfWriter PdfWriter=PdfWriter.getInstance(文档,
新文件输出流(“r:/temp/testpdf.pdf”)
);
CSSResolver CSSResolver=XMLWorkerHelper.getInstance()
.getDefaultCssResolver(true);
HtmlPipelineContext htmlContext=新的HtmlPipelineContext(null);
setTagFactory(Tags.getHtmlTagProcessorFactory());
管道管道=新的cssResolver管道(cssResolver,
新的HtmlPipeline(htmlContext,
新的PdfWriterPipeline(文档,pdfWriter)
)
);
XMLWorker=newxmlworker(管道,true);
XMLParser=新的XMLParser(worker);
document.open();
字符串str=“\n”
+“\n”
+“\n”
+“示例html\n”
+“\n”
+“\n”
+“示例文本\n”
+“\n”
+“某些东西\n”
+“某些东西\n”
+“某些内容\n”
+“/somethingelse\n”
+“/something\n”
+“\n”
+“\n”
+ "";
parse(新的StringReader(str));
document.close();
}
}
我的代码是正确的。不正确的是我试图转换的HTML。看起来像
而不是
FileUtils
是组织的一部分。阿帕奇。平民io
回答你的问题:我肯定是的。你使用什么代码?@次优编辑了我的问题。看一下我的答案。可能在您的输入中,
没有在
块中转义。我还没有找到一个示例来帮助我理解TagProcessor的用法。