Bagaimana cara mengonversi file Word ke PDF secara terprogram? [Tutup]

221

Saya telah menemukan beberapa program open-source / freeware yang memungkinkan Anda untuk mengkonversi file .doc ke file .pdf, tetapi semuanya adalah variasi aplikasi / driver printer, tanpa SDK terpasang.

Saya telah menemukan beberapa program yang memiliki SDK yang memungkinkan Anda untuk mengkonversi file .doc ke file .pdf, tetapi semuanya adalah jenis hak milik, $ 2.000 lisensi atau sekitar itu.

Apakah ada yang tahu solusi programatik bersih, murah (lebih disukai gratis) untuk masalah saya, menggunakan C # atau VB.NET?

Terima kasih!

Shaul Behr
sumber
1
Periksa apakah Pandoc memiliki binding untuk bahasa favorit Anda . Antarmuka baris perintah juga mudah matipandoc manual.docx -o manual.pdf
Kolonel Panic
Juga, periksa SDK GemBox.Document . Ini memiliki versi gratis dan versi murah. Itu tidak menggunakan driver printer atau MS Office untuk mengkonversi file Word ke PDF.
hertzogth
Anda dapat menggunakan docx2pdf untuk melakukan konversi ini: github.com/AlJohri/docx2pdf
Al Johri

Jawaban:

204

Gunakan foreach loop sebagai ganti for loop - itu memecahkan masalah saya.

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

Ini adalah modifikasi dari program yang bekerja untuk saya. Menggunakan Word 2007 dengan add-in Save As PDF diinstal. Itu mencari direktori untuk file .doc, membukanya di Word dan kemudian menyimpannya sebagai PDF. Perhatikan bahwa Anda perlu menambahkan referensi ke Microsoft.Office.Interop.Word ke solusinya.

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;
Eric Ness
sumber
3
Terima kasih! Saya boleh saja menggunakan Aspose, jika lebih cepat daripada otomatisasi Word. Tetapi jika saya bisa mentolerir sedikit kelambatan, saya akan menggunakan solusi Anda. Terima kasih lagi!
Shaul Behr
4
Ya, ini bukan yang tercepat tetapi sulit untuk mengalahkan harganya. :-) Senang saya bisa membantu.
Eric Ness
10
Dengan Office 2007 SP2 Anda tidak perlu lagi menyimpan sebagai unduhan PDF. Saya juga berhasil menggunakan teknik ini untuk Excel dan Powerpoint.
RichardOD
5
Sudahkah Anda menggunakan metode ini di server dengan aplikasi web? Saya mendapatkan banyak masalah tidak menyebutkan tidak direkomendasikan oleh MS. support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2 Saya mendengar ASPose bagus tetapi cukup sayang.
Prabu
6
Um ... jika kata tidak diinstal, saya pikir mengemas perakitan interop akan menjadi yang paling Anda khawatirkan. Kode ini MEMBUTUHKAN kata yang akan diinstal.
BrainSlugs83
35

Untuk jumlah itu untuk pengguna vb.net, opsi gratis (harus memiliki kantor diinstal):

Unduhan perakitan kantor Microsoft:

  • pia untuk kantor 2010
  • pia untuk kantor 2007

  • Tambahkan referensi ke Microsoft.Office.Interop.Word.Application

  • Tambahkan pernyataan menggunakan atau mengimpor (vb.net) ke Microsoft.Office.Interop.Word.Application

Contoh 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()
Elger Mensonides
sumber
3
Masih berfungsi pada tahun 2015. Dengan Office 2013 Anda tidak perlu mengunduh PIA secara terpisah.
Adam Anderson
3
Dan BOOM jika membuka kotak pesan dan menanyakan sesuatu - misalnya dalam aplikasi web ... atau melakukan 2 dokumen pada saat yang sama ...
Stefan Steiger
Opsi freemium (via nodejs dan edge.js, atau Javascript.NET) adalah npmjs.com/package/@nativedocuments/docx-wasm (Tidak perlu untuk Word)
JasonPlutext
14

PDFCreator memiliki komponen COM, dapat dipanggil dari .NET atau VBScript (sampel disertakan dalam unduhan).

Tetapi, bagi saya kelihatannya sebuah printer adalah yang Anda butuhkan - padukan saja itu dengan otomatisasi Word , dan Anda harus melakukannya dengan baik.

