2016-10-07 36 views
4

这是我的情况。我有一个HTML/CSS(CSS包含打印媒体属性,如@page,@bottom-center等)资源,它通过flying-saucer转换为PDF就好了。将html + css(打印介质)转换为java中的msword

现在,我需要将相同的资源也转换为msword(doc或docx)格式。

我尝试过使用docx4j-ImportXHTMLdocuments4j库,但不幸的是,我无法获得所需的结果,特别是样式表的打印介质属性。是否有任何需要完成的特殊设置或库不支持?理想情况下,我希望pdf和docx输出看起来几乎相同。

非常感谢

样品资源:

的pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.pleft</groupId> 
    <artifactId>html2word</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <dependencies> 
     <dependency> 
      <groupId>org.docx4j</groupId> 
      <artifactId>docx4j-ImportXHTML</artifactId> 
      <version>3.3.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.logging.log4j</groupId> 
      <artifactId>log4j-api</artifactId> 
      <version>2.7</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.logging.log4j</groupId> 
      <artifactId>log4j-core</artifactId> 
      <version>2.7</version> 
     </dependency> 

     <dependency> 
      <groupId>org.xhtmlrenderer</groupId> 
      <artifactId>flying-saucer-pdf</artifactId> 
      <version>9.0.6</version> 
     </dependency> 
    </dependencies> 

</project> 

Html2Word.java

import com.lowagie.text.DocumentException; 
import org.docx4j.convert.in.xhtml.XHTMLImporterImpl; 
import org.docx4j.openpackaging.exceptions.Docx4JException; 
import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 
import org.xhtmlrenderer.pdf.ITextRenderer; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 

public class Html2Word { 
    public static void main(String[] args) throws Docx4JException, IOException, DocumentException { 

     WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage(); 

     XHTMLImporterImpl XHTMLImporter = new XHTMLImporterImpl(wordMLPackage); 
     final File file = new File("sample.html"); 
     wordMLPackage.getMainDocumentPart().getContent().addAll(
       XHTMLImporter.convert(file, null)); 
     wordMLPackage.save(new File("sample.docx")); 

     ITextRenderer renderer = new ITextRenderer(); 
     renderer.setDocument(file); 
     renderer.layout(); 
     renderer.createPDF(new FileOutputStream(new File("sample.pdf"))); 

    } 
} 

样本html的

<!--?xml version="1.0" encoding="UTF-8"?--><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>SAMPLE</title> 
    <style> 
    @page { 
     size: A4 landscape; 
     margin: 3.8cm 2.0cm 1.5cm 1.5cm; 

     @top-center { 
      content: element(header); 
     } 

     @bottom-center { 
      content: element(footer); 
     } 
    } 

    @page :first { 
     margin-bottom: 3.0cm; 

     @bottom-center { 
      content: element(firstPageFooter); 
     } 
    } 
    #header { 
     position: running(header); 
    } 

    #pagenumber:before { 
     content: counter(page); 
    } 

    #pagecount:before { 
     content: counter(pages); 
    } 

    #footer { 
     text-align: center; 
     position: running(footer); 
    } 

    .header-left { 
    float: left; 
    margin-top: 1.30cm; 
    margin-left: 0.20cm; 
    } 

    .header-right { 
     float: right; 
     margin-top: 0.60cm; 
     margin-right: 0.10cm; 
     /*margin-bottom: 0.10 cm;*/ 
    } 

    .confidentiality { 
     color: #0046AD; 
     font-size: 10pt; 
     font-weight: bold; 
     display: block; 
    } 
    </style> 
</head> 
<body> 
<div id="header"> 
    <div class="header-left"> 
     <span class="confidentiality">This is the header left aligned</span> 
    </div> 
    <div class="header-right"> 
     <table> 
      <tbody> 
      <tr> 
       <td style="text-align: right"><span id="pagenumber"></span> (<span id="pagecount"></span>)</td> 
      </tr> 
      <tr> 
       <td></td> 
      </tr> 
      <tr> 
       <td></td> 
      </tr> 
      <tr> 
       <td></td> 
      </tr> 
      <tr> 
       <td></td> 
      </tr> 
      </tbody> 
     </table> 
    </div> 
