मैं वर्ड फाइल को प्रोग्रामेटिक रूप से पीडीएफ में कैसे बदलूं? [बन्द है]


221

मुझे कई ओपन-सोर्स / फ़्रीवेयर प्रोग्राम मिले हैं जो आपको .pdf फ़ाइलों में .doc फ़ाइलों को कनवर्ट करने की अनुमति देते हैं, लेकिन वे सभी एप्लिकेशन / प्रिंटर ड्राइवर विविधता के साथ हैं, जिसमें कोई एसडीके संलग्न नहीं है।

मुझे ऐसे कई प्रोग्राम मिले हैं, जिनके पास SDK है जो आपको .pdf फ़ाइलों में कनवर्ट करने की अनुमति देता है, लेकिन वे सभी मालिकाना प्रकार के हैं, $ 2,000 एक लाइसेंस या उपचार स्थान।

C # या VB.NET का उपयोग करके किसी को भी किसी भी स्वच्छ, सस्ती (अधिमानतः नि: शुल्क) प्रोग्रामेटिक समस्या का पता है?

धन्यवाद!


1
देखें कि क्या Pandoc है अपने पसंदीदा भाषा के लिए बाइंडिंग । कमांड लाइन का इंटरफ़ेस भी आसान हैpandoc manual.docx -o manual.pdf
कर्नल पैनिक

इसके अलावा, GemBox.Document SDK की जांच करें । यह एक मुफ्त संस्करण और एक सस्ती संस्करण है। Word फ़ाइलों को PDF में बदलने के लिए यह न तो प्रिंटर ड्राइवर का उपयोग करता है और न ही एमएस ऑफिस का।
हर्ट्ज़ोगथ

इस रूपांतरण को करने के लिए आप docx2pdf का उपयोग कर सकते हैं: github.com/AlJohri/docx2pdf
अल जौहरी

जवाबों:


204

लूप के बजाय फॉरच लूप का उपयोग करें - इससे मेरी समस्या हल हो गई।

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

यहाँ एक कार्यक्रम का संशोधन है जो मेरे लिए काम करता है। यह Word 2007 का उपयोग Save As PDF ऐड-इन स्थापित के साथ करता है। यह .doc फ़ाइलों के लिए निर्देशिका खोजता है, उन्हें Word में खोलता है और फिर उन्हें PDF के रूप में सहेजता है। ध्यान दें कि आपको समाधान में Microsoft.Office.Interop.Word का संदर्भ जोड़ना होगा।

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
धन्यवाद! मैं वैसे भी असोस के साथ जा सकता हूं, अगर यह वर्ड ऑटोमेशन से तेज है। लेकिन अगर मैं थोड़ी सुस्ती बर्दाश्त कर सकता हूं, तो मैं आपके समाधान का पूरा उपयोग करूंगा। एक बार फिर धन्यवाद!
शाऊल बेहार

4
हां, यह सबसे तेज नहीं है, लेकिन कीमत को हराना मुश्किल है। :-) मैं खुशी से मदद कर सकता है।
एरिक नेस

10
Office 2007 SP2 के साथ अब आपको PDF डाउनलोड के रूप में सहेजने की आवश्यकता नहीं है। मैंने एक्सेल और पावरपॉइंट के लिए भी सफलतापूर्वक इस तकनीक का उपयोग किया है।
रिचर्ड सेप

5
क्या आपने वेब एप्लिकेशन वाले सर्वर पर इस पद्धति का उपयोग किया है? मुझे उन मुद्दों का एक बहुत कुछ मिल रहा है जो एमएस द्वारा अनुशंसित नहीं हैं। support.microsoft.com/default.aspx?scid=kb=EN-US-q257757#kb2 मैंने सुना है ASPose महान है, लेकिन यह काफी प्रिय है।
प्रभू

6
उम ... यदि शब्द स्थापित नहीं है, तो मुझे लगता है कि इंटरोप असेंबली की पैकेजिंग आपकी चिंताओं से कम से कम होगी। यह कोड इंस्टॉल होने के लिए शब्द आवश्यक है।
BrainSlugs83

35

Vb.net उपयोगकर्ताओं के लिए इसे जमा करने के लिए, मुफ्त विकल्प (कार्यालय स्थापित होना चाहिए):

