¿Cómo convertir archivos de Word a PDF mediante programación?


He encontrado varios programas de código abierto/freeware que le permiten convertir .doc archivos a .archivos pdf, pero son todos de la variedad de controladores de aplicación/impresora, sin SDK adjunto.

He encontrado varios programas que tienen un SDK que le permite convertir .doc archivos a .archivos PDF, pero son todos del tipo propietario, $2,000 por licencia o más o menos.

¿Alguien conoce alguna solución programática limpia y económica (preferiblemente gratuita) para mi problema, usando C # o VB.NET?

Gracias!

Author: Shaul Behr, 2009-03-03

15 answers

Use un bucle foreach en lugar de un bucle for - solucionó mi problema.

int j = 0;
foreach (Microsoft.Office.Interop.Word.Page p in pane.Pages)
{
    var bits = p.EnhMetaFileBits;
    var target = path1 +j.ToString()+  "_image.doc";
    try
    {
        using (var ms = new MemoryStream((byte[])(bits)))
        {
            var image = System.Drawing.Image.FromStream(ms);
            var pngTarget = Path.ChangeExtension(target, "png");
            image.Save(pngTarget, System.Drawing.Imaging.ImageFormat.Png);
        }
    }
    catch (System.Exception ex)
    {
        MessageBox.Show(ex.Message);  
    }
    j++;
}

Aquí está una modificación de un programa que funcionó para mí. Utiliza Word 2007 con el complemento Guardar como PDF instalado. Busca en un directorio .archivos doc, los abre en Word y luego los guarda como un PDF. Ten en cuenta que necesitarás agregar una referencia a Microsoft.Oficina.Interop.Palabra a la solución.

using Microsoft.Office.Interop.Word;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

...

// Create a new Microsoft Word application object
Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();

// C# doesn't have optional arguments so we'll need a dummy value
object oMissing = System.Reflection.Missing.Value;

// Get list of Word files in specified directory
DirectoryInfo dirInfo = new DirectoryInfo(@"\\server\folder");
FileInfo[] wordFiles = dirInfo.GetFiles("*.doc");

word.Visible = false;
word.ScreenUpdating = false;

foreach (FileInfo wordFile in wordFiles)
{
    // Cast as Object for word Open method
    Object filename = (Object)wordFile.FullName;

    // Use the dummy value as a placeholder for optional arguments
    Document doc = word.Documents.Open(ref filename, ref oMissing,
        ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
        ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
        ref oMissing, ref oMissing, ref oMissing, ref oMissing);
    doc.Activate();

    object outputFileName = wordFile.FullName.Replace(".doc", ".pdf");
    object fileFormat = WdSaveFormat.wdFormatPDF;

    // Save document into PDF Format
    doc.SaveAs(ref outputFileName,
        ref fileFormat, ref oMissing, ref oMissing,
        ref oMissing, ref oMissing, ref oMissing, ref oMissing,
        ref oMissing, ref oMissing, ref oMissing, ref oMissing,
        ref oMissing, ref oMissing, ref oMissing, ref oMissing);

    // Close the Word document, but leave the Word application open.
    // doc has to be cast to type _Document so that it will find the
    // correct Close method.                
    object saveChanges = WdSaveOptions.wdDoNotSaveChanges;
    ((_Document)doc).Close(ref saveChanges, ref oMissing, ref oMissing);
    doc = null;
}

// word has to be cast to type _Application so that it will find
// the correct Quit method.
((_Application)word).Quit(ref oMissing, ref oMissing, ref oMissing);
word = null;
 190
Author: Eric Ness,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-16 15:16:25

Para resumirlo vb.net usuarios, la opción gratuita (debe tener office instalado):

Microsoft office assembies descargar:

VB.NET ejemplo:

        Dim word As Application = New Application()
        Dim doc As Document = word.Documents.Open("c:\document.docx")
        doc.Activate()
        doc.SaveAs2("c:\document.pdf", WdSaveFormat.wdFormatPDF)
        doc.Close()
 32
Author: Elger Mensonides,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-29 13:52:54

PDFCreator tiene un componente COM, llamable desde.NET o VBScript (ejemplos incluidos en la descarga).

Pero, me parece que una impresora es justo lo que necesita, solo mezcle eso con la automatización de Word, y debería estar listo.

 14
Author: Mark Brackett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-04 10:59:23
 7
Author: tgamblin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-03 19:05:15

Solo quería añadir que he utilizado Microsoft.Interop bibliotecas, específicamente ExportAsFixedFormat función que no vi utilizado en este hilo.

    using Microsoft.Office.Interop.Word;
    using System.Runtime.InteropServices;
    using System.IO;
    using Microsoft.Office.Core;Application app;

    public string CreatePDF(string path, string exportDir)
    {
        Application app = new Application();
        app.DisplayAlerts = WdAlertLevel.wdAlertsNone;
        app.Visible = true;

        var objPresSet = app.Documents;
        var objPres = objPresSet.Open(path, MsoTriState.msoTrue, MsoTriState.msoTrue, MsoTriState.msoFalse);

        var baseFileName = Path.GetFileNameWithoutExtension(path);
        var pdfFileName = baseFileName + ".pdf";
        var pdfPath = Path.Combine(exportDir, pdfFileName);

        try
        {
            objPres.ExportAsFixedFormat(
                pdfPath,
                WdExportFormat.wdExportFormatPDF,
                false,
                WdExportOptimizeFor.wdExportOptimizeForPrint,
                WdExportRange.wdExportAllDocument
            );
        }
        catch
        {
            pdfPath = null;
        }
        finally
        {
            objPres.Close();
        }
        return pdfPath;
    }
 7
