web-dev-qa-db-fra.com

Comment convertir des fichiers Word en PDF par programmation?

J'ai trouvé plusieurs programmes open-source/gratuits qui vous permettent de convertir des fichiers .doc en fichiers .pdf, mais ils appartiennent tous à la variété des pilotes d'application/imprimante, sans SDK attaché.

J'ai trouvé plusieurs programmes qui ont un SDK vous permettant de convertir des fichiers .doc en fichiers .pdf, mais ils sont tous du type propriétaire, 2 000 dollars par licence ou à peu près.

Est-ce que quelqu'un connaît une solution programmatique propre, peu coûteuse (de préférence gratuite) à mon problème, utilisant C # ou VB.NET?

Merci!

212
Shaul Behr

Utilisez une boucle foreach au lieu d'une boucle for - cela a résolu mon problème.

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++;
}

Voici une modification d'un programme qui a fonctionné pour moi. Il utilise Word 2007 avec le complément Enregistrer sous PDF installed. Il recherche dans un répertoire les fichiers .doc, les ouvre dans Word, puis les enregistre au format PDF. Notez que vous devrez ajouter une référence à Microsoft.Office.Interop.Word à la solution.

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

Pour résumer pour les utilisateurs de vb.net, l'option gratuite (Office doit être installé):

Téléchargement des associations Microsoft Office:

  • pia pour office 2010
  • pia pour office 2007

  • Ajouter une référence à Microsoft.Office.Interop.Word.Application

  • Ajoutez une instruction using ou import (vb.net) à Microsoft.Office.Interop.Word.Application

Exemple 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 a un composant COM, pouvant être appelé à partir de .NET ou VBScript (exemples inclus dans le téléchargement). 

Mais, il me semble qu’une imprimante est exactement ce dont vous avez besoin - mélangez simplement cela avec l’automatisation de Word , et vous devriez être prêt à partir.

14
Mark Brackett

Je voulais juste ajouter que j'ai utilisé les bibliothèques Microsoft.Interop, en particulier la fonction ExportAsFixedFormat que je ne voyais pas utilisée dans ce fil.

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

Je suis passé par le mot à la douleur PDF quand quelqu'un m'a largué avec 10000 fichiers Word pour convertir au format PDF. Maintenant, je le faisais en C # et utilisais Word interop, mais c’était lent et je tombais en panne si j’essayais d’utiliser un PC… très frustrant.

Cela m’a amené à découvrir que je pouvais vider les interops et leur lenteur ..... pour Excel, j’utilise (EPPLUS), puis j’ai découvert qu’il était possible d’obtenir un outil gratuit appelé Spire qui permet de convertir en PDF ... avec certaines limitations! 

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

5
Ggalla1779

Je le fais dans le cadre d'un processus de publication - convertir un document Word en PDF.

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

pas exactement par programme, mais peut vous aider.

3
Tim

Lorsque je suis tombé sur quelques problèmes d’automatisation côté serveur, nous nous sommes penchés sur la technique décrite ici sur codeproject . Elle utilise la version portable (qui peut être déployée via xcopy) d’OpenOffice en combinaison avec une macro . Bien que nous n'ayons pas encore effectué le changement nous-mêmes, cela semble très prometteur.

3
Cohen

J'ai été impressionné par Gembox ( http://www.gemboxsoftware.com/ ) qui fournit une édition gratuite limitée de la gestion de documents (y compris la conversion de pdf). Ils font aussi des bibliothèques pour les feuilles de calcul. La licence 1 développeur, si vous dépassez leurs limites (ce que je suppose, vous l’allez) coûte environ 580 USD ( http://www.gemboxsoftware.com/document/pricelist ). OK, ce n’est pas gratuit (ou à mon avis relativement bon marché) mais c’est beaucoup moins cher que 2000 $. D'après ce que je comprends de leur liste de prix, il n'y a pas non plus de redevance pour les déploiements de serveurs. Cela vaut peut-être la peine de les approcher et de voir s’ils concluront un accord si vous ne voulez pas avoir le vôtre.

2
The Senator

Semble être une information pertinente ici:

Conversion de documents MS Word en PDF dans ASP.NET

De plus, avec Office 2007 ayant la fonctionnalité de publication dans PDF, je suppose que vous pourriez utiliser la bureautique pour ouvrir le fichier * .DOC dans Word 2007 et enregistrer au format PDF. Je ne suis pas passionné par la bureautique car elle est lente et encline à la pendaison, mais je ne fais que la lancer ...

1
MikeW

Le complément Microsoft PDF pour Word semble être la meilleure solution pour le moment, mais vous devez savoir qu'il ne convertit pas correctement tous les documents Word en PDF et que, dans certains cas, vous constaterez une énorme différence entre Word et le logiciel. sortie pdf. Malheureusement, je n'ai trouvé aucune API capable de convertir tous les documents Word correctement .. La seule solution que j'ai trouvée pour garantir la conversion à 100% était la conversion des documents à l'aide d'un pilote d'imprimante. L’inconvénient est que les documents sont mis en file d’attente et convertis un à un, mais vous pouvez être sûr que le fichier PDF obtenu est exactement identique à la mise en page Word. J'ai personnellement préféré utiliser UDC (Universal Document Converter) et installer Foxit Reader (version gratuite). ) sur le serveur aussi, puis a imprimé les documents en lançant un "Processus" et en définissant sa propriété Verb sur "print". Vous pouvez également utiliser FileSystemWatcher pour définir un signal lorsque la conversion est terminée.

1
Arvand

Tant que Word 2010 ou version ultérieure est installé, vous pouvez utiliser DocTor , qui fournit une application en ligne de commande pour le faire.

1
Toby Allen

J'ai utilisé ABCpdf qui est une option de programmation et n'était pas trop cher, 300 $/licence. Cela fonctionne avec OpenOffice ou revient à Word si OpenOffice n'est pas disponible. La configuration était un peu délicate avec les autorisations COM OpenOffice, mais il valait vraiment la peine d'externaliser cette partie de l'application.

1
RyanW

Code facile et solution utilisant Microsoft.Office.Interop.Word pour convertir Word en 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);

}

Ajoutez cette procédure pour libérer de la mémoire:

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

Pour les programmeurs qui ne peuvent pas installer Office sur leur serveur ou qui travaillent dans un environnement cloud, une alternative peu coûteuse aux autres réponses est Api2Pdf qui prend également en charge la conversion de fichiers Word en PDF. comme n'importe quel autre fichier MS Office. C'est une API Web et utilise LibreOffice sous le capot.

0
apexdodge