Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java iText HTML到PDF<;预处理>;块格式化_Java_Html_Pdf_Itext - Fatal编程技术网

Java iText HTML到PDF<;预处理>;块格式化

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将HTML文件结构转换为PDF。我的HTML文件包含
块中的代码片段,但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"
                + "      &lt;something&gt;\n"
                + "        &lt;somethingelse&gt;\n"
                + "          some content\n"
                + "        &lt;/somethingelse&gt;\n"
                + "      &lt;/something&gt;\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的用法。