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

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

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

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

Спасибо!

Ответ 1

Используйте цикл 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-надстройку. Он ищет каталог для файлов .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;

Ответ 2

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

Microsoft Office сборки скачать:

Пример 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()

Ответ 3

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

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

Ответ 5

Просто хотел добавить, что я использовал библиотеки 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;
}

Ответ 6

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

Ответ 14

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

Ответ 15

Простой код и решение с помощью Microsoft.Office.Interop.Word для преобразования WORD в 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);

}

Добавьте эту процедуру для освобождения памяти:

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

Ответ 16

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

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

Вот еще один ссылка для проекта.