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

188

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

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

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

Спасибо!

Теги:
ms-word
pdf

14 ответов

166
Лучший ответ

Используйте цикл 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
    Да, это не самый быстрый, но трудно превзойти цену. :-) Рад, что смог помочь.
Показать ещё 16 комментариев
25

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

Загрузка Microsoft Office:

  • pia for office 2010
  • pia для офиса 2007

  • Добавить ссылку на Microsoft.Office.Interop.Word.Application

  • Добавить использование или импорт (vb.net) в Microsoft.Office.Interop.Word.Application

Пример 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 отдельно.
  • 2
    И BOOM, если он открывает окно сообщения и спрашивает что-то - например, в веб-приложении ... или делает 2 документа одновременно ...
Показать ещё 1 комментарий
10

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

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

  • 0
    где этот компонент COM? А что значит "мик"? Это должно было быть "смешано"?
  • 0
    Компонент COM включен в загрузку вместе с примерами. И да, это должно было быть "микс".
Показать ещё 4 комментария
5
  • 8
    Спасибо, но все предложения там подпадают под две категории, которые я описал выше: или не программные, или очень дорогие. Мне специально нужно .doc для .pdf программно.
2

Просто хотел добавить, что я использовал библиотеки 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;
    }
  • 2
    Просто примечание для тех, кто не знает, что вам нужно установить Office на машине, чтобы использовать библиотеки Microsoft Interop.
2

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

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

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

  • 0
    Спасибо за это - отличное решение без использования Interop. Почему так сложно найти бесплатный конвертер docx в PDF?
  • 0
    Я возлагал на это большие надежды, но бесплатная версия ограничена 3 страницами вывода PDF. Полная версия очень дорога, если вам нужно неограниченное развертывание.
2

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

2

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

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

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

0

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

0

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

0

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

0

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

0

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

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

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

  • 0
    Aspose может работать, но это очень дорого.
-3

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

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

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

  • 0
    На самом деле я уже использую iTextSharp в своем проекте, но он не конвертирует Word.
  • 2
    Itextsharp использует AGPL, а не коммерческую и ненадлежащую ценовую лицензию

Ещё вопросы

Сообщество Overcoder
Наверх
Меню