Как программно конвертировать файлы Word в PDF?

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

Я нашел несколько программ, которые имеют SDK, позволяющий конвертировать .doc файлов .pdf-файлы, но они все проприетарного типа, $ 2,000 за лицензию или около того.

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

спасибо!

15 ответов


используйте цикл 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 с Сохранить как PDF add-in установлен. Он ищет каталог .doc файлы, открывает их в Word, а затем сохраняет их в формате PDF. Обратите внимание, что вам нужно добавить ссылку на Microsoft.Офис.Взаимодействие.Слово к решению.

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;

чтобы подвести итог vb.net пользователи, бесплатная опция (должен быть установлен office):

Microsoft office assembies загрузить:

  • pia для office 2010
  • pia для office 2007

  • добавить ссылку на Microsoft.Офис.Взаимодействие.Слово.Применение

  • добавить с помощью или импортировать (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()

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

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


целое обсуждение библиотек для преобразования Word в PDF on Джоэл. Некоторые предложения из потока:


просто хотел добавить, что я использовал Microsoft.Библиотеки взаимодействия, в частности функция 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 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;
    }

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

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

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


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

http://www.suodenjoki.dk/us/productions/articles/word2pdf.htm и http://www.oooforum.org/forum/viewtopic.phtml?t=3772&highlight=pdf + форма

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


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


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


вроде какая-то релевантная информация здесь:

преобразование документов MS Word в PDF в ASP.NET

кроме того, с Office 2007 с функцией публикации в PDF, я думаю, вы можете использовать Office automation для открытия *.DOC файл в Word 2007 и сохранить как PDF. Я не слишком увлекаюсь офисной автоматизацией, поскольку она медленная и склонна к зависанию, но просто бросаю это там...


Я использовал ABCpdf, который является программным вариантом и не был слишком дорогим, $300/лицензия. Он работает с OpenOffice или возвращается к Word, если OpenOffice недоступен. Настройка была немного сложной с разрешениями OpenOffice COM, но определенно стоило аутсорсинг этой части приложения.


Microsoft PDF add - in для word, кажется, лучшее решение на данный момент, но вы должны учитывать, что он не преобразует все документы word правильно в pdf, и в некоторых случаях вы увидите огромную разницу между словом и выходным pdf. К сожалению, я не смог найти api, который бы правильно конвертировал все документы word. Единственное решение, которое я нашел, чтобы убедиться, что преобразование было 100% правильным, было путем преобразования документов через драйвер принтера. Недостатком является то, что документы выстраиваются в очередь и преобразуются один за другим, но вы можете быть уверены, что полученный pdf-файл точно такой же, как макет документа word. Я лично предпочел использовать UDC(Universal document converter) и установил Foxit Reader (бесплатная версия) на сервере, а затем распечатал документы, запустив "процесс" и установив его свойство Verb в "печать". Вы также можете использовать FileSystemWatcher для установки сигнала после завершения преобразования.


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


для программистов, которые находятся в ситуации, когда они не могут установить Office на своем сервере или работать в какой-либо облачной среде-недорогая альтернатива другим ответам Api2Pdf который поддерживает преобразование файлов Word в PDF, а также любой другой файл MS Office. Это веб-API и использует LibreOffice под капотом.


Я использовал iTextSharp для создания PDF-файлов перед. Это порт с открытым исходным кодом iText из мира Java и довольно мощный.

Я явно не сделал преобразование Word в PDF, но я программно создал и манипулировал PDF-файлами с ним.

вот еще ссылке к проекту.