Word dosyalarını programlı olarak PDF'ye nasıl dönüştürebilirim? [kapalı]


222

.Doc dosyalarını .pdf dosyalarına dönüştürmenize izin veren birkaç açık kaynaklı / ücretsiz program buldum, ancak hepsi SDK bağlı olmayan uygulama / yazıcı sürücüsü çeşididir.

.Doc dosyalarını .pdf dosyalarına dönüştürmenize izin veren bir SDK'ya sahip birkaç program buldum, ancak hepsi tescilli tipte, 2,000 $ lisans veya civarında.

C # veya VB.NET kullanarak sorunum için temiz, ucuz (tercihen ücretsiz) programatik bir çözüm bilen var mı?

Teşekkürler!


1
Olmadığını kontrol edin Pandoc sahiptir favori dil için bağlantıları . Komut satırı arayüzü de çok kolaypandoc manual.docx -o manual.pdf
Albay Panic

Ayrıca, GemBox.Document SDK'yı kontrol edin . Ücretsiz bir sürümü ve ucuz bir sürümü var. Word dosyalarını PDF'ye dönüştürmek için bir yazıcı sürücüsü veya ms office kullanmaz.
hertzogth

Bu dönüşümü yapmak için docx2pdf komutunu kullanabilirsiniz: github.com/AlJohri/docx2pdf
Al

Yanıtlar:


204

For döngüsü yerine foreach döngüsü kullanın - sorunumu çözdü.

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

İşte benim için çalışan bir programın modifikasyonu. Word 2007'yi PDF Olarak Kaydet eklentisi yüklü olarak kullanır. Bir dizinde .doc dosyaları arar, bunları Word'de açar ve sonra PDF olarak kaydeder. Çözüme Microsoft.Office.Interop.Word için bir başvuru eklemeniz gerektiğini unutmayın.

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
Teşekkür ederim! Word otomasyonundan daha hızlıysa, Aspose ile yine de gidebilirim. Ama eğer biraz yavaşlığı tolere edebilirsem, çözümünüzü kullanacağım. Tekrar teşekkürler!
Behr

4
Evet, en hızlı değil ama fiyatı yenmek zor. :-) Yardımcı olduğuma sevindim.
Eric Ness

10
Office 2007 SP2 ile artık PDF olarak kaydetmeye gerek yoktur. Bu tekniği Excel ve Powerpoint için de başarıyla kullandım.
RichardOD

5
Bu yöntemi bir web uygulaması olan bir sunucuda kullandınız mı? Ben MS tarafından tavsiye edilmez bahsetmiyorum sorunları bir sürü alıyorum. support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2 ASPose'un harika ama oldukça değerli olduğunu duydum.
Prabu

6
Hmm ... Eğer kelime kurulu değilse, birlikte çalışma derlemesini paketleme endişelerinizin en azı olacağını düşünüyorum. Bu kod yüklenecek kelimeyi GEREKTİRİR.
BrainSlugs83

35

Vb.net kullanıcıları için özetlemek gerekirse, ücretsiz seçenek (ofis yüklü olmalıdır):

Microsoft Office derlemeleri indir:

  • office 2010 için pia
  • ofis 2007 için pia

  • Microsoft.Office.Interop.Word.Application için başvuru ekleyin

  • Microsoft.Office.Interop.Word.Application dosyasına kullanarak veya import (vb.net) deyimini ekleyin

VB.NET örneği:

        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
Office 2013 ile PIA'yı ayrı ayrı indirmenize gerek yoktur.
Adam Anderson

3
Ve bir mesaj kutusu açar ve bir şey sorarsa BOOM - örneğin bir web uygulamasında ... veya aynı anda 2 belge yaparsa ...
Stefan Steiger

