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

StackOverflow https://stackoverflow.com/questions/607669

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Спасибо!

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Простой код и решение с использованием 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();
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top