2009-03-03 49 views
192

Tôi đã tìm thấy một số chương trình nguồn mở/phần mềm miễn phí cho phép bạn chuyển đổi các tệp .doc thành tệp .pdf, nhưng chúng là tất cả các loại trình điều khiển ứng dụng/máy in, không có SDK đính kèm.Làm cách nào để chuyển đổi các tệp Word thành PDF theo lập trình?

Tôi đã tìm thấy một số chương trình có SDK cho phép bạn chuyển đổi tệp .doc thành tệp .pdf, nhưng tất cả đều thuộc loại sở hữu độc quyền, $ 2,000 giấy phép hoặc phương tiện.

Có ai biết giải pháp lập trình sạch, rẻ tiền (tốt nhất là miễn phí) đối với vấn đề của tôi, sử dụng C# hoặc VB.NET không?

Cảm ơn!

+0

Kiểm tra xem [Pandoc] (http://pandoc.org/) có [bindings cho ngôn ngữ yêu thích của bạn] không (https://github.com/jgm/pandoc/wiki/Pandoc-Extras#pandoc- trình bao bọc và giao diện). Giao diện dòng lệnh cũng chết dễ dàng 'pandoc manual.docx -o manual.pdf' –

Trả lời

181

Sử dụng vòng lặp foreach thay vì vòng lặp for - nó đã giải quyết được sự cố của tôi.

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++; 
} 

Đây là một sửa đổi của một chương trình làm việc cho tôi. Nó sử dụng Word 2007 với cài đặt Save As PDF add-in. Nó tìm kiếm một thư mục cho các tệp .doc, mở chúng trong Word và sau đó lưu chúng dưới dạng PDF. Lưu ý rằng bạn sẽ cần phải thêm một tham chiếu đến Microsoft.Office.Interop.Word vào giải pháp.

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

Cảm ơn bạn! Tôi có thể chỉ cần đi với Aspose anyway, nếu nó nhanh hơn Word tự động hóa. Nhưng nếu tôi có thể chịu đựng một chút chậm chạp, tôi sẽ sử dụng giải pháp của bạn. Cảm ơn một lần nữa! –

+4

Vâng, nó không phải là nhanh nhất nhưng thật khó để đánh bại giá cả. :-) Mừng vì tôi có thể giúp. –

+1

Cảm ơn Eric - hữu ích –

1

Có vẻ là một số thông tin có liên quan ở đây:

Converting MS Word Documents to PDF in ASP.NET

Ngoài ra, với Office 2007 có publi sh đến chức năng PDF, tôi đoán bạn có thể sử dụng tự động hóa văn phòng để mở tệp * .DOC trong Word 2007 và Lưu dưới dạng PDF. Tôi không quá quan tâm đến tự động hóa văn phòng vì nó chậm và dễ bị treo, nhưng chỉ cần ném nó ra ngoài ...

+0

Mục đích có thể hiệu quả nhưng tốn kém. –

11

PDFCreator có thành phần COM, có thể gọi từ .NET hoặc VBScript (các mẫu có trong phần tải xuống).

Nhưng, có vẻ như với tôi rằng máy in chỉ là những gì bạn cần - chỉ cần trộn với Word's automation và bạn nên làm tốt.

+0

Thành phần COM này ở đâu? Và "mik" nghĩa là gì? Đó có phải là "trộn lẫn" không? –

+0

Thành phần COM được bao gồm trong phần tải xuống cùng với các mẫu. Và có, đó là vụ phải "trộn". –

+1

FYI - nếu bạn sử dụng tuyến đường này, PDFCreator sẽ bao gồm phần mềm độc hại trong trình cài đặt. Đây là vấn đề liên tục với PDFCreator kể từ năm 2009. –

-4

Tôi đã sử dụng iTextSharp để tạo tệp PDF trước đây. Đó là một cổng nguồn mở của iText từ thế giới Java và khá mạnh mẽ.

Tôi chưa thực hiện chuyển đổi Word sang PDF một cách rõ ràng, nhưng tôi đã tạo và xử lý các tệp PDF theo cách lập trình.

Đây là một link khác cho dự án.

+0

Tôi thực sự đã sử dụng iTextSharp trong dự án của mình, nhưng nó không chuyển đổi Word. –

+1

itextsharp sử dụng AGPL, không phải giấy phép định giá thương mại và lạm dụng – Rod

3

Khi tôi gặp phải một số vấn đề với tự động hóa văn phòng phía máy chủ, chúng tôi đã xem xét kỹ thuật được mô tả here on codeproject. Nó sử dụng phiên bản di động (có thể được triển khai thông qua xcopy) của OpenOffice kết hợp với macro. Mặc dù chúng tôi chưa thực hiện chuyển đổi, nhưng có vẻ rất promissing.

1

