Convertisseur Word vers PDF en ligne de commande


J’ai besoin de convertir de documents docx en pdf afin d’intégrer la génération de documentations dans mes build TFS2010. Malheureusement, les outils de « conversion » word->pdf sont la plupart du temp des drivers d’impression ou nécessitent une action manuel. Voici donc deux bout de code. Le premier avec uniquement le code de sauvegarde en pdf et le second pour une application avec deux arguments in: et out:, une vérification de la validité des arguments et l’émission de logs d’erreur dans l’event log windows. (L’application allant tourner en background lors des build, c’est le seul moyen propre de savoir ou ca à merdé)
Donc on commence par ouvrir une instance Word et un document de manière classique. (Classique a l’interop office). Ensuite, il suffit de définir quelques variables, mais le principal se joue sur le WdSaveFormat à définir en temp que wdFormatPDF. Voici le code :

    object inputFilePath = @"C:\teste.docx";
    object outputFilePath = @"C:\teste.pdf";

    object typeMissing = Type.Missing;

    // Création d'une instance
    _Application application = new Microsoft.Office.Interop.Word.Application();

    // La rendre invisible
    application.Application.Visible = false;

    // Ouvrir le fichier word
    Documents documents = application.Documents;
    _Document document = documents.Open
                        (ref inputFilePath, ref typeMissing, ref typeMissing, ref typeMissing,
                        ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing,
                        ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing,
                        ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing);

    // Définition des arguments de sauvegarde
    object FileFormat = WdSaveFormat.wdFormatPDF;
    object LockComments = false;
    object AddToRecentFiles = false;
    object ReadOnlyRecommended = false;
    object EmbedTrueTypeFonts = true;
    object SaveNativePictureFormat = false;
    object SaveFormsData = false;
    object SaveAsAOCELetter = false;
    object InsertLineBreaks = false;
    object AllowSubstitutions = false;
    object LineEnding = WdLineEndingType.wdCRLF;
    object AddBiDiMarks = false;

    // Saauvegarde
    document.SaveAs2(ref outputFilePath,
                    ref FileFormat,
                    ref LockComments,
                    ref typeMissing,
                    ref AddToRecentFiles,
                    ref typeMissing,
                    ref ReadOnlyRecommended,
                    ref EmbedTrueTypeFonts,
                    ref SaveNativePictureFormat,
                    ref SaveFormsData,
                    ref SaveAsAOCELetter,
                    ref typeMissing,
                    ref InsertLineBreaks,
                    ref AllowSubstitutions,
                    ref LineEnding,
                    ref AddBiDiMarks);

    // Fermerture
    application.Quit();
}
catch (Exception ex)
{
    WriteLog(String.Format("Application Excepetion for files : " +
                            "\nInput : {0}\nOutput : {1}\nError : {2}",
                            inputFilePath, outputFilePath, ex.Message));
}

Et la version « directement utilisable » :

static void Main(string[] args)
{
    Program p = new Program();
    if (p.CheckInput(args))
        p.Convert();
}

private object inputFilePath = null;
private object outputFilePath = null;

// Quelques vérifications basique.
public bool CheckInput(string[] args)
{
    // Check nombre d'arguments
    if (args.Length != 2) 
       { WriteLog("Nombre d'arguments invalide"); return false; }

    // Récupèration
    foreach (string a in args)
    {
        if (a.StartsWith("in:")) inputFilePath = a.Substring(3);
        if (a.StartsWith("out:")) outputFilePath = a.Substring(4);
    }

    // Verification non null
    if (inputFilePath == null) 
        { WriteLog("Fichier d'entré non spécifié"); return false; }
    if (outputFilePath == null) 
        { WriteLog("Fichier de sortie non spécifié"); return false; }

    // Verification existence input
    if(!(File.Exists(inputFilePath.ToString()))) 
        { WriteLog("Fichier d'entré n'existe pas"); return false; }
           
    return true;
}

public void Convert()
{
    try
    {
        object typeMissing = Type.Missing;

        // Création d'une instance
        _Application application = new Microsoft.Office.Interop.Word.Application();

        // La rendre invisible
        application.Application.Visible = false;

        // Ouvrir le fichier word
        Documents documents = application.Documents;
        _Document document = documents.Open
                         (ref inputFilePath, ref typeMissing, ref typeMissing, ref typeMissing,
                            ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing,
                            ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing,
                            ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing);

        // Définition des arguments de sauvegarde
        object FileFormat = WdSaveFormat.wdFormatPDF;
        object LockComments = false;
        object AddToRecentFiles = false;
        object ReadOnlyRecommended = false;
        object EmbedTrueTypeFonts = true;
        object SaveNativePictureFormat = false;
        object SaveFormsData = false;
        object SaveAsAOCELetter = false;
        object InsertLineBreaks = false;
        object AllowSubstitutions = false;
        object LineEnding = WdLineEndingType.wdCRLF;
        object AddBiDiMarks = false;

        // Saauvegarde
        document.SaveAs2(ref outputFilePath,
                        ref FileFormat,
                        ref LockComments,
                        ref typeMissing,
                        ref AddToRecentFiles,
                        ref typeMissing,
                        ref ReadOnlyRecommended,
                        ref EmbedTrueTypeFonts,
                        ref SaveNativePictureFormat,
                        ref SaveFormsData,
                        ref SaveAsAOCELetter,
                        ref typeMissing,
                        ref InsertLineBreaks,
                        ref AllowSubstitutions,
                        ref LineEnding,
                        ref AddBiDiMarks);

        // Fermerture
        application.Quit();
    }
    catch (Exception ex)
    {
        WriteLog(String.Format("Application Excepetion for files : " +
                                "\nInput : {0}\nOutput : {1}\nError : {2}",
                                inputFilePath, outputFilePath, ex.Message));
    }
}

void WriteLog(string message)
{
        // Ecriture dans l'event log
        string sSource = "Word To Pdf Tool";
        string sLog = "Application";
        string sEvent = message;

        // Vérification de la source, != création
        if (!EventLog.SourceExists(sSource)) EventLog.CreateEventSource(sSource, sLog);

        // Enregitrement du log
        EventLog.WriteEntry(sSource, sEvent, EventLogEntryType.Error, 234);
        Console.WriteLine(sEvent);
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s