example ejemplo java ms-word docx4j documents4j

java - ejemplo - docx4j example



Convierta html+css(medios impresos) a msword en java (1)

IIRC docx4j-ImportXHTML no importa encabezados / pies de página desde el XHTML.

Puede asegurarse de que estos ya estén presentes en el docx de destino.

Y podrías usar el docx4j para eso. Con un poco más de esfuerzo, puede extender docx4j-ImportXHTML para hacerlo.

Aquí está mi situación. Tengo un html / css (css contiene propiedades de los medios de impresión como @bottom-center @page , @bottom-center etc.) que se convierte a pdf a través de flying-saucer .

Ahora, necesito convertir el mismo recurso también al formato msword (doc o docx).

He intentado usar las docx4j-ImportXHTML y documents4j , pero desafortunadamente no puedo obtener el resultado deseado particularmente con las propiedades de medios impresos de la hoja de estilos. ¿Hay alguna configuración especial que deba hacerse o las bibliotecas no la admitan? Idealmente, quiero que las salidas de pdf y docx se vean casi idénticas.

Muchas gracias

Recursos de muestra:

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"))); } }

sample.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>