Microsoft कार्यालय के अस्मिताएँ डाउनलोड:

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
अभी भी 2015 में काम करता है। Office 2013 के साथ आपको PIA को अलग से डाउनलोड करने की आवश्यकता नहीं है।
एडम एंडरसन

3
और BOOM अगर यह एक संदेश बॉक्स खोलता है और कुछ पूछता है - उदाहरण के लिए एक वेब अनुप्रयोग में ... या एक ही समय में 2 दस्तावेज़ करता है ...
स्टीफन स्टीगर

एक फ्रीमियम विकल्प (नोडज और एज। जेएस या जावास्क्रिप्ट के माध्यम से) npmjs.com/package/@nativedocuments/docx-wasm (वर्ड की कोई आवश्यकता नहीं है)
जेसनप्लूटेक्स

14

PDFCreator में COM घटक, .NET या VBScript (डाउनलोड में शामिल नमूने) से कॉल करने योग्य है।

लेकिन, यह मुझे लगता है कि एक प्रिंटर सिर्फ आपकी ज़रूरत है - बस वर्ड के स्वचालन के साथ मिश्रण करें , और आपको जाने के लिए अच्छा होना चाहिए।


यह COM घटक कहाँ है? और "मिक" का क्या अर्थ है? क्या इसका मतलब "मिक्स" होना था?
शूल बेहार

COM घटक नमूनों के साथ, डाउनलोड में शामिल है। और हाँ, वह "मिक्स" होना चाहिए था।
मार्क ब्रैकेट

4
FYI करें - यदि आप इस मार्ग पर जाते हैं, तो PDFCreator इंस्टॉलर में मालवेयर बंडल करता है। यह 2009 से PDFCreator के साथ चल रहा है।
फिल गोरली

2
@PhilGorley मालवेयर? और यह उत्तर +8 ...
मजनू

@Mzn - एफडब्ल्यूआईडब्ल्यू, ध्यान देना और ऐडऑन इंस्टॉल को अनचेक करना हमेशा मेरे लिए काम करता है। मैं इसे जावा इंस्टॉलर में ओरेकल बंडलिंग बकवास से अलग नहीं देखता; यह कष्टप्रद है, लेकिन मेरे लिए सॉफ़्टवेयर से बचने के लायक नहीं है (हाँ, ठीक है, PdfCreator का ऐडवेयर शायद असीम रूप से कम उपयोगी है और इन दिनों जो भी ओरेकल जोर दे रहा है, उससे अधिक घुसपैठ ... मैं अभी भी उनमें से एक भी नहीं चाहता हूं)।
मार्क ब्रैकेट 16

12

बस यह जोड़ना चाहता था कि मैंने Microsoft.Interop पुस्तकालयों, विशेष रूप से ExportAsFixedFormat फ़ंक्शन का उपयोग किया था जो कि मैंने इस धागे में उपयोग नहीं देखा था।

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 इंटरॉप पुस्तकालयों का उपयोग करने के लिए मशीन पर स्थापित कार्यालय की आवश्यकता है।
सैम रूबी

अच्छा! मैं अंत में ब्लॉक में app.Visible = false;कॉल सेट करने और जोड़ने का सुझाव देता हूं app.Quit();
दान कोर्न

7

9
धन्यवाद, लेकिन वहाँ सभी सुझाव मैं ऊपर वर्णित दो श्रेणियों के तहत आते हैं: या तो प्रोग्रामेटिक नहीं, या बेहद महंगा। मुझे विशेष रूप से .doc से .pdf की आवश्यकता है।
शूल बेहार

5

मैं वर्ड से पीडीएफ दर्द के माध्यम से चला गया जब किसी ने मुझे पीडीएफ में बदलने के लिए 10000 शब्द फाइलों के साथ डंप किया। अब मैंने इसे C # में किया और Word इंटरॉप का उपयोग किया लेकिन यह धीमा और दुर्घटनाग्रस्त हो गया अगर मैंने पीसी का उपयोग करने की कोशिश की .. बहुत निराशा हुई।

