2011-06-01 60 views
11

Al usar apache POI cómo convertir el archivo ms word al pdf?Java: utilizando el POI de apache, ¿cómo convertir ms word file a pdf?

Utilizo el siguiente código pero no funciona dando errores ¿Supongo que estoy importando las clases incorrectas?

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 

import org.apache.poi.hslf.record.Document; 
import org.apache.poi.hwpf.HWPFDocument; 
import org.apache.poi.hwpf.extractor.WordExtractor; 
import org.apache.poi.hwpf.usermodel.Paragraph; 
import org.apache.poi.hwpf.usermodel.Range; 
import org.apache.poi.poifs.filesystem.POIFSFileSystem; 


public class TestCon { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     POIFSFileSystem fs = null; 
     Document document = new Document(); 

     try { 
      System.out.println("Starting the test"); 
      fs = new POIFSFileSystem(new FileInputStream("/document/test2.doc")); 

      HWPFDocument doc = new HWPFDocument(fs); 
      WordExtractor we = new WordExtractor(doc); 

      OutputStream file = new FileOutputStream(new File("/document/test.pdf")); 

      PdfWriter writer = PdfWriter.getInstance(document, file); 

      Range range = doc.getRange(); 
      document.open(); 
      writer.setPageEmpty(true); 
      document.newPage(); 
      writer.setPageEmpty(true); 

      String[] paragraphs = we.getParagraphText(); 
      for (int i = 0; i < paragraphs.length; i++) { 

       org.apache.poi.hwpf.usermodel.Paragraph pr = range.getParagraph(i); 
       // CharacterRun run = pr.getCharacterRun(i); 
       // run.setBold(true); 
       // run.setCapitalized(true); 
       // run.setItalic(true); 
       paragraphs[i] = paragraphs[i].replaceAll("\\cM?\r?\n", ""); 
      System.out.println("Length:" + paragraphs[i].length()); 
      System.out.println("Paragraph" + i + ": " + paragraphs[i].toString()); 

      // add the paragraph to the document 
      document.add(new Paragraph(paragraphs[i])); 
      } 

      System.out.println("Document testing completed"); 
     } catch (Exception e) { 
      System.out.println("Exception during test"); 
      e.printStackTrace(); 
     } finally { 
         // close the document 
      document.close(); 
        } 
     } 
    } 
+0

Hola Denis cuando intento de convertir archivos de Word a PDF i ha obtenido un error en la importación com.lowagie.text.Document barbecho; import com.lowagie.text.DocumentException; import com.lowagie.text.Paragraph; import com.lowagie.text.pdf.PdfWriter; por favor dígame con la biblioteca me olvidé de agregarlo también si es posible darme un enlace para descargar – DynamicMind

Respuesta

8

Conseguido lo resuelto

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 

import com.lowagie.text.Document; 
import com.lowagie.text.DocumentException; 
import com.lowagie.text.Paragraph; 
import com.lowagie.text.pdf.PdfWriter; 


import org.apache.poi.hwpf.HWPFDocument; 
import org.apache.poi.hwpf.extractor.WordExtractor; 

import org.apache.poi.hwpf.usermodel.Range; 
import org.apache.poi.poifs.filesystem.POIFSFileSystem; 


public class TestCon { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     POIFSFileSystem fs = null; 
     Document document = new Document(); 

     try { 
      System.out.println("Starting the test"); 
      fs = new POIFSFileSystem(new FileInputStream("D:/Resume.doc")); 

      HWPFDocument doc = new HWPFDocument(fs); 
      WordExtractor we = new WordExtractor(doc); 

      OutputStream file = new FileOutputStream(new File("D:/test.pdf")); 

      PdfWriter writer = PdfWriter.getInstance(document, file); 

      Range range = doc.getRange(); 
      document.open(); 
      writer.setPageEmpty(true); 
      document.newPage(); 
      writer.setPageEmpty(true); 

      String[] paragraphs = we.getParagraphText(); 
      for (int i = 0; i < paragraphs.length; i++) { 

       org.apache.poi.hwpf.usermodel.Paragraph pr = range.getParagraph(i); 
       // CharacterRun run = pr.getCharacterRun(i); 
       // run.setBold(true); 
       // run.setCapitalized(true); 
       // run.setItalic(true); 
       paragraphs[i] = paragraphs[i].replaceAll("\\cM?\r?\n", ""); 
      System.out.println("Length:" + paragraphs[i].length()); 
      System.out.println("Paragraph" + i + ": " + paragraphs[i].toString()); 

      // add the paragraph to the document 
      document.add(new Paragraph(paragraphs[i])); 
      } 

      System.out.println("Document testing completed"); 
     } catch (Exception e) { 
      System.out.println("Exception during test"); 
      e.printStackTrace(); 
     } finally { 
         // close the document 
      document.close(); 
        } 
     } 
    } 
+1

Pero no puedo entender si el pdf no está en un diseño apropiado como el archivo de doc ..? – Harinder

+0

Hola Denis cuando trato de convertir archivos de palabras a pdf, tengo un error en la importación de com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Paragraph; import com.lowagie.text.pdf.PdfWriter; por favor dígame con la biblioteca me olvidé de agregarlo también si es posible darme un enlace para descargar - DynamicMind 0 secs ago edit – DynamicMind

+0

¿funcionará para Android? –

1