Tôi đã sử dụng ABCpdf là tùy chọn có lập trình và không quá đắt, $ 300/giấy phép. Nó hoạt động với OpenOffice hoặc trở lại Word nếu OpenOffice không có sẵn. Việc thiết lập hơi phức tạp một chút với quyền truy cập COM của OpenOffice, nhưng nó chắc chắn đáng để thuê ngoài một phần của ứng dụng.

1

Bổ trợ Microsoft PDF cho từ có vẻ là giải pháp tốt nhất hiện tại nhưng bạn nên cân nhắc rằng nó không chuyển đổi tất cả tài liệu từ thành pdf và trong một số trường hợp, bạn sẽ thấy sự khác biệt lớn giữa từ và đầu ra pdf. Rất tiếc, tôi không thể tìm thấy bất kỳ api nào có thể chuyển đổi tất cả tài liệu từ một cách chính xác. Giải pháp duy nhất tôi tìm thấy để đảm bảo chuyển đổi chính xác 100% là bằng cách chuyển đổi tài liệu thông qua trình điều khiển máy in. Nhược điểm là các tài liệu được xếp hàng đợi và chuyển đổi từng cái một, nhưng bạn có thể chắc chắn kết quả pdf chính xác giống như bố cục tài liệu từ. Cá nhân tôi thích sử dụng UDC (Bộ chuyển đổi tài liệu toàn cục) và cài đặt Foxit Reader (phiên bản miễn phí) trên máy chủ, sau đó in tài liệu bằng cách bắt đầu "Quy trình" và thiết lập thuộc tính Động từ "in". Bạn cũng có thể sử dụng FileSystemWatcher để đặt tín hiệu khi quá trình chuyển đổi hoàn tất.

26

Nói tóm lại cho người sử dụng vb.net, tùy chọn miễn phí (phải có văn phòng được cài đặt):

assembies

văn phòng Microsoft tải:

  • pia for office 2010
  • pia for office 2007

  • Thêm tham chiếu đến Microsoft.Office.Interop.Word.Application

  • Thêm sử dụng hoặc nhập khẩu (vb.net) tuyên bố Microsoft.Office.Interop.Word.Application

VB.NET dụ:

 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

Vẫn hoạt động trong năm 2015. Với Office 2013, bạn không cần phải tải xuống riêng PIA. –

+2

Và BOOM nếu nó mở một hộp thư và hỏi điều gì đó - ví dụ như trong một ứng dụng web ... hoặc làm 2 tài liệu cùng một lúc ... –

1

Chừng nào bạn có Word 2010 hoặc sau đó cài đặt bạn có thể sử dụng DocTo cung cấp một ứng dụng dòng lệnh để thực hiện việc này.

4

Tôi đã trải qua Word to PDF đau khi ai đó bán tôi với 10000 tệp từ để chuyển đổi sang PDF. Bây giờ tôi đã làm nó trong C# và sử dụng Word interop nhưng nó đã được làm chậm và bị rơi nếu tôi đã cố gắng sử dụng máy tính ở tất cả .. rất bực bội.

Điều này khiến tôi phát hiện ra mình có thể đổ vỡ cảnh báo và sự chậm chạp của họ ..... cho Excel tôi sử dụng (EPPLUS) và sau đó tôi phát hiện ra rằng bạn có thể nhận một công cụ miễn phí có tên Spire cho phép chuyển đổi sang PDF ... hạn chế!

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

+0

Cảm ơn điều này - giải pháp tuyệt vời mà không cần sử dụng Interop. Tại sao nó khó khăn như vậy để tìm một docx miễn phí để chuyển đổi PDF? – mbdavis

1

Tôi đã rất ấn tượng với Gembox (http://www.gemboxsoftware.com/), người cung cấp một phiên bản miễn phí hạn chế về quản lý tài liệu (bao gồm chuyển đổi pdf). Họ cũng làm thư viện cho bảng tính.Giấy phép 1 nhà phát triển nếu bạn vượt quá giới hạn của họ (mà tôi tưởng tượng bạn sẽ) mặc dù là khoảng $ 580 (http://www.gemboxsoftware.com/document/pricelist). OK, nó không miễn phí (hoặc theo ý kiến ​​của tôi tương đối rẻ tiền) nhưng nó rẻ hơn rất nhiều so với $ 2000. Theo tôi hiểu nó từ danh sách giá của họ không có tiền bản quyền hoặc cho triển khai máy chủ. Có thể là giá trị tiếp cận họ và xem họ sẽ làm một thỏa thuận nếu bạn không muốn cuộn của riêng bạn.

3

Chỉ muốn thêm rằng tôi đã sử dụng thư viện Microsoft.Interop, cụ thể là hàm ExportAsFixedFormat mà tôi không thấy được sử dụng trong chuỗi này.

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; 
    } 
+0

Chỉ cần một lưu ý cho những người không biết rằng bạn cần Office được cài đặt trên máy để sử dụng các thư viện Microsoft Interop. –

Các vấn đề liên quan