it-swarm.com.ru

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

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

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

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

Спасибо!

212
Shaul Behr

Используйте цикл 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;
193
Eric Ness

Подводя итог для пользователей 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()
32
Elger Mensonides

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

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

14
Mark Brackett

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

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

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

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

5
Ggalla1779

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

http://www.suodenjoki.dk/us/productions/articles/Word2pdf.htm and http://www.oooforum.org/forum/viewtopic.phtml?t= 3772 & выделите = pdf + форма

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

3
Tim

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

3
Cohen

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

2
The Senator

Похоже, что некоторая информация здесь:

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

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

1
MikeW

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

1
Arvand

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

1
Toby Allen

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

1
RyanW

Простой код и решение с помощью 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();
  }
}
0
daniele3004

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

0
apexdodge