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

221

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

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

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

Спасибо!

Шауль Бер
источник
1
Проверьте Pandoc имеет привязки для вашего любимого языка . Интерфейс командной строки также очень простpandoc manual.docx -o manual.pdf
полковник Паник
Также проверьте GemBox.Document SDK. Имеется бесплатная версия и недорогая версия. Он не использует ни драйвер принтера, ни MS Office для преобразования файлов Word в PDF.
Герцогт
Вы можете использовать docx2pdf, чтобы сделать это преобразование: github.com/AlJohri/docx2pdf
Аль Джохри

Ответы:

204

Используйте цикл 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;
Эрик Несс
источник
3
Спасибо! В любом случае, я могу просто использовать Aspose, если это быстрее, чем автоматизация Word. Но если я могу терпеть немного медлительности, я буду широко использовать ваше решение. Еще раз спасибо!
Шауль Бер
4
Да, это не самый быстрый, но трудно превзойти цену. :-) Рад, что смог помочь.
Эрик Несс
10
С Office 2007 с пакетом обновления 2 (SP2) вам больше не нужно сохранять файлы в формате PDF. Я также успешно использовал эту технику для Excel и Powerpoint.
RichardOD
5
Вы использовали этот метод на сервере с веб-приложением? Я получаю много вопросов, не говоря уже о том, что не рекомендуется MS. support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2 Я слышал, ASPose великолепен, но довольно дорог.
Прабу
6
Хм ... если слово не установлено, я думаю, что упаковка сборки взаимодействия будет наименьшим из ваших беспокойств. Этот код ТРЕБУЕТ слова для установки.
BrainSlugs83
35

Подводя итог для пользователей 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
Все еще работает в 2015 году. С Office 2013 вам не нужно загружать PIA отдельно.
Адам Андерсон
3
И БУМ, если он открывает окно сообщения и спрашивает что-то - например, в веб-приложении ... или делает 2 документа одновременно ...
Stefan Steiger
Опцией freemium (с помощью nodejs и edge.js или Javascript.NET) является npmjs.com/package/@nativedocuments/docx-wasm (нет необходимости в Word)
JasonPlutext
14

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

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

Марк Брекетт
источник
где этот компонент COM? А что значит "мик"? Это должно было быть "смешано"?
Шауль Бер
Компонент COM включен в загрузку вместе с образцами. И да, это должно было быть "микс".
Марк Брэкетт
4
К вашему сведению - если вы идете по этому пути, PDFCreator объединяет вредоносные программы в установщик. Это постоянная проблема с PDFCreator с 2009 года.
Фил Горли
2
@PhilGorley Malware? и этот ответ +8 ...
Mzn
@Mzn - FWIW, уделять внимание и снимать флажки установки аддона всегда работает для меня. Я не вижу в этом ничего, кроме дерьма, связанного с Oracle, в установщике Java; это раздражает, но не стоит избегать программного обеспечения для меня (да, хорошо, рекламное ПО PdfCreator, вероятно, бесконечно менее полезно и более навязчиво, чем то, что Oracle продвигает в наши дни ... Я все еще не хочу ни одного из них).
Марк Брэкетт
12

Просто хотел добавить, что я использовал библиотеки 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
Просто примечание для тех, кто не знает, что вам нужно установить Office на компьютере, чтобы использовать библиотеки Microsoft Interop.
Сэм Рюби
Ницца! Я предлагаю установить app.Visible = false;и добавить вызов app.Quit();в блок finally.
Дэн Корн
7

Там целая дискуссия библиотек для преобразования Слова PDF на дискуссионных форумах Джоэла . Некоторые предложения из ветки:

Тодд Гамблин
источник
9
Спасибо, но все предложения там подпадают под две категории, которые я описал выше: или не программные, или очень дорогие. Мне специально нужно .doc для .pdf программно.
Шауль Бер
5

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

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

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

Ggalla1779
источник
Спасибо за это - отличное решение без использования Interop. Почему так сложно найти бесплатный конвертер docx в PDF?
Мбдэвис
Я возлагал на это большие надежды, но бесплатная версия ограничена 3 страницами вывода PDF. Полная версия очень дорога, если вам нужно неограниченное развертывание.
grinder22
grinder22 GemBox.Document также имеет бесплатную версию с ограничением размера и платную версию. Однако он включает в себя бесплатное развертывание, поэтому вы можете создавать и публиковать неограниченное количество проектов без дополнительных затрат.
Герцогт
3

Простой код и решение 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();
  }
}
daniele3004
источник
Нужно ли звонить в GC.Collect? Разве нет другого способа пометить только часть памяти, которая связана с этим, для освобождения на следующем автоматическом GC?
Preza8
2

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

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

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

MikeW
источник
Aspose может работать, но это очень дорого.
Шауль Бер
1

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

Арванд
источник