Mark Brackett
sumber
dimana komponen COM ini? Dan apa artinya "mik"? Apakah itu dimaksudkan sebagai "campuran"?
Shaul Behr
Komponen COM termasuk dalam unduhan, bersama dengan sampel. Dan ya, itu seharusnya "campuran".
Mark Brackett
4
FYI - jika Anda memilih rute ini, PDFCreator bundel malware di installer. Ini telah menjadi masalah berkelanjutan dengan PDFCreator sejak 2009.
Phil Gorley
2
@ Malphor Malware? dan jawaban ini +8 ...
Mzn
@Mzn - FWIW, memperhatikan dan menghapus centang pada addon installs selalu bekerja untuk saya. Saya tidak melihatnya berbeda dari Oracle bundling crap di installer Java; itu menjengkelkan, tetapi tidak layak untuk menghindari perangkat lunak untuk saya (ya, oke, adware PdfCreator mungkin jauh lebih berguna dan lebih mengganggu daripada apa pun yang mendorong Oracle hari ini ... Saya masih tidak ingin salah satu dari mereka).
Mark Brackett
12

Hanya ingin menambahkan bahwa saya menggunakan perpustakaan Microsoft.Interop, khususnya fungsi ExportAsFixedFormat yang tidak saya lihat digunakan di utas ini.

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;
}
zeta
sumber
7
Hanya catatan bagi mereka yang tidak tahu bahwa Anda perlu Office diinstal pada mesin untuk menggunakan perpustakaan Microsoft Interop.
Sam Rueby
Bagus! Saya menyarankan pengaturan app.Visible = false;dan menambahkan panggilan ke app.Quit();dalam blok akhirnya.
Dan Korn
5

Saya mengalami Word to PDF pain ketika seseorang mencampakkan saya dengan 10.000 file word untuk dikonversi ke PDF. Sekarang saya melakukannya di C # dan menggunakan interop Word tetapi lambat dan macet jika saya mencoba menggunakan PC sama sekali .. sangat frustasi.

Ini menuntun saya untuk menemukan bahwa saya dapat membuang interops dan kelambatannya ..... untuk Excel yang saya gunakan (EPPLUS) dan kemudian saya menemukan bahwa Anda bisa mendapatkan alat gratis bernama Spire yang memungkinkan mengkonversi ke PDF ... dengan batasan!

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

Ggalla1779
sumber
Terima kasih untuk ini - solusi hebat tanpa menggunakan Interop. Mengapa begitu sulit untuk menemukan converter docx to PDF gratis?
mbdavis
Saya memiliki harapan besar untuk ini tetapi versi gratis terbatas pada 3 halaman dari output PDF. Versi lengkapnya sangat mahal jika Anda membutuhkan penyebaran yang tidak terbatas.
grinder22
grinder22 GemBox.Document juga memiliki versi gratis dengan batasan ukuran dan versi berbayar. Namun, itu termasuk penggunaan bebas royalti sehingga Anda dapat membangun dan mempublikasikan proyek dalam jumlah tak terbatas tanpa biaya tambahan.
hertzogth
3

Kode dan solusi mudah digunakan Microsoft.Office.Interop.Worduntuk mengonversi kata dalam 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);

}

Tambahkan prosedur ini untuk melepaskan memori:

private void releaseObject(object obj)
{
  try
  {
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
      obj = null;
  }
  catch (Exception ex)
  {
      //TODO
  }
  finally
  {
     GC.Collect();
  }
}
daniele3004
sumber
Apakah perlu menelepon GC.Collect? Apakah tidak ada cara lain untuk hanya menandai bagian memori yang terkait dengan ini untuk membebaskan pada GC otomatis berikutnya?
Preza8
2

Tampaknya ada beberapa informasi relevan di sini:

Konversi Dokumen MS Word ke PDF dalam ASP.NET

Juga, dengan Office 2007 yang mempublikasikan fungsi PDF, saya kira Anda bisa menggunakan otomatisasi kantor untuk membuka file * .DOC di Word 2007 dan Save as PDF. Saya tidak terlalu tertarik pada otomatisasi kantor karena lambat dan cenderung menggantung, tetapi hanya membuangnya di luar sana ...

MikeW
sumber
Aspose mungkin berfungsi, tetapi sangat mahal.
Shaul Behr
1

Microsoft PDF add-in untuk kata tampaknya menjadi solusi terbaik untuk saat ini tetapi Anda harus mempertimbangkan bahwa itu tidak mengkonversi semua dokumen kata dengan benar ke pdf dan dalam beberapa kasus Anda akan melihat perbedaan besar antara kata dan pdf keluaran. Sayangnya saya tidak dapat menemukan api yang akan mengkonversi semua dokumen kata dengan benar. Satu-satunya solusi yang saya temukan untuk memastikan konversi 100% benar adalah dengan mengonversi dokumen melalui driver printer. Kelemahannya adalah bahwa dokumen di-antri dan dikonversi satu per satu, tetapi Anda dapat yakin bahwa pdf yang dihasilkan persis sama dengan tata letak dokumen kata. Saya pribadi lebih suka menggunakan UDC (Universal document converter) dan menginstal Foxit Reader (versi gratis) di server juga kemudian mencetak dokumen dengan memulai "Proses" dan mengatur properti Verb-nya untuk "mencetak".

Arvand
sumber