Wie konvertiere ich Word-Dateien programmgesteuert in PDF? [geschlossen]

221

Ich habe mehrere Open-Source- / Freeware-Programme gefunden, mit denen Sie DOC-Dateien in PDF-Dateien konvertieren können, aber sie gehören alle zur Anwendungs- / Druckertreibervariante, ohne dass ein SDK angehängt ist.

Ich habe mehrere Programme gefunden, die über ein SDK verfügen, mit dem Sie DOC-Dateien in PDF-Dateien konvertieren können, aber alle sind proprietär, etwa 2.000 US-Dollar pro Lizenz oder so.

Kennt jemand eine saubere, kostengünstige (vorzugsweise kostenlose) programmatische Lösung für mein Problem mit C # oder VB.NET?

Vielen Dank!

Shaul Behr
quelle
1
Überprüfen Sie, ob Pandoc hat Bindungen für Ihre bevorzugte Sprache . Die Kommandozeilenschnittstelle ist auch kinderleichtpandoc manual.docx -o manual.pdf
Colonel Panic
Überprüfen Sie auch das GemBox.Document SDK. Es hat eine kostenlose Version und eine kostengünstige Version. Es werden weder ein Druckertreiber noch MS Office verwendet, um Word-Dateien in PDF zu konvertieren.
Hertzogth
Sie können docx2pdf verwenden, um diese Konvertierung
durchzuführen

Antworten:

204

Verwenden Sie eine foreach-Schleife anstelle einer for-Schleife - dies hat mein Problem gelöst.

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

Hier ist eine Modifikation eines Programms, das für mich funktioniert hat. Es verwendet Word 2007 mit dem installierten Add-In "Als PDF speichern" . Es durchsucht ein Verzeichnis nach DOC-Dateien, öffnet sie in Word und speichert sie dann als PDF. Beachten Sie, dass Sie der Lösung einen Verweis auf Microsoft.Office.Interop.Word hinzufügen müssen.

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
quelle
3
Danke dir! Ich kann sowieso nur mit Aspose gehen, wenn es schneller als Word-Automatisierung ist. Aber wenn ich ein bisschen Langsamkeit tolerieren kann, werde ich Ihre Lösung häufig verwenden. Danke noch einmal!
Shaul Behr
4
Ja, es ist nicht das schnellste, aber es ist schwer, den Preis zu übertreffen. :-) Froh, dass ich helfen konnte.
Eric Ness
10
Mit Office 2007 SP2 müssen Sie nicht mehr als PDF herunterladen. Ich habe diese Technik auch erfolgreich für Excel und Powerpoint verwendet.
RichardOD
5
Haben Sie diese Methode auf einem Server mit einer Webanwendung verwendet? Ich bekomme viele Probleme, die nicht erwähnt werden und von MS nicht empfohlen werden. support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2 Ich habe gehört, ASPose ist großartig, aber es ist ziemlich teuer.
Prabu
6
Ähm ... wenn Word nicht installiert ist, ist das Verpacken der Interop-Assembly meiner Meinung nach die geringste Sorge. Dieser Code erfordert die Installation eines Wortes.
BrainSlugs83
35

Um es für vb.net-Benutzer zusammenzufassen, die kostenlose Option (Office muss installiert sein):

Microsoft Office Assembies herunterladen:

  • Pia für Büro 2010
  • Pia für Büro 2007

  • Verweis auf Microsoft.Office.Interop.Word.Application hinzufügen

  • Fügen Sie die Anweisung using oder import (vb.net) zu Microsoft.Office.Interop.Word.Application hinzu

VB.NET-Beispiel:

        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
quelle
3
Funktioniert auch 2015 noch. Mit Office 2013 müssen Sie die PIA nicht separat herunterladen.
Adam Anderson
3
Und BOOM, wenn es eine Messagebox öffnet und etwas fragt - zum Beispiel in einer Webanwendung ... oder 2 Dokumente gleichzeitig macht ...
Stefan Steiger
Eine Freemium-Option (über nodejs und edge.js oder Javascript.NET) ist npmjs.com/package/@nativedocuments/docx-wasm (keine Notwendigkeit für Word)
JasonPlutext
14

PDFCreator verfügt über eine COM-Komponente, die über .NET oder VBScript aufgerufen werden kann (Beispiele im Download enthalten).

Aber es scheint mir, dass ein Drucker genau das ist, was Sie brauchen - mischen Sie das einfach mit der Automatisierung von Word , und Sie sollten bereit sein, loszulegen.

Mark Brackett
quelle
Wo ist diese COM-Komponente? Und was bedeutet "mik"? War das "Mix"?
Shaul Behr
Die COM-Komponente ist zusammen mit Beispielen im Download enthalten. Und ja, das sollte "Mix" sein.
Mark Brackett
4
Zu Ihrer Information - Wenn Sie diesen Weg gehen, bündelt PDFCreator Malware im Installationsprogramm. Dies ist ein fortlaufendes Problem mit PDFCreator seit 2009.
Phil Gorley
2
@ PhilGorley Malware? und diese Antwort ist +8 ...
Mzn
@Mzn - FWIW, das Aufpassen und Deaktivieren der Addon-Installationen funktioniert immer für mich. Ich sehe es nicht anders als Oracle-Bündelungsdreck im Java-Installationsprogramm. Es ist ärgerlich, aber es lohnt sich nicht, die Software für mich zu meiden (ja, OK, die Adware von PdfCreator ist wahrscheinlich unendlich weniger nützlich und aufdringlicher als alles, was Oracle heutzutage vorantreibt ... ich möchte immer noch keine von beiden).
Mark Brackett
12

