Jak programowo konwertować pliki Word na PDF?

Znalazłem kilka programów open-source / freeware, które pozwalają na konwersję .pliki doc do .pliki pdf, ale wszystkie są odmianą aplikacji / sterowników drukarki, bez dołączonego zestawu SDK.

Znalazłem kilka programów, które mają SDK pozwalający na konwersję .pliki doc do .pliki pdf, ale wszystkie są własnościowe, $ 2,000 za licencję lub mniej więcej.

Czy ktoś zna jakieś czyste, niedrogie (najlepiej darmowe) programistyczne rozwiązanie mojego problemu, używając C # lub VB.NET?

Dzięki!

Author: Shaul Behr, 2009-03-03

15 answers

Użyj pętli foreach zamiast pętli for-to rozwiązało mój problem.

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

Oto modyfikacja programu, który działał dla mnie. Używa programu Word 2007 z zainstalowanym Save As PDF add-in. Przeszukuje katalog .pliki doc, otwiera je w programie Word, a następnie zapisuje je jako PDF. Pamiętaj, że musisz dodać odniesienie do firmy Microsoft.Biuro.Interop.Słowo do rozwiązania.

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;
 190
Author: Eric Ness,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-16 15:16:25

Podsumowując to dla vb.net użytkownicy, opcja darmowa (musi mieć zainstalowany pakiet office):

Microsoft office Assemblies download:

  • pia dla office 2010
  • Pia dla biura 2007

  • Dodaj odniesienie do Microsoft.Biuro.Interop.Słowo.Zastosowanie

  • Dodaj using lub import (vb.net) oświadczenie do Microsoftu.Biuro.Interop.Słowo.Zastosowanie

VB.NET przykład:

        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()
 32
Author: Elger Mensonides,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-29 13:52:54

PDFCreator posiada komponent COM, który można wywołać z. NET lub VBScript (próbki zawarte w pliku do pobrania).

Ale wydaje mi się, że drukarka jest właśnie tym, czego potrzebujesz - po prostu zmieszaj to z automatyzacją Worda, i powinieneś być gotowy.

 14
Author: Mark Brackett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-04 10:59:23
 7
Author: tgamblin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-03 19:05:15

Chciałem tylko dodać, że korzystałem z Microsoftu.Biblioteki Interop, a konkretnie funkcja ExportAsFixedFormat, której nie widziałem w tym wątku.

    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;
    }
 7
Author: zeta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-04 18:51:39

Przeszedłem przez Word do PDF ból, gdy ktoś rzucił mnie z 10000 plików word do konwersji do PDF. Teraz zrobiłem to w C# i użyłem słowa interop, ale to było powolne i rozbił się, jeśli próbowałem używać komputera w ogóle.. bardzo frustrujące.

To doprowadziło mnie do odkrycia, że mogę porzucić interopy i ich powolność..... do Excela używam (EPPLUS) i wtedy odkryłem, że można dostać darmowe narzędzie o nazwie Spire, które umożliwia konwersję do PDF... z ograniczeniami!

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

 4
Author: Ggalla1779,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-26 18:04:20

Robię to w ramach procesu wydania-Konwertuj Word Doc na PDF.

Http://www.suodenjoki.dk/us/productions/articles/word2pdf.htm oraz http://www.oooforum.org/forum/viewtopic.phtml?t=3772&highlight=pdf + formularz

Nie do końca programowo, ale może Ci pomóc.

 3
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-03 19:36:23

Kiedy natknąłem się na problemy z automatyzacją biur po stronie serwera przyjrzeliśmy się technice opisanej tutaj na codeproject. Korzysta z wersji portable (która może być wdrożona przez xcopy) OpenOffice w połączeniu z makrem. Chociaż nie zrobiliśmy jeszcze zmiany sami, wygląda to bardzo obiecująco.

 3
Author: Cohen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-04 21:24:10

