2016-10-07 2 views
4

Вот моя ситуация. У меня есть html/css (css содержит свойства печатного носителя, такие как @page, @bottom-center и т. Д.) Ресурс, который преобразован в pdf через flying-saucer просто отлично.Преобразование html + css (печатный носитель) в msword в java

Теперь мне нужно преобразовать один и тот же ресурс в формат msword (doc или docx).

Я пробовал использовать библиотеки docx4j-ImportXHTML и documents4j, но, к сожалению, я не могу получить желаемый результат, в частности, с помощью свойств материала для печати в таблице стилей. Существуют ли какие-либо специальные настройки, которые необходимо выполнить, или библиотеки не поддерживают его? В идеале я хочу, чтобы выходы формата 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 не список, указанный выше. – JasonPlutext

ответ

0

IIRC docx4j-ImportXHTML не импортирует заголовки/колонтитулы из XHTML.

Вы можете убедиться, что они уже присутствуют в целевом docx.

И вы можете использовать docx4j для этого. С меньшими усилиями вы можете расширить docx4j-ImportXHTML, чтобы сделать это.

+0

Привет, спасибо за ваш ответ, не могли бы вы привести пример по образцам, которые я приложил по моему вопросу? Верхний и нижний колонтитулы действительно находятся в docx, но не в том месте. Пример кода позволяет сравнивать как PDF, так и docx. – pleft

Смежные вопросы