Как программно конвертировать файлы Word в PDF? - PullRequest
214 голосов
/ 03 марта 2009

Я обнаружил несколько программ с открытым исходным кодом / бесплатных программ, которые позволяют преобразовывать файлы .doc в файлы .pdf, но все они представляют собой приложение / драйвер принтера без SDK.

Я нашел несколько программ, в которых есть SDK, позволяющий преобразовывать файлы .doc в файлы .pdf, но все они являются проприетарными, лицензией по 2000 долларов или около того.

Кто-нибудь знает какое-либо чистое, недорогое (желательно бесплатное) программное решение моей проблемы с использованием C # или VB.NET?

Спасибо!

Ответы [ 15 ]

197 голосов
/ 03 марта 2009

Используйте цикл foreach вместо цикла for - это решило мою проблему.

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

Вот модификация программы, которая работала для меня. Он использует Word 2007 с установленной надстройкой Save As PDF . Он ищет в каталоге файлы .doc, открывает их в Word, а затем сохраняет их в формате PDF. Обратите внимание, что вам нужно добавить ссылку на Microsoft.Office.Interop.Word в решение.

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;
32 голосов
/ 21 сентября 2012

Подводя итог для пользователей vb.net, бесплатный вариант (должен быть установлен офис):

Офисные сборки Microsoft скачать:

Пример 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()
14 голосов
/ 03 марта 2009

PDFCreator имеет COM-компонент, который можно вызывать из .NET или VBScript (примеры включены в загрузку).

Но, мне кажется, что принтер - это то, что вам нужно - просто смешайте это с Word Word , и вы должны быть в порядке.

7 голосов
/ 04 ноября 2016

Просто хотел добавить, что я использовал библиотеки Microsoft.Interop, в частности функцию ExportAsFixedFormat, которую я не видел, использованную в этой теме.

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;
}
7 голосов
/ 03 марта 2009
5 голосов
/ 26 февраля 2016

Я пережил боль Word в PDF, когда кто-то выложил мне 10000 файлов слова для преобразования в PDF. Теперь я сделал это в C # и использовал взаимодействие с Word, но оно было медленным и зависало, если я вообще пытался использовать ПК ... очень расстраивает.

Это привело меня к обнаружению, что я могу создавать дампы и их медлительность ..... для Excel я использую (EPPLUS), а затем я обнаружил, что вы можете получить бесплатный инструмент под названием Spire, который позволяет конвертировать в PDF ... с ограничениями !

http://www.e -iceblue.com / Введение / свободный док-component.html # .VtAg4PmLRhE

4 голосов
/ 17 июня 2016

Я был впечатлен Gembox (http://www.gemboxsoftware.com/), который предоставляет ограниченную бесплатную версию управления документами (включая преобразование PDF). Они также делают библиотеки для электронных таблиц. 1 лицензия разработчика, если вы превышаете их пределы (которые я Предположим, что вы будете), хотя это около $ 580 (http://www.gemboxsoftware.com/document/pricelist). ОК, это не бесплатно (или, на мой взгляд, относительно недорогой), но это намного дешевле, чем 2000 долларов. для развертываний серверов. Возможно, стоит подойти к ним и посмотреть, сделают ли они сделку, если вы не хотите делать свои собственные.

3 голосов
/ 05 марта 2009

Когда я наткнулся на некоторые проблемы с автоматизацией офисной части на стороне сервера, мы рассмотрели методику, описанную здесь, в проекте кода . Он использует переносную версию (которую можно развернуть через xcopy) OpenOffice в сочетании с макросом. Хотя мы сами еще не сделали этого, все выглядит многообещающе.

3 голосов
/ 03 марта 2009

Я делаю это как часть процесса выпуска - преобразование Word Doc в PDF.

http://www.suodenjoki.dk/us/productions/articles/word2pdf.htm а также http://www.oooforum.org/forum/viewtopic.phtml?t=3772&highlight=pdf+form

не совсем программно, но может вам помочь.

1 голос
/ 08 января 2016

Пока у вас установлен Word 2010 или новее, вы можете использовать DocTo , который предоставляет приложение командной строки для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...