Author: zeta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-04 18:51:39

Pasé por el dolor de Word a PDF cuando alguien me dejó con 10000 archivos de Word para convertir a PDF. Ahora lo hice en C# y usé Word interop, pero era lento y se bloqueaba si intentaba usar PC.. muy frustrante.

Esto me llevó a descubrir que podía volcar interops y su lentitud..... para Excel uso (EPPLUS) y luego descubrí que puedes obtener una herramienta gratuita llamada Spire que permite convertir a PDF... con limitaciones!

Http://www.e-iceblue.com/Introduce/free-doc-component.html#.VtAg4PmLRhE

 4
Author: Ggalla1779,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-26 18:04:20

Hago esto como parte de un proceso de liberación - convertir un documento de Word a PDF.

Http://www.suodenjoki.dk/us/productions/articles/word2pdf.htm y http://www.oooforum.org/forum/viewtopic.phtml?t=3772&highlight=pdf + formulario

No exactamente programáticamente, pero puede ayudarle.

 3
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-03 19:36:23

Cuando me topé con algunos problemas con la automatización de oficinas del lado del servidor, investigamos la técnica descrita aquí en codeproject. Utiliza la versión portable (que se puede implementar a través de xcopy) de OpenOffice en combinación con una macro. Aunque no hemos hecho el cambio nosotros mismos todavía, parece muy promisorio.

 3
Author: Cohen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-04 21:24:10

Me han impresionado con Gembox ( http://www.gemboxsoftware.com / ) que proporcionan una edición gratuita limitada de gestión de documentos (incluye conversión de pdf). También hacen bibliotecas para hojas de cálculo. La licencia de desarrollador 1 si excede sus límites (que imagino que lo hará) es de alrededor de $580 ( http://www.gemboxsoftware.com/document/pricelist ). OK, no es gratis (o en mi opinión relativamente barato) pero es mucho más barato que $2000. Como lo entiendo de su lista de precios tampoco hay regalías para las implementaciones de servidores. Podría valer la pena acercarse a ellos y ver si van a hacer un trato si usted no quiere rodar su propia.

 2
Author: The Senator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-17 11:03:13

Parece haber información relevante aquí:

Convertir documentos de MS Word a PDF en ASP.NET

Además, con Office 2007 teniendo la funcionalidad de publicar en PDF, supongo que podría usar la automatización de oficina para abrir el *.Archivo DOC en Word 2007 y Guardar como PDF. No estoy muy interesado en la automatización de oficinas, ya que es lento y propenso a colgar, pero simplemente tirar eso por ahí...

 1
Author: MikeW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:33

Usé ABCpdf que es una opción programática y no era demasiado costosa, 3 300/licencia. Funciona con OpenOffice, o vuelve a Word si OpenOffice no está disponible. La configuración fue un poco complicada con los permisos COM de OpenOffice, pero definitivamente valió la pena subcontratar esa parte de la aplicación.

 1
Author: RyanW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-30 02:40:30

Microsoft PDF add-in para word parece ser la mejor solución por ahora, pero debe tener en cuenta que no convierte todos los documentos de Word correctamente a pdf y en algunos casos verá una gran diferencia entre word y el pdf de salida. Desafortunadamente no pude encontrar ninguna api que convirtiera todos los documentos de Word correctamente. La única solución que encontré para garantizar que la conversión fuera 100% correcta fue convertir los documentos a través de un controlador de impresora. La desventaja es que los documentos se ponen en cola y se convierten uno por uno, pero puede estar seguro de que el pdf resultante es exactamente el mismo que el diseño del documento de Word. Personalmente preferí usar UDC (Universal document converter) e instalé Foxit Reader(versión gratuita) en el servidor también y luego imprimí los documentos iniciando un "Proceso" y estableciendo su propiedad de Verbo en "imprimir". También puede usar FileSystemWatcher para establecer una señal cuando la conversión se haya completado.

 1
Author: Arvand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-25 08:26:05

Mientras tenga instalado Word 2010 o posterior, puede usar DocTo que proporciona una aplicación de línea de comandos para hacer esto.

 1
Author: Toby Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-07 21:08:30

Para los programadores que están en una situación en la que no pueden instalar Office en su servidor, o operar en algún entorno en la nube an una alternativa económica a las otras respuestas es Api2Pdf que admite la conversión de archivos de Word a PDF, así como cualquier otro archivo de MS Office. Es una API web y utiliza LibreOffice bajo el capó.

 0
Author: apexdodge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-06 01:12:25

He usado iTextSharp para generar archivos Pdf antes. Es un port de código abierto de iText del mundo Java y es bastante potente.

No he hecho explícitamente una conversión de Word a PDF, pero he creado y manipulado archivos PDF mediante programación.

Aquí hay otro enlace al proyecto.

 -4
Author: Mike L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-03 20:48:42