web-dev-qa-db-pt.com

Como faço para converter arquivos do Word para PDF programaticamente?

Eu encontrei vários programas de código aberto/freeware que permitem converter arquivos .doc em arquivos .pdf, mas eles são todos do tipo de driver de aplicativo/impressora, sem nenhum SDK anexado.

Eu encontrei vários programas que têm um SDK que lhe permite converter arquivos .doc para arquivos .pdf, mas eles são todos do tipo proprietário, $ 2.000 uma licença ou por aí.

Alguém sabe de alguma solução programática limpa, barata (de preferência livre) para o meu problema, usando C # ou VB.NET?

Obrigado!

212
Shaul Behr

Use um loop foreach em vez de um loop for - resolveu meu 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++;
}

Aqui está uma modificação de um programa que funcionou para mim. Ele usa o Word 2007 com o Save As PDF add-in installed. Ele pesquisa um diretório para arquivos .doc, abre-os no Word e os salva como um PDF. Observe que você precisará adicionar uma referência ao Microsoft.Office.Interop.Word à solução.

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;
193
Eric Ness

Para resumir para usuários do vb.net, a opção free (deve ter o office instalado):

Download do Microsoft Office assemblies:

Exemplo VB.NET:

        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
Elger Mensonides

PDFCreator tem um componente COM, que pode ser chamado de .NET ou VBScript (exemplos incluídos no download). 

Mas, parece-me que uma impressora é exatamente o que você precisa - basta misturar isso com automação do Word , e você deve estar pronto para ir.

14
Mark Brackett

Só queria acrescentar que usei bibliotecas Microsoft.Interop, especificamente a função ExportAsFixedFormat que não vi usada neste thread.

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
zeta
7
Todd Gamblin

Eu passei a palavra para PDF dor quando alguém me deixou com 10000 arquivos do Word para converter para PDF. Agora eu fiz isso em C # e usei o Word Interop, mas foi lento e falhou se eu tentasse usar o PC em todos os momentos .. muito frustrante.

Isso me levou a descobrir que eu poderia despejar interops e sua lentidão ..... para o Excel eu uso (EPPLUS) e, em seguida, descobri que você pode obter uma ferramenta gratuita chamada Spire que permite a conversão para PDF ... com limitações! 

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

5
Ggalla1779

Eu faço isso como parte de um processo de lançamento - converta um documento do Word para PDF.

http://www.suodenjoki.dk/us/productions/articles/Word2pdf.htm e http://www.oooforum.org/forum/viewtopic. phtml? t = 3772 & destaque = pdf + forma

não exatamente de forma programática, mas pode ajudá-lo.

3
Tim

Quando me deparei com alguns problemas com a automação de escritório do lado do servidor, examinamos a técnica descrita aqui no codeproject . Ele usa a versão portátil (que pode ser implantada via xcopy) do OpenOffice em combinação com uma macro Embora ainda não tenhamos feito a mudança, parece muito promissor.

3
Cohen

Fiquei impressionado com o Gembox ( http://www.gemboxsoftware.com/ ) que fornece uma edição gratuita limitada de gerenciamento de documentos (inclui conversão de pdf). Eles também fazem bibliotecas para planilhas. A 1 licença de desenvolvedor, se você exceder seus limites (o que eu imagino que você irá), é cerca de US $ 580 ( http://www.gemboxsoftware.com/document/pricelist ). OK, não é grátis (ou na minha opinião relativamente barato), mas é muito mais barato do que US $ 2000. Pelo que entendi de sua lista de preços, não há royalties para implantações de servidores. Pode valer a pena se aproximar deles e ver se eles vão fazer um acordo, se você não quiser rolar o seu próprio.

2
The Senator

Parece ser alguma informação relevante aqui:

Convertendo documentos do MS Word para PDF no ASP.NET

Além disso, com o Office 2007 tendo a funcionalidade PDF, acho que você poderia usar a automação de escritório para abrir o arquivo * .DOC no Word 2007 e Salvar como PDF. Eu não estou muito interessado em automação de escritório, pois é lento e propenso a pendurar, mas apenas jogando isso lá fora ...

1
MikeW

O complemento Microsoft PDF para o Word parece ser a melhor solução por enquanto, mas você deve levar em consideração que ele não converte todos os documentos do Word corretamente em pdf e, em alguns casos, você verá uma enorme diferença entre o Word eo saída pdf. Infelizmente, não consegui encontrar nenhuma API que convertesse todos os documentos do Word corretamente. A única solução que encontrei para garantir a conversão foi 100% correta ao converter os documentos por meio de um driver de impressora. A desvantagem é que os documentos são enfileirados e convertidos um a um, mas você pode ter certeza de que o PDF resultante é exatamente igual ao layout do documento do Word. Eu pessoalmente preferi usar o UDC (Universal Document Converter) e instalado o Foxit Reader ( versão gratuita) no servidor também, em seguida, imprimiu os documentos, iniciando um "Processo" e definindo sua propriedade Verb para "imprimir". Você também pode usar o FileSystemWatcher para definir um sinal quando a conversão for concluída.

1
Arvand

Contanto que você tenha o Word 2010 ou posterior instalado, você pode usar DocTor que fornece um aplicativo de linha de comando para fazer isso.

1
Toby Allen

Eu usei ABCpdf que é uma opção programática e não era muito caro, $ 300/licença. Funciona com o OpenOffice ou volta ao Word se o OpenOffice não estiver disponível. A configuração foi um pouco complicada com as permissões do OpenOffice COM, mas definitivamente valeu a pena terceirizar essa parte do aplicativo.

1
RyanW

código fácil e solução usando Microsoft.Office.Interop.Word para converter o Word em PDF

using Word = Microsoft.Office.Interop.Word;

private void convertDOCtoPDF()
{

  object misValue = System.Reflection.Missing.Value;
  String  PATH_APP_PDF = @"c:\..\MY_Word_DOCUMENT.pdf"

  var Word = new Word.Application();

  Word.Document doc   = Word.Documents.Open(@"c:\..\MY_Word_DOCUMENT.docx");
  doc.Activate();

  doc.SaveAs2(@PATH_APP_PDF, Word.WdSaveFormat.wdFormatPDF, misValue, misValue, misValue, 
  misValue, misValue, misValue, misValue, misValue, misValue, misValue);

  doc.Close();
  Word.Quit();


  releaseObject(doc);
  releaseObject(Word);

}

Adicione este procedimento para liberar memória:

private void releaseObject(object obj)
{
  try
  {
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
      obj = null;
  }
  catch (Exception ex)
  {
      //TODO
  }
  finally
  {
     GC.Collect();
  }
}
0
daniele3004

Para programadores que estão em uma situação onde não podem instalar o Office em seu servidor ou operar em algum ambiente de nuvem - uma alternativa barata para as outras respostas é Api2Pdf que suporta a conversão de arquivos do Word para PDF também como qualquer outro arquivo do MS Office. É uma API da web e usa o LibreOffice sob o capô.

0
apexdodge