</div> 
<div id="firstPageFooter" style="position: running(firstPageFooter);"> 
    <div style="text-align: center; margin-top: 1em"> 
     This is page 1 footer 
    </div> 
</div> 
<div id="footer"> 
    This is footer 
</div> 
<!-- CONTENT --> 
<div class="content"> 
    <div> 
     <p> 
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus vitae orci nec elit congue dapibus nec ut ipsum. Nulla dapibus efficitur erat non aliquet. Sed in leo consectetur, faucibus purus sit amet, sollicitudin ipsum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean pretium, nisl ut vehicula ornare, lacus magna venenatis quam, vel commodo urna nunc et turpis. Maecenas placerat tortor sed velit vestibulum egestas. Donec vel magna dolor. Aliquam in massa bibendum, tempus augue vitae, lacinia nunc. Etiam sed urna vel eros maximus volutpat at sit amet libero. Mauris ac fringilla est. Ut fringilla tincidunt nisi et blandit. Nullam tincidunt, mi quis ullamcorper cursus, tellus ante placerat mauris, quis feugiat libero tellus eget nisl. 
     </p> 
     <p> 
      Sed tincidunt sit amet justo et convallis. Vestibulum et placerat nunc, dictum blandit orci. Nullam molestie posuere justo, quis tempor dui consequat vel. Vivamus vitae posuere tortor. Mauris aliquet velit eget neque molestie lobortis. Suspendisse at efficitur risus. Proin aliquam porttitor sapien ut malesuada. In hac habitasse platea dictumst. Etiam porta sem sit amet mollis feugiat. Aliquam erat volutpat. 
     </p> 
     <p> 
      Donec varius ante vel diam malesuada molestie. Sed et metus elit. Sed pellentesque, ex nec posuere rhoncus, sapien tortor porta est, ac facilisis neque neque vitae mi. Phasellus egestas arcu id varius ornare. Aliquam vel nulla arcu. Proin bibendum enim et tellus laoreet porttitor. Quisque non mollis libero. Etiam magna metus, maximus a velit et, posuere suscipit nibh. Praesent id vulputate urna. Mauris facilisis molestie leo, vitae dictum quam tempor in. Aenean enim risus, rhoncus vel posuere vitae, feugiat vitae velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam id mattis neque. Etiam gravida finibus orci sed interdum. 
     </p> 
     <p> 
      Donec sed sapien dui. Sed sed ante posuere, viverra dolor sit amet, viverra dolor. Praesent semper, diam sit amet pulvinar congue, orci nulla laoreet quam, in posuere justo lectus quis felis. Sed imperdiet nisl ante, vitae laoreet velit imperdiet eget. Vivamus pharetra placerat ex, maximus lobortis nibh. Quisque dictum neque eget mattis gravida. Curabitur at metus lacinia, facilisis velit nec, facilisis odio. 
     </p> 
     <p> 
      Nulla sagittis velit ut massa vulputate ultrices. Aliquam interdum porta risus eget fringilla. Duis laoreet augue id odio luctus dignissim. Cras non vestibulum eros. In vitae eleifend justo, a consectetur augue. Vestibulum nec posuere odio, sed cursus libero. Quisque laoreet, lacus a dignissim ultricies, enim ligula gravida lectus, a sagittis justo augue quis augue. Sed pulvinar posuere augue sit amet tempor. Donec viverra eleifend imperdiet. Maecenas eget purus nibh. Nulla non est in diam pulvinar varius sed quis purus. Maecenas consequat ligula vel velit lobortis aliquam. Pellentesque eu nulla porttitor, commodo erat quis, mollis libero. Maecenas quis est mauris. Maecenas luctus ligula nisl, quis rhoncus enim pretium eu. 
     </p> 
     <p> 
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus vitae orci nec elit congue dapibus nec ut ipsum. Nulla dapibus efficitur erat non aliquet. Sed in leo consectetur, faucibus purus sit amet, sollicitudin ipsum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean pretium, nisl ut vehicula ornare, lacus magna venenatis quam, vel commodo urna nunc et turpis. Maecenas placerat tortor sed velit vestibulum egestas. Donec vel magna dolor. Aliquam in massa bibendum, tempus augue vitae, lacinia nunc. Etiam sed urna vel eros maximus volutpat at sit amet libero. Mauris ac fringilla est. Ut fringilla tincidunt nisi et blandit. Nullam tincidunt, mi quis ullamcorper cursus, tellus ante placerat mauris, quis feugiat libero tellus eget nisl. 
     </p> 
     <p> 
      Sed tincidunt sit amet justo et convallis. Vestibulum et placerat nunc, dictum blandit orci. Nullam molestie posuere justo, quis tempor dui consequat vel. Vivamus vitae posuere tortor. Mauris aliquet velit eget neque molestie lobortis. Suspendisse at efficitur risus. Proin aliquam porttitor sapien ut malesuada. In hac habitasse platea dictumst. Etiam porta sem sit amet mollis feugiat. Aliquam erat volutpat. 
     </p> 
     <p> 
      Donec varius ante vel diam malesuada molestie. Sed et metus elit. Sed pellentesque, ex nec posuere rhoncus, sapien tortor porta est, ac facilisis neque neque vitae mi. Phasellus egestas arcu id varius ornare. Aliquam vel nulla arcu. Proin bibendum enim et tellus laoreet porttitor. Quisque non mollis libero. Etiam magna metus, maximus a velit et, posuere suscipit nibh. Praesent id vulputate urna. Mauris facilisis molestie leo, vitae dictum quam tempor in. Aenean enim risus, rhoncus vel posuere vitae, feugiat vitae velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam id mattis neque. Etiam gravida finibus orci sed interdum. 
     </p> 
     <p> 
      Donec sed sapien dui. Sed sed ante posuere, viverra dolor sit amet, viverra dolor. Praesent semper, diam sit amet pulvinar congue, orci nulla laoreet quam, in posuere justo lectus quis felis. Sed imperdiet nisl ante, vitae laoreet velit imperdiet eget. Vivamus pharetra placerat ex, maximus lobortis nibh. Quisque dictum neque eget mattis gravida. Curabitur at metus lacinia, facilisis velit nec, facilisis odio. 
     </p> 
     <p> 
      Nulla sagittis velit ut massa vulputate ultrices. Aliquam interdum porta risus eget fringilla. Duis laoreet augue id odio luctus dignissim. Cras non vestibulum eros. In vitae eleifend justo, a consectetur augue. Vestibulum nec posuere odio, sed cursus libero. Quisque laoreet, lacus a dignissim ultricies, enim ligula gravida lectus, a sagittis justo augue quis augue. Sed pulvinar posuere augue sit amet tempor. Donec viverra eleifend imperdiet. Maecenas eget purus nibh. Nulla non est in diam pulvinar varius sed quis purus. Maecenas consequat ligula vel velit lobortis aliquam. Pellentesque eu nulla porttitor, commodo erat quis, mollis libero. Maecenas quis est mauris. Maecenas luctus ligula nisl, quis rhoncus enim pretium eu. 
     </p> 
    </div> 
</div> 
</body> 
</html> 
+0

docx4j-ImportXHTML使用xhtmlrenderer的重新打包版本:https://github.com/plutext/docx4j-ImportXHTML/blob/master/pom.xml#L299不是上面列出的dep。 – JasonPlutext

回答

0

IIRC docx4j-ImportXHTML不会从XHTML导入页眉/页脚。

您可以确保这些已经存在于目标docx中。

你可以使用docx4j。多花点功夫,你可以扩展docx4j-ImportXHTML来完成它。

+0

嗨,谢谢你的回答,你能否提供一个我附加在我的问题上的样本的例子?页眉和页脚确实在docx中,但在错误的地方。示例代码生成PDF和docx以进行比较。 – pleft