كيف يمكنني تحويل ملفات Word إلى PDF برمجياً؟[مغلق]

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

  •  03-07-2019
  •  | 
  •  

سؤال

لقد عثرت على العديد من البرامج مفتوحة المصدر/المجانية التي تسمح لك بتحويل ملفات .doc إلى ملفات .pdf، ولكنها جميعها من مجموعة متنوعة من برامج تشغيل التطبيقات/الطابعات، دون إرفاق SDK.

لقد وجدت العديد من البرامج التي تحتوي على SDK مما يسمح لك بتحويل ملفات .doc إلى ملفات .pdf، ولكنها جميعها من النوع الخاص، وتبلغ قيمة الترخيص 2000 دولار أو ما يقرب من ذلك.

هل يعرف أحد أي حل برمجي نظيف وغير مكلف (ويفضل أن يكون مجانيًا) لمشكلتي، باستخدام C# أو VB.NET؟

شكرًا!

هل كانت مفيدة؟

المحلول

استخدم حلقة 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++;
}

وهنا هو تعديل لبرنامج التي عملت بالنسبة لي. ويستخدم وورد 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، الخيار المجاني (يجب أن يكون لديك مكتب مثبت):

تحميل تجميعات مايكروسوفت أوفيس:

مثال 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()

سي كلينر لديه مكون COM، استدعاء من .NET أو فبسكريبت (عينات شملت في التحميل) .

ولكن، يبدو لي أن الطابعة ما تحتاجه - مجرد مزيج أنه مع <لأ href = "http://www.codeproject.com/KB/office/WordPrint.aspx" يختلط = "noreferrer" > كلمة في أتمتة ، ويجب أن يكون على ما يرام.

وأردت فقط أن أضيف أنني استخدمت المكتبات 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;
}

وذهبت من خلال كلمة للألم PDF عندما ألقى لي أحدهم مع 10000 الملفات كلمة للتحويل إلى PDF. الآن أنا فعلت هذا في C # و استخدام Word إمكانية التشغيل المتداخل ولكنه كان بطيئا وتحطمت إذا حاولت استخدام الكمبيوتر على الإطلاق .. محبط للغاية.

وهذا يؤدي بي إلى اكتشاف أتمكن من تفريغ interops وبطء بهم ..... لبرنامج Excel يمكنني استخدام (EPPLUS) ثم اكتشفت أنه يمكنك الحصول على أداة مجانية تسمى سباير التي تتيح تحويل إلى PDF ... مع القيود !

HTTP: //www.e-iceblue. كوم / إدخال / خالية من DOC-component.html # .VtAg4PmLRhE

يبدو أن هناك بعض المعلومات ذات الصلة هنا:

تحويل مستندات MS Word إلى PDF في ASP.NET

أيضًا، مع وجود وظيفة النشر إلى PDF في Office 2007، أعتقد أنه يمكنك استخدام التشغيل الآلي للمكتب لفتح ملف *.DOC في Word 2007 وحفظه بتنسيق PDF.أنا لست مهتمًا جدًا بأتمتة المكاتب لأنها بطيئة وعرضة للتعليق، ولكن مجرد طرح ذلك هناك ...

مايكروسوفت PDF الإضافية في لكلمة ويبدو أن أفضل الحلول في الوقت الراهن ولكن يجب أن تأخذ بعين الاعتبار أنه لا يتم تحويل جميع الوثائق كلمة بشكل صحيح لقوات الدفاع الشعبي، وفي بعض الحالات سترون الفرق كبير بين الكلمة والإخراج بي دي إف. للأسف لم أجد أي API التي من شأنها تحويل جميع الوثائق كلمة بشكل صحيح. وكان الحل الوحيد الذي وجدت لضمان تحويل صحيحة 100٪ عن طريق تحويل الوثائق من خلال برنامج تشغيل الطابعة. الجانب السلبي هو أن وثائق يتم بقائمة الانتظار وتحويلها واحدا تلو الآخر، ولكن يمكنك أن تتأكد من قوات الدفاع الشعبي أدى هو بالضبط نفس تخطيط المستند كلمة. وأنا شخصيا يفضل استخدام UDC (العالمي تحويل وثيقة) وتثبيت القارئ (نسخة مجانية) على الخادم ثم أيضا طباعة المستندات عن طريق بدء "عملية" وتعيين الخاصية الفعل إلى "طباعة". يمكنك أيضا استخدام 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