Ich wollte nur hinzufügen, dass ich Microsoft.Interop-Bibliotheken verwendet habe, insbesondere die ExportAsFixedFormat-Funktion, die ich in diesem Thread nicht verwendet habe.

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
quelle
7
Nur ein Hinweis für diejenigen, die nicht wissen, dass Office auf dem Computer installiert sein muss, um die Microsoft Interop-Bibliotheken verwenden zu können.
Sam Rueby
Nett! Ich schlage vor app.Visible = false;, app.Quit();im finally-Block einen Anruf zu setzen und hinzuzufügen .
Dan Korn
5

Ich habe den Schmerz von Word zu PDF durchgesehen, als mich jemand mit 10000 Word-Dateien zum Konvertieren in PDF entleert hat. Jetzt habe ich es in C # gemacht und Word Interop verwendet, aber es war langsam und stürzte ab, wenn ich versuchte, überhaupt einen PC zu verwenden. Sehr frustrierend.

Dies führte mich zu der Entdeckung, dass ich Interops und ihre Langsamkeit ausgeben könnte ..... für Excel, das ich verwende (EPPLUS), und dann entdeckte ich, dass Sie ein kostenloses Tool namens Spire erhalten können, das die Konvertierung in PDF ermöglicht ... mit Einschränkungen!

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

Ggalla1779
quelle
Vielen Dank dafür - großartige Lösung ohne Interop. Warum ist es so schwierig, einen kostenlosen docx to PDF-Konverter zu finden?
mbdavis
Ich hatte große Hoffnungen darauf, aber die kostenlose Version ist auf 3 Seiten PDF-Ausgabe beschränkt. Die Vollversion ist sehr teuer, wenn Sie unbegrenzte Bereitstellungen benötigen.
Grinder22
grinder22 GemBox.Document hat auch eine kostenlose Version mit Größenbeschränkung und eine kostenpflichtige Version. Es enthält jedoch eine lizenzgebührenfreie Bereitstellung, sodass Sie eine unbegrenzte Anzahl von Projekten ohne zusätzliche Kosten erstellen und veröffentlichen können.
Hertzogth
3

Einfacher Code und Lösung Microsoft.Office.Interop.Wordzum Konvertieren von WORD in 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);

}

Fügen Sie dieses Verfahren hinzu, um Speicher freizugeben:

private void releaseObject(object obj)
{
  try
  {
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
      obj = null;
  }
  catch (Exception ex)
  {
      //TODO
  }
  finally
  {
     GC.Collect();
  }
}
daniele3004
quelle
Ist es notwendig, GC.Collect anzurufen? Gibt es nicht eine andere Möglichkeit, nur den damit verbundenen Teil des Speichers für die Freigabe beim nächsten automatischen GC zu markieren?
Preza8
2

Scheint hier einige relevante Informationen zu sein:

Konvertieren von MS Word-Dokumenten in PDF in ASP.NET

Da Office 2007 über die Funktion "In PDF veröffentlichen" verfügt, können Sie die * .DOC-Datei in Word 2007 mithilfe der Office-Automatisierung öffnen und als PDF speichern. Ich bin nicht besonders an Büroautomation interessiert, da sie langsam und anfällig für Hänge ist, aber wirf das einfach raus ...

MikeW
quelle
Aspose mag funktionieren, ist aber sehr teuer.
Shaul Behr
1

Das Microsoft PDF-Add-In für Word scheint derzeit die beste Lösung zu sein. Sie sollten jedoch berücksichtigen, dass nicht alle Word-Dokumente korrekt in PDF konvertiert werden. In einigen Fällen werden Sie einen großen Unterschied zwischen dem Wort und dem Ausgabe-PDF feststellen. Leider konnte ich keine API finden, die alle Word-Dokumente korrekt konvertieren würde. Die einzige Lösung, die ich gefunden habe, um sicherzustellen, dass die Konvertierung zu 100% korrekt war, war die Konvertierung der Dokumente über einen Druckertreiber. Der Nachteil ist, dass Dokumente einzeln in die Warteschlange gestellt und konvertiert werden. Sie können jedoch sicher sein, dass das resultierende PDF genau dem Layout des Word-Dokuments entspricht. Ich persönlich habe es vorgezogen, UDC (Universal Document Converter) zu verwenden, und Foxit Reader (kostenlose Version) auch auf dem Server installiert. Dann habe ich die Dokumente gedruckt, indem ich einen "Prozess" gestartet und seine Verb-Eigenschaft auf "Drucken" gesetzt habe.

Arvand
quelle