Hay varios pasos aquí:

  1. documento Leer palabra usando POI en una forma formato independiente del
  2. Convert forma formato agnóstico en PDF
  3. Comentario PDF

No sé si POI hará el paso 2 por usted. Yo recomendaría algo más, como iText.

+0

por favor compruebe mi código – Harinder

+3

El código en su publicación inicial no mencionaba los paquetes lowagie/iText. Ya estaba desconcertado en cuanto a dónde encontrar algo PDF relacionado en la biblioteca de POI. Duffymo está en lo correcto en los pasos que enumeró. En una situación similar, uso 'WordML' (formato XML de Word 2003) que se transforma en FO y luego se procesa utilizando Apache FOP. Hay otras posibilidades, incluida la API de OpenOffice. Busque a través de StackOverflow y encontrará muchas preguntas/respuestas sobre Office2PDF. – Wivani

1

Como nota al margen, también es posible leer el contenido de la marcha directamente de un flujo de contenido Word/Excel en lugar de leerlo desde el sistema de archivos y la serialización en el disco , por ejemplo al recuperar contenido de repositorios CMIS:

por ej.

//HWPFDocument docx = new HWPFDocument(fs); 
HWPFDocument docx = new HWPFDocument(doc.getContentStream().getStream()); 

(doc es de tipo org.apache.chemistry.opencmis.client.api.Document y en este caso he adaptado el código para recuperar un archivo de Word desde un repositorio de Alfresco mediante opencmis y lo transformó en PDF)

HTH

1

El a continuación el código que funcionó para mí:

Public class DocToPdfConverter{ 

public static void main(String[] args) { 

     String k=null; 
     OutputStream fileForPdf =null; 
     try { 

      String fileName="/document/test2.doc"; 
      //Below Code is for .doc file 
      if(fileName.endsWith(".doc")) 
      { 
      HWPFDocument doc = new HWPFDocument(new FileInputStream(
        fileName)); 
      WordExtractor we=new WordExtractor(doc); 
      k = we.getText(); 

      fileForPdf = new FileOutputStream(new File(
         "/document/DocToPdf.pdf")); 
      we.close(); 
      } 

      //Below Code for 

      else if(fileName.endsWith(".docx")) 
      { 
       XWPFDocument docx = new XWPFDocument(new FileInputStream(
         fileName)); 
       // using XWPFWordExtractor Class 
       XWPFWordExtractor we = new XWPFWordExtractor(docx); 
       k = we.getText(); 

       fileForPdf = new FileOutputStream(new File(
          "/document/DocxToPdf.pdf"));  
       we.close(); 
      } 



      Document document = new Document(); 
      PdfWriter.getInstance(document, fileForPdf); 

      document.open(); 

      document.add(new Paragraph(k)); 

      document.close(); 
      fileForPdf.close(); 



     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Hola, bienvenido a StackOverflow y gracias por su respuesta. Al publicar el código, guárdelo por 4 caracteres (o use el botón de formato del código en la barra de herramientas) para asegurarse de que se muestre como código (he sugerido una edición para que usted lo corrija). Además, como aquí no se recomiendan las respuestas de solo código, ¿podría editar su respuesta para explicar por qué esto responde la pregunta? Ayudará a enseñar a otros en lugar de simplemente alentar la codificación de copiar y pegar. ¡Muchas gracias! –

2

Esto funcionó para mí: -

Fuente: - http://www.programcreek.com/java-api-examples/index.php?api=org.apache.poi.xwpf.converter.pdf.PdfConverter

package pdf; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 

import org.apache.poi.xwpf.converter.pdf.PdfConverter; 
import org.apache.poi.xwpf.converter.pdf.PdfOptions; 
import org.apache.poi.xwpf.usermodel.XWPFDocument; 

public class PDF { 
    public static void main(String[] args) throws Exception { 
      String inputFile="D:/TEST.docx"; 
      String outputFile="D:/TEST.pdf"; 
      if (args != null && args.length == 2) { 
      inputFile=args[0]; 
      outputFile=args[1]; 
      } 
      System.out.println("inputFile:" + inputFile + ",outputFile:"+ outputFile); 
      FileInputStream in=new FileInputStream(inputFile); 
      XWPFDocument document=new XWPFDocument(in); 
      File outFile=new File(outputFile); 
      OutputStream out=new FileOutputStream(outFile); 
      PdfOptions options=null; 
      PdfConverter.getInstance().convert(document,out,options); 
     } 
} 
+0

no puede resolver método de convertir –

+0

@KamilIbadov: - Oye, viejo Usar la siguiente Maven Dependencia: - \t \t org.apache.poi \t \t poi \t \t 3,13 \t \t \t \t org. apache.poi \t \t poi-OOXML \t \t 3,13 \t \t \t \t fr.opensagres.xdocreport \t \t org.apache.poi.xwpf.converter.pdf \t \t LATES T \t Si continúa teniendo cualquier error mándenme un correo electrónico a [email protected] –

+0

org.apache.poi.xwpf.converter.pdf.PdfConverter (y PdfOptions) no es una parte de Apache POI pero xDocReport que hizo mal uso del espacio de nombres de puntos de interés de Apache. Consulte https://github.com/opensagres/xdocreport/issues/174. Actualmente su PdfConverter está en el paquete fr.opensagres.odfdom.converter.pdf – Fenix

Cuestiones relacionadas