Como faço para converter arquivos do Word para PDF por meio de programação? [fechadas]

StackOverflow https://stackoverflow.com/questions/607669

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu encontrei vários / programas freeware de código aberto que permitem converter arquivos .doc a arquivos .pdf, mas todos eles são da variedade driver de aplicativo / impressora, sem SDK anexo.

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

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

Obrigado!

Foi útil?

Solução

Use um loop foreach em vez de um loop - que resolveu o 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 é uma modificação de um programa que funcionou para mim. Ele usa o Word 2007 com o Salvar como PDF add-in instalado. Ele procura um diretório para arquivos .doc, abre-los no Word e, em seguida, guarda-os como um PDF. Note que você vai precisar adicionar uma referência para 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;

Outras dicas

Para resumir para os usuários VB.NET, a opção livre (deve ter o Office instalado):

Microsoft assembies escritório download:

VB.NET exemplo:

        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()

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

Mas, parece-me que uma impressora é apenas o que você precisa - basta misturar isso com Palavra de automação , e você deve ser bom para ir.

Há toda uma discussão rel="noreferrer"> em fóruns de discussão de Joel . Algumas sugestões do tópico:

Só queria acrescentar que eu usei bibliotecas Microsoft.Interop, especificamente função ExportAsFixedFormat que eu não vi usado neste segmento.

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 pdfFileName = Path.ChangeExtension(path, ".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;
}

Eu atravessei o Word para PDF dor quando alguém me largou com 10.000 arquivos do Word para converter para PDF. Agora eu fiz isso em C # e usou a Palavra de interoperabilidade mas foi lento e caiu se eu tentasse usar o PC em todos .. muito frustrante.

Isso levou-me a descobrir que eu poderia despejar interops e sua lentidão ..... para Excel Eu uso (EPPLUS) e depois eu 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 / Introduzir / free-doc-component.html # .VtAg4PmLRhE

Parece ser alguma informação relevent aqui:

Convertendo MS documentos do Word para PDF em ASP.NET

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

Microsoft PDF add-in para a palavra parece ser a melhor solução para agora, mas você deve levar em consideração que ele não converter todos os documentos do Word corretamente para pdf e, em alguns casos, você vai ver grande diferença entre a palavra ea saída pdf. Infelizmente eu não consegui encontrar qualquer API que iria converter todos os documentos do Word corretamente. A única solução que encontrado para assegurar a conversão foi de 100% correcta foi convertendo os documentos por meio de um controlador de impressora. A desvantagem é que os documentos são colocados em fila e convertido, um por um, mas você pode ter certeza que o pdf resultou é exatamente o mesmo que o layout do documento palavra. Eu pessoalmente preferido usando UDC (conversor de documentos Universal) e instalado Foxit Reader (versão gratuita) no servidor também, em seguida, imprimiu os documentos, iniciando um "processo" e definindo sua propriedade verbo "print". Você também pode usar FileSystemWatcher para definir um sinal quando a conversão foi concluída.

Código Fácil e solução usando Microsoft.Office.Interop.Word para PALAVRA converd 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);

}

Adicionar este procedimento para memória release:

private void releaseObject(object obj)
{
  try
  {
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
      obj = null;
  }
  catch (Exception ex)
  {
      //TODO
  }
  finally
  {
     GC.Collect();
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top