Byłem pod wrażeniem Gembox ( http://www.gemboxsoftware.com / ), które zapewniają ograniczoną bezpłatną edycję zarządzania dokumentami (zawiera konwersję pdf). Robią też biblioteki dla arkuszy kalkulacyjnych. Licencja dewelopera 1, jeśli przekroczysz ich limity (co pewnie zrobisz), to około $580 (http://www.gemboxsoftware.com/document/pricelist). OK, nie jest darmowy (lub moim zdaniem stosunkowo niedrogi), ale jest o wiele tańszy niż $2000. Jak rozumiem to z ich cennik nie ma opłat licencyjnych za wdrożenia serwerów. Może warto się do nich zbliżyć i sprawdzić, czy się dogadają, jeśli nie chcesz kręcić swoich.

 2
Author: The Senator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-17 11:03:13

Wydaje się być jakieś trafne info tutaj:

Konwersja dokumentów MS Word na PDF w ASP.NET

Również, z Office 2007 o publikowania do PDF funkcjonalności, myślę, że można użyć automatyzacji biura, aby otworzyć *.Plik DOC w programie Word 2007 i zapisz jako PDF. Nie przepadam za automatyzacją biura, ponieważ jest powolne i podatne na powieszenie, ale po prostu wyrzucam to tam...

 1
Author: MikeW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:33

Użyłem ABCpdf, który jest opcją programową i nie był zbyt drogi, $300 / licencja. Działa z OpenOffice lub wraca do programu Word, jeśli OpenOffice nie jest dostępny. Konfiguracja była nieco trudna z uprawnieniami OpenOffice COM, ale zdecydowanie warto było outsourcować tę część aplikacji.

 1
Author: RyanW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-30 02:40:30

Microsoft PDF add-in dla word wydaje się być najlepszym rozwiązaniem na razie, ale należy wziąć pod uwagę, że nie konwertuje wszystkie dokumenty word poprawnie do formatu pdf, aw niektórych przypadkach zobaczysz ogromną różnicę między word a wyjściowym pdf. Niestety nie mogłem znaleźć żadnego api, które przekonwertowałoby wszystkie dokumenty Worda poprawnie. Jedynym rozwiązaniem, które znalazłem, aby upewnić się, że konwersja była w 100% poprawna, była konwersja dokumentów za pomocą sterownika drukarki. Minusem jest to, że dokumenty są kolejkowane i konwertowane jeden po drugim, ale możesz być pewien, że powstały plik pdf jest dokładnie taki sam jak układ dokumentu word. Osobiście wolałem używać UDC (Universal document converter) i zainstalowałem Foxit Reader (darmowa wersja) na serwerze, a następnie wydrukowałem dokumenty, uruchamiając" proces "i ustawiając jego właściwość czasownika na"Drukuj". Możesz także użyć FileSystemWatcher, aby ustawić sygnał po zakończeniu konwersji.

 1
Author: Arvand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-25 08:26:05

Tak długo, jak masz zainstalowany program Word 2010 lub nowszy, możesz użyć DocTo, który zapewnia do tego aplikację wiersza poleceń.

 1
Author: Toby Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-07 21:08:30

Dla programistów, którzy znajdują się w sytuacji, gdy nie mogą zainstalować pakietu Office na swoim serwerze lub działają w jakimś środowisku chmurowym-niedrogą alternatywą dla innych odpowiedzi jest Api2Pdf, który obsługuje konwersję plików Word do PDF, jak również innych plików MS Office. Jest to web API i używa LibreOffice pod maską.

 0
Author: apexdodge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-06 01:12:25

Używałem iTextSharp do generowania plików PDF wcześniej. Jest to port open source iText ze świata Javy i jest dość potężny.

Nie zrobiłem konwersji Word do PDF, ale programowo stworzyłem i manipulowałem plikami PDF.

Oto kolejny link do projektu.

 -4
Author: Mike L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-03 20:48:42