Làm cách nào để chuyển đổi các tệp Word thành PDF theo chương trình? [đóng cửa]


221

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

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ả chúng đều thuộc loại độc quyền, $ 2.000 một giấy phép hoặc ở đó.

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

Cảm ơn!


1
Kiểm tra xem Pandoccác ràng buộc cho ngôn ngữ yêu thích của bạn . Giao diện dòng lệnh cũng dễ chếtpandoc manual.docx -o manual.pdf
Đại tá Panic

Ngoài ra, hãy kiểm tra SDK GemBox.Document . Nó có một phiên bản miễn phí và một phiên bản rẻ tiền. Nó không sử dụng trình điều khiển máy in hay ms office để chuyển đổi các tệp Word thành PDF.
hertzogth

Bạn có thể sử dụng docx2pdf để thực hiện chuyển đổi này: github.com/AlJohri/docx2pdf
Al Johri

Câu trả lời:


204

Sử dụng vòng lặp foreach thay vì vòng lặp for - nó đã giải quyết vấn đề 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 bổ trợ Save As PDF được cài đặt. 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 thêm một tham chiếu đến Microsoft.Office.Interop.Word cho 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! Dù sao tôi cũng có thể đi với Aspose, nếu nó nhanh hơn Word tự động. Nhưng nếu tôi có thể chịu đựng được một chút chậm chạp, tôi sẽ hoàn toàn sử dụng giải pháp của bạn. Cảm ơn một lần nữa!
Shaul Behr

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

10
Với Office 2007 SP2, bạn không còn cần lưu dưới dạng tải xuống PDF. Tôi cũng đã sử dụng kỹ thuật này thành công cho Excel và Powerpoint.
RichardOD

5
Bạn đã sử dụng phương pháp này trên một máy chủ có ứng dụng web chưa? Tôi đang nhận được rất nhiều vấn đề không đề cập đến nó không được đề xuất bởi MS. support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2 Tôi nghe nói ASPose rất tuyệt nhưng nó khá thân yêu.
Mitchu

6
Ừm ... nếu từ không được cài đặt, tôi nghĩ việc đóng gói lắp ráp interop sẽ là ít lo lắng nhất của bạn. Mã này YÊU CẦU từ được cài đặt.
BrainSlugs83

35

Để tổng hợp cho người dùng vb.net, tùy chọn miễn phí (phải có cài đặt văn phòng):

Tải xuống văn phòng Microsoft:

Ví dụ 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
Vẫn hoạt động vào năm 2015. Với Office 2013, bạn không cần tải xuống PIA riêng.
Adam Anderson

3
Và BÙM nếu nó mở một hộp thông báo và hỏi một cái 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 ...
Stefan Steiger

Tùy chọn freemium (thông qua nodejs và edge.js hoặc Javascript.NET) là npmjs.com/package/@nativingocument/docx-wasm (Không cần Word)
JasonPlutext

14

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

Nhưng, đối với tôi, máy in chính là thứ bạn cần - chỉ cần kết hợp nó với tự động hóa của Word , và bạn sẽ thấy ổn.


Thành phần COM này ở đâu? Và "mik" nghĩa là gì? Điều đó có nghĩa là "trộn"?
Shaul Behr

Thành phần COM được bao gồm trong tải xuống, cùng với các mẫu. Và vâng, đó được cho là "hỗn hợp".
Mark Brackett

4
FYI - nếu bạn đi theo lộ trình này, PDFCreator sẽ gói phần mềm độc hại trong trình cài đặt. Đây là một vấn đề đang diễn ra với PDFCreator kể từ năm 2009.
Phil Gorley

2
@PhilGorley Phần mềm độc hại? và câu trả lời này là +8 ...
Mzn

@Mzn - FWIW, chú ý và bỏ chọn các cài đặt addon luôn hoạt động với tôi. Tôi không thấy nó khác với Oracle crap trong trình cài đặt Java; nó gây phiền nhiễu, nhưng không đáng để tránh phần mềm đối với tôi
Mark Brackett

12

Chỉ muốn thêm rằng tôi đã sử dụng các 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 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
Chỉ cần một lưu ý cho những người không biết rằng bạn cần cài đặt Office trên máy để sử dụng các thư viện Microsoft Interop.
Sam Ruither

Đẹp! Tôi đề nghị cài đặt app.Visible = false;và thêm một cuộc gọi đến app.Quit();trong khối cuối cùng.
Dan Korn


5

Tôi đã trải qua nỗi đau từ Word đến PDF khi ai đó đổ cho tôi 10000 tập tin từ để chuyển đổi thành PDF. Bây giờ tôi đã làm điều đó trong C # và sử dụng Word interop nhưng nó bị chậm và bị sập nếu tôi cố gắng sử dụng PC .. rất bực bội.

Điều này dẫn tôi đến việc phát hiện ra tôi có thể kết xuất các giao diện và sự chậm chạp của chúng ..... đối với Excel tôi sử dụng (EPPLUS) và sau đó tôi phát hiện ra rằng bạn có thể có được một công cụ miễn phí có tên Spire cho phép chuyển đổi sang PDF ... với những hạn chế!

http://www.e-iceblue.com/Int sinhe / free-doc-compentent.html#.VtAg4PmLRhE


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

Tôi đã hy vọng rất cao cho điều này nhưng phiên bản miễn phí chỉ giới hạn ở 3 trang đầu ra PDF. Phiên bản đầy đủ rất đắt tiền nếu bạn cần triển khai không giới hạn.
xay22

mài22 GemBox.Document cũng có phiên bản miễn phí với giới hạn kích thước và phiên bản trả phí. Tuy nhiên, nó bao gồm triển khai miễn phí tiền bản quyền để bạn có thể xây dựng và xuất bản số lượng dự án không giới hạn mà không mất thêm chi phí.
hertzogth

3

Mã và giải pháp dễ dàng sử dụng Microsoft.Office.Interop.Wordđể hội tụ WORD trong 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);

}

Thêm thủ tục này để giải phóng bộ nhớ:

private void releaseObject(object obj)
{
  try
  {
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
      obj = null;
  }
  catch (Exception ex)
  {
      //TODO
  }
  finally
  {
     GC.Collect();
  }
}

Có nhất thiết phải gọi GC.Collect không? Không có cách nào khác để chỉ đánh dấu phần bộ nhớ có liên quan đến điều này để giải phóng trên GC tự động tiếp theo?
Preza8

2

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

Chuyển đổi tài liệu MS Word thành PDF trong ASP.NET

Ngoài ra, với Office 2007 đã xuất bản thành 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 thích 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 khỏi đó ...


Aspose có thể hoạt động, nhưng nó rất tốn kém.
Shaul Behr

1

Bổ trợ Microsoft PDF cho từ dường như là giải pháp tốt nhất hiện nay nhưng bạn nên cân nhắc rằng nó không chuyển đổi chính xác tất cả cá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à pdf đầu ra. Thật không may, tôi không thể tìm thấy bất kỳ api nào sẽ chuyển đổi tất cả cá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 là chính xác 100% là chuyển đổi các 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 và chuyển đổi từng cái một, nhưng bạn có thể chắc chắn rằng pdf kết quả hoàn toàn giống với bố cục tài liệu từ. Cá nhân tôi thích sử dụng UDC (Trình chuyển đổi tài liệu chung) 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à đặt thuộc tính Động từ của nó thành "in".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.