इससे मुझे यह पता चलता है कि मैं इंटरॉप्स और उनकी सुस्ती को डंप कर सकता हूं ..... एक्सेल के लिए मैं (EPPLUS) का उपयोग करता हूं और फिर मुझे पता चला कि आपको स्पायर नामक एक मुफ्त टूल मिल सकता है जो पीडीएफ ... सीमाओं के साथ परिवर्तित करने की अनुमति देता है!

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


इसके लिए धन्यवाद - इंटरॉप का उपयोग किए बिना महान समाधान। पीडीएफ कनवर्टर के लिए एक निशुल्क डॉक्स को खोजना इतना कठिन क्यों है?
mbdavis

मुझे इसके लिए बहुत उम्मीदें थीं लेकिन मुफ्त संस्करण पीडीएफ आउटपुट के 3 पृष्ठों तक सीमित है। पूर्ण संस्करण बहुत महंगा है अगर आपको असीमित तैनाती की आवश्यकता है।
ग्राइंडर

grinder22 GemBox.Document में आकार सीमा और एक सशुल्क संस्करण के साथ एक निःशुल्क संस्करण भी है। हालाँकि, इसमें एक रॉयल्टी मुक्त तैनाती शामिल है ताकि आप बिना किसी अतिरिक्त लागत के असीमित संख्या में परियोजनाओं का निर्माण और प्रकाशन कर सकें।
हर्ट्ज़ोगथ

3

Microsoft.Office.Interop.Wordपीडीएफ में वर्ड को परिवर्तित करने के लिए आसान कोड और समाधान

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

}

मेमोरी जारी करने के लिए इस प्रक्रिया को जोड़ें:

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

क्या GC.Collect को कॉल करना आवश्यक है? क्या केवल मेमोरी के उस हिस्से को चिह्नित करने का एक अलग तरीका नहीं है जो अगले स्वचालित जीसी पर मुक्त होने के लिए संबंधित है?
प्रीजा 8

2

लगता है यहाँ कुछ relevent जानकारी हो:

ASP.NET में एमएस वर्ड दस्तावेज़ पीडीएफ में परिवर्तित करना

साथ ही, Office 2007 PDF कार्यक्षमता में प्रकाशित होने के साथ, मुझे लगता है कि आप Word 2007 में * .DOC फ़ाइल खोलने और PDF को सहेजने के लिए कार्यालय स्वचालन का उपयोग कर सकते हैं। मैं ऑफिस ऑटोमेशन के बारे में बहुत उत्सुक नहीं हूं क्योंकि यह धीमा है और फांसी का खतरा है, लेकिन बस वहां से बाहर फेंक रहे हैं ...


काम हो सकता है, लेकिन यह काफी महंगा है।
शूल बेहार

1

Microsoft PDF ऐड-इन शब्द अब के लिए सबसे अच्छा समाधान प्रतीत होता है, लेकिन आपको इस बात पर ध्यान देना चाहिए कि यह सभी शब्द दस्तावेज़ों को सही ढंग से पीडीएफ में नहीं बदलता है और कुछ मामलों में आपको शब्द और आउटपुट पीडीएफ के बीच बहुत अंतर दिखाई देगा। दुर्भाग्य से मुझे कोई भी एपी नहीं मिला जो सभी शब्द दस्तावेजों को सही ढंग से परिवर्तित कर दे। एकमात्र समाधान मुझे यह सुनिश्चित करने के लिए मिला कि एक प्रिंटर ड्राइवर के माध्यम से दस्तावेजों को परिवर्तित करके 100% सही था। नकारात्मक पक्ष यह है कि दस्तावेजों को कतारबद्ध और एक-एक करके परिवर्तित किया जाता है, लेकिन आप यह सुनिश्चित कर सकते हैं कि परिणामी पीडीएफ शब्द दस्तावेज़ लेआउट के समान ही है। मैंने व्यक्तिगत रूप से यूडीसी (यूनिवर्सल डॉक्यूमेंट कन्वर्टर) का उपयोग करना पसंद किया और सर्वर पर फॉक्सिट रीडर (फ्री वर्जन) स्थापित किया, फिर "प्रोसेस" शुरू करके और अपनी वर्ब प्रॉपर्टी को "प्रिंट" करने के लिए दस्तावेजों को प्रिंट किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.