Як перетворити файли Word у PDF програмно? [зачинено]


221

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

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

Хтось знає про чисте, недороге (бажано безкоштовно) програмне рішення моєї проблеми, використовуючи C # або VB.NET?

Дякую!


1
Перевірте, чи Pandoc має прив’язки до вашої улюбленої мови . Інтерфейс командного рядка також мертвий легкоpandoc manual.docx -o manual.pdf
полковник Паніка

Також перевірте SDK GemBox.Document . У ньому є безкоштовна версія і недорога версія. Він не використовує ні драйвер принтера, ні MS Office для перетворення файлів Word у PDF.
Херцогт

Ви можете використовувати docx2pdf для здійснення цього перетворення: github.com/AlJohri/docx2pdf
Аль-Джонрі

Відповіді:


204

Використовуйте цикл foreach замість петлі - це вирішило мою проблему.

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 із встановленим додатком Save As 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 SP2 більше не потрібно зберігати як завантаження у форматі PDF. Я також успішно використовував цю техніку для Excel та Powerpoint.
RichardOD

5
Чи використовували ви цей метод на сервері з веб-додатком? Я отримую багато питань, не згадуючи його, які не рекомендується MS. support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2 Я чув, що ASPose - це чудово, але це досить дорого.
Прабу

6
Гм ... якщо слово не встановлено, я думаю, що упаковка збірки interop буде найменшою вашою турботою. Цей код ЗАБЕЗПЕЧАЄ встановити слово.
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 документи одночасно ...
Стефан Штайгер

Параметр freemium (через nodejs і edge.js або Javascript.NET) - це npmjs.com/package/@nativedocuments/docx-wasm (Не потрібно в Word)
JasonPlutext

14

PDFCreator має COM-компонент, який можна викликати з .NET або VBScript (зразки, що входять до завантаження).

Але, мені здається, що принтер - це саме те, що вам потрібно - просто змішайте це з автоматизацією Word , і вам слід погодитися.


де цей компонент COM? А що означає "mik"? Це означало "змішати"?
Шауль Бехр

Компонент COM включений у завантаження разом із зразками. І так, це мало бути "міксом".
Марк Брокетт

4
FYI - якщо ви йдете цим маршрутом, PDFCreator постачає зловмисне програмне забезпечення в інсталятор. Ця проблема з PDFCreator триває з 2009 року.
Філ Горлі

2
@PhilGorley Зловмисне програмне забезпечення? і ця відповідь +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();остаточного блоку.
Дан Корн

7

9
Дякую, але всі пропозиції там підпадають під дві категорії, які я описав вище: або не програмні, або надзвичайно дорогі. Мені спеціально потрібен .doc для .pdf програмно.
Шаул Бехр

5

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

Це привело мене до виявлення, що я можу скинути інтеропи та їх повільність ..... для Excel, який я використовую (EPPLUS), і тоді я виявив, що ви можете отримати безкоштовний інструмент під назвою Spire, який дозволяє конвертувати в PDF ... з обмеженнями!

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


Дякую за це - чудове рішення без використання Interop. Чому так важко знайти безкоштовний docx в конвертер PDF?
mbdavis

Я покладав на це великі надії, але безкоштовна версія обмежена 3 сторінками виводу PDF. Повна версія дуже дорога, якщо вам потрібно необмежене розгортання.
шліфувальник22

grinder22 GemBox.Document також має безкоштовну версію з обмеженням розміру та платну версію. Однак, воно включає безоплатне розгортання, так що ви можете створювати та публікувати необмежену кількість проектів без зайвих витрат.
Херцогт

3

Простий код та рішення за допомогою Microsoft.Office.Interop.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();
  }
}

Чи потрібно дзвонити GC.Collect? Чи не існує іншого способу позначити лише ту частину пам'яті, яка пов'язана з цим, для звільнення на наступному автоматичному ПК?
Preza8

2

Тут, здається, є якась відповідна інформація:

Перетворення документів MS Word в PDF в ASP.NET

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


Можливо, це може спрацювати, але це дуже дорого.
Шаул Бехр

1

Додаток Microsoft PDF до слова, здається, є найкращим рішенням на даний момент, але слід врахувати, що він не перетворює всі текстові документи правильно в pdf, а в деяких випадках ви побачите величезну різницю між словом і вихідним PDF. На жаль, я не зміг знайти жодного api, який би правильно перетворив усі текстові документи. Єдине рішення, яким я переконався, що перетворення було 100% правильним, було перетворення документів через драйвер принтера. Мінус полягає в тому, що документи ставляться в чергу і перетворюються по черзі, але ви можете бути впевнені, що отриманий pdf точно такий же, як і макет документа Word. Я особисто вважав за краще використовувати UDC (універсальний конвертер документів) та встановив Foxit Reader (безкоштовна версія) на сервер, а потім надрукував документи, запустивши "Process" і встановивши його властивість Verb на "print".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.