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


221

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

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

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

감사!


1
Pandoc에 선호하는 언어에 대한 바인딩 이 있는지 확인하십시오 . 커맨드 라인 인터페이스도 쉽게 사용할 수 있습니다pandoc manual.docx -o manual.pdf
대령 패닉

또한 GemBox.Document SDK를 확인하십시오 . 무료 버전과 저렴한 버전이 있습니다. Word 파일을 PDF로 변환하기 위해 프린터 드라이버 나 MS Office를 사용하지 않습니다.
Hertzogth

:이 변환 할 docx2pdf을 사용할 수 있습니다 github.com/AlJohri/docx2pdf
알 Johri

답변:


204

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;

3
감사합니다! 어쨌든 Word 자동화보다 빠르면 Aspose를 사용할 수 있습니다. 그러나 약간의 속도 저하를 견딜 수 있다면 솔루션을 충분히 사용할 것입니다. 다시 감사합니다!
Shaul Behr

4
예, 가장 빠르지는 않지만 가격을이기는 것은 어렵습니다. :-) 도와 드리겠습니다.
Eric Ness

10
Office 2007 SP2를 사용하면 더 이상 PDF로 저장 다운로드가 필요하지 않습니다. Excel과 Powerpoint에도이 기술을 성공적으로 사용했습니다.
RichardOD

5
웹 애플리케이션이있는 서버에서이 방법을 사용 했습니까? MS가 권장하지 않는 문제가 많이 있습니다. support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2 ASPose는 훌륭하지만 그 자체는 매우 훌륭하다고 들었습니다.
Prabu

6
음 ... 단어가 설치되어 있지 않으면 interop 어셈블리를 포장하는 것이 가장 걱정할 것 같습니다. 이 코드는 설치 될 단어가 필요합니다.
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
Office 2013에서는 PIA를 별도로 다운로드 할 필요가 없습니다.
Adam Anderson

3
BOOM이 메시지 상자를 열고 웹 애플리케이션과 같은 메시지를 표시하거나 동시에 2 개의 문서를 작성하는 경우
Stefan Steiger

freejs 옵션 (nodejs 및 edge.js 또는 Javascript.NET을 통한)은 npmjs.com/package/@nativedocuments/docx-wasm(Word 필요 없음)입니다.
JasonPlutext

14

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

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


이 COM 구성 요소는 어디에 있습니까? "mik"는 무엇을 의미합니까? 그것이 "혼합"을 의미 했습니까?
Shaul Behr

COM 구성 요소는 샘플과 함께 다운로드에 포함되어 있습니다. 그리고 네, 그것은 "믹스"로되어있었습니다.
Mark Brackett

4
참고-이 경로로 이동하면 PDFCreator가 설치 프로그램에 맬웨어를 번들로 제공합니다. 이것은 2009 년 이래 PDFCreator에서 진행중인 문제입니다.
Phil Gorley

2
@PhilGorley Malware? 이 답변은 +8입니다.
Mzn

@Mzn-FWIW,주의를 기울이고 애드온 설치를 선택 취소하면 항상 효과적입니다. Java 설치 프로그램에서 Oracle 번들링 쓰레기와 다른 점은 없습니다. 귀찮지 만 소프트웨어를 피할 가치가 없습니다 (예, PdfCreator의 애드웨어는 Oracle이 요즘 추진하고있는 것보다 무한히 유용성이 떨어지고 방해가됩니다 ... 여전히 그중 하나를 원하지 않습니다).
Mark Brackett

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 Interop 라이브러리를 사용하려면 컴퓨터에 Office를 설치해야한다는 것을 모르는 사용자를위한 참고 사항입니다.
Sam Rueby

좋은! finally 블록에서 app.Visible = false;통화를 설정 하고 추가하는 것이 좋습니다 app.Quit();.
Dan Korn


5

누군가가 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


Interop을 사용하지 않는 훌륭한 솔루션입니다. 무료 docx to PDF 변환기를 찾는 것이 왜 그렇게 어려운가요?
mbdavis 2019

나는 이것에 대한 기대가 높았지만 무료 버전은 3 페이지의 PDF 출력으로 제한됩니다. 무제한 배포가 필요한 경우 정식 버전은 매우 비쌉니다.
grinder22

grinder22 GemBox.Document에는 무료 버전과 크기 제한이 있습니다. 그러나 로열티가없는 배포가 포함되어 있으므로 추가 비용없이 무제한으로 프로젝트를 빌드하고 게시 할 수 있습니다.
hertzogth

3

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

GC.Collect에 전화해야합니까? 다음 자동 GC에서 해제하기 위해 이와 관련된 메모리 부분 만 표시하는 다른 방법이 있습니까?
Preza8

2

여기에 관련 정보가있는 것 같습니다 :

ASP.NET에서 MS Word 문서를 PDF로 변환

또한 Office 2007에서 PDF로 게시 기능을 사용하면 Office 자동화를 사용하여 Word 2007에서 * .DOC 파일을 열고 PDF로 저장을 수행 할 수 있습니다. 나는 속도가 느리고 교수형이 발생하기 쉽기 때문에 사무 자동화에 너무 열중하지 않고 단지 그것을 밖으로 던져 버립니다 ...


Aspose가 작동 할 수도 있지만 비용이 많이 듭니다.
Shaul Behr

1

단어 용 Microsoft PDF 애드 인이 현재 최상의 솔루션 인 것 같지만 모든 단어 문서를 pdf로 올바르게 변환하지는 않으며 일부 경우에는 단어와 출력 pdf간에 큰 차이가 있음을 고려해야합니다. 불행히도 모든 단어 문서를 올바르게 변환하는 API를 찾을 수 없었습니다. 변환이 100 % 정확하다는 것을 확인한 유일한 해결책은 프린터 드라이버를 통해 문서를 변환하는 것입니다. 단점은 문서가 하나씩 대기하고 하나씩 변환된다는 것입니다. 그러나 결과 pdf가 단어 문서 레이아웃과 정확히 동일하다는 것을 확신 할 수 있습니다. 개인적으로 UDC (Universal document converter)를 사용하고 서버에 Foxit Reader (무료 버전)를 설치 한 다음 "Process"를 시작하고 Verb 속성을 "print"로 설정하여 문서를 인쇄했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.