[C#] 프로그래밍 방식으로 Word 파일을 PDF로 변환하려면 어떻게합니까? [닫은]

.doc 파일을 .pdf 파일로 변환 할 수있는 몇 가지 오픈 소스 / 프리웨어 프로그램을 찾았지만, SDK가 연결되어 있지 않은 모든 응용 프로그램 / 프린터 드라이버입니다.

.doc 파일을 .pdf 파일로 변환 할 수있는 SDK가있는 프로그램이 여러 개 있지만 모두 독점 유형, 라이센스 $ 2,000 정도입니다.

누구나 C # 또는 VB.NET을 사용하여 내 문제에 대한 깨끗하고 저렴한 (바람직하게는 무료) 프로그래밍 방식의 솔루션을 알고 있습니까?

감사!



답변

for 루프 대신 foreach 루프를 사용하십시오-문제가 해결되었습니다.

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

나를 위해 일한 프로그램의 수정은 다음과 같습니다. PDF로 저장 추가 기능이 설치된 Word 2007을 사용합니다 . .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;


답변

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


답변

PDFCreator 에는 .NET 또는 VBScript (다운로드에 포함 된 샘플)에서 호출 할 수있는 COM 구성 요소가 있습니다.

그러나 프린터는 필요한 것 같습니다. Word의 자동화 와 프린터를 혼합 하면 좋을 것입니다.


답변

이 스레드에서 사용되지 않은 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;
}


답변


답변

누군가가 PDF로 변환하기 위해 10000 개의 단어 파일을 덤프했을 때 Word to PDF 고통을 겪었습니다. 이제 C #에서 그것을하고 Word interop을 사용했지만 PC를 전혀 사용하려고하면 느려졌습니다. 매우 실망 스럽습니다.

이것은 내가 interops를 덤프 할 수 있다는 것을 발견하게하고 속도가 느려졌습니다 ….. Excel의 경우 (EPPLUS)를 사용하고 제한없이 PDF로 변환 할 수있는 Spire라는 무료 도구를 얻을 수 있음을 발견했습니다!

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


답변

Microsoft.Office.Interop.WordPDF에서 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();
  }
}