Bir freemium seçeneği (nodejs ve edge.js veya Javascript.NET aracılığıyla) npmjs.com/package/@nativedocuments/docx-wasm (Word'e gerek yok)
JasonPlutext

14

PDF yaratıcısı , .NET veya VBScript'ten çağrılabilen bir COM bileşenine sahiptir (örnekler indirmeye dahildir).

Ama bana öyle geliyor ki, bir yazıcı sadece ihtiyacınız olan şeydir - bunu Word'ün otomasyonu ile karıştırın ve gitmek için iyi olmalısınız.


bu COM bileşeni nerede? Peki "mik" ne demek? Bu "karışık" mı demekti?
Shaul Behr

COM bileşeni, örneklerle birlikte indirmeye dahil edilmiştir. Ve evet, bunun "karma" olması gerekiyordu.
Mark Brackett

4
FYI - Bu rotaya giderseniz PDFCreator yükleyicide kötü amaçlı yazılımlar paketler. Bu, 2009'dan beri PDFCreator ile devam eden bir konudur.
Phil Gorley

2
@PhilGorley Kötü Amaçlı Yazılım? ve bu cevap +8 ...
Mzn

@Mzn - FWIW, dikkat etmek ve eklenti yüklemelerinin işaretini kaldırmak her zaman benim için çalışıyor. Java yükleyicisindeki Oracle paketleme bokundan farklı olarak görmüyorum; bu can sıkıcı, ama benim için yazılım kaçınmak değmez (evet, PdfCreator adware muhtemelen Oracle bu gün itti ne daha sonsuz ve daha müdahaleci daha az ... Ben hala bunlardan birini istemiyorum).
Mark Brackett

12

Sadece Microsoft.Interop kütüphaneleri, özellikle bu iş parçacığında kullanılan görmedim ExportAsFixedFormat işlevi kullandığımı eklemek istedim.

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
Microsoft Interop kitaplıklarını kullanmak için makinede Office yüklü olması gerektiğini bilmeyenler için bir not.
Sam Rueby

Güzel! Sonunda app.Visible = false;bir çağrı ayarlayıp eklemenizi öneririm app.Quit();.
Dan Korn


5

Birisi beni PDF'ye dönüştürmek için 10000 kelime dosyasıyla terk ettiğinde Word'den PDF'ye acı verdim. Şimdi C # yaptım ve Word birlikte çalışma kullanılan ama yavaş ve PC hiç kullanmaya çalıştım eğer çöktü .. çok sinir bozucu.

Bu beni birlikte çalışabilirlik ve onların yavaşlığı dökümü keşfetmeye götürdü ..... Excel için (EPPLUS) kullanıyorum ve sonra PDF'ye dönüştürmeye izin veren Spire adlı ücretsiz bir araç alabileceğinizi keşfettim ...

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


Bunun için teşekkürler - Interop kullanmadan harika bir çözüm. Ücretsiz bir docx PDF dönüştürücüsü bulmak neden bu kadar zor?
mbdavis

Bunun için büyük umutlarım vardı ama ücretsiz sürüm 3 sayfa PDF çıktı ile sınırlıdır. Sınırsız dağıtımlara ihtiyacınız varsa tam sürüm çok pahalıdır.
öğütücü22

grinder22 GemBox.Document ayrıca boyut sınırlaması ve ücretli bir sürümü ile ücretsiz bir sürümü var. Bununla birlikte, telifsiz bir dağıtım içerir, böylece ek ücret ödemeden sınırsız sayıda proje oluşturabilir ve yayınlayabilirsiniz.
hertzogth

3

Microsoft.Office.Interop.WordPDF'de WORD dönüştürmek için kolay kod ve çözüm

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);

}

Belleği serbest bırakmak için bu prosedürü ekleyin:

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

GC.Collect'i aramak gerekli mi? Belleğin yalnızca bir sonraki otomatik GC'de serbest bırakmak için bununla ilgili kısmını işaretlemenin farklı bir yolu yok mu?
Preza8

2

Burada bazı alakalı bilgiler var gibi görünüyor:

ASP.NET'te MS Word Belgelerini PDF'ye Dönüştürme

Ayrıca, Office 2007'nin PDF'de yayımlanması işlevselliğiyle, sanırım ofis otomasyonunu Word 2007'de * .DOC dosyasını açıp PDF olarak Kaydet'i kullanabilirsiniz. Yavaş ve asmaya eğilimli olduğu için ofis otomasyonuna çok hevesli değilim, ama sadece oraya atıyorum ...


Aspose işe yarayabilir, ancak son derece pahalıdır.
Shaul Behr

1

Word için Microsoft PDF eklentisi şimdilik en iyi çözüm gibi görünüyor, ancak tüm word belgelerini doğru bir şekilde pdf'ye dönüştürmediğini ve bazı durumlarda word ve çıktı pdf arasında büyük bir fark göreceğinizi göz önünde bulundurmalısınız. Ne yazık ki, tüm kelime belgelerini doğru bir şekilde dönüştürecek herhangi bir API bulamadım. Dönüştürmenin% 100 doğru olmasını sağlamak için bulduğum tek çözüm, belgeleri bir yazıcı sürücüsü aracılığıyla dönüştürmektir. Dezavantajı, belgelerin tek tek kuyruğa alınması ve dönüştürülmesidir, ancak sonuçta ortaya çıkan pdf'nin word belgesi düzeniyle tamamen aynı olduğundan emin olabilirsiniz. Şahsen UDC (Universal belge dönüştürücü) kullanmayı tercih ettim ve Foxit Reader'ı (ücretsiz sürüm) sunucuya da yükledim, ardından bir "İşlem" başlatarak ve Verb özelliğini "yazdır" olarak ayarlayarak belgeleri yazdırdım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.