web-dev-qa-db-ja.com

WordファイルをプログラムでPDFに変換する方法を教えてください。

私はあなたが.docファイルを.pdfファイルに変換することを可能にするいくつかのオープンソース/フリーウェアプログラムを見つけました、しかしそれらはSDKが付いていないアプリケーション/プリンタドライバの多様性のすべてです。

私はあなたが.docファイルを.pdfファイルに変換することを可能にするSDKを持っているいくつかのプログラムを見つけました、しかしそれらはすべて独自仕様のタイプ、2,000ドルのライセンス、またはその周辺です。

C#やVB.NETを使用して、私の問題に対するクリーンで安価な(できれば無料の)プログラムによる解決方法を知っている人はいますか?

ありがとうございます。

214
Shaul Behr

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

これは私のために働いたプログラムの修正です。 Word 2007では、 名前を付けて保存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;
197
Eric Ness

Vb.netユーザーのためにそれを要約すると、無料のオプション(オフィスがインストールされている必要があります):

マイクロソフトオフィスアセンブリのダウンロード:

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

PDFCreator にはCOMコンポーネントがあり、.NETまたはVBScriptから呼び出すことができます(ダウンロードに含まれるサンプル)。

しかし、私はプリンタがまさに必要なものであるように思えます - それを Wordの自動化 と混ぜるだけでいいでしょう。

14
Mark Brackett

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
zeta
7
Todd Gamblin

誰かが私にPDFに変換するために10000のWordファイルを投げつけたとき、私はPDF痛みにWordを経験しました。今私はC#でそれをし、Wordの相互運用機能を使用しましたが、私がPCを使用しようとするとそれは遅くてクラッシュしました..非常にイライラする。

これは私が使用しているExcel用の相互運用機能とその遅さを捨てることができることを発見することにつながりました。

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

5
Ggalla1779

私はGembox( http://www.gemboxsoftware.com/ )に限定された無料版の文書管理(pdf変換を含む)を提供していることに感銘を受けました。また、スプレッドシート用のライブラリも用意しています。あなたが彼らの制限を超えた場合の1開発者ライセンスは(私はあなたがそうすると思いますが)580ドル程度です( http://www.gemboxsoftware.com/document/pricelist )。はい、無料ではありません(または私の考えでは比較的安価です)が、2000ドルよりはるかに安いです。私は彼らの価格表からそれを理解しているように、サーバーの配備にもロイヤリティはありません。彼らに近づき、あなたがあなた自身をロールバックしたくないなら彼らが取引をするかどうか見る価値があるかもしれません。

4
The Senator

これはリリースプロセスの一環として行います - Word DocをPDFに変換します。

http://www.suodenjoki.dk/us/productions/articles/Word2pdf.htm and http://www.oooforum.org/forum/viewtopic.phtml?t=3772&highlight = pdf + form

厳密にはプログラム的ではありませんが、助けになるかもしれません。

3
Tim

私がサーバサイドオフィスの自動化に関するいくつかの問題に遭遇したとき、我々は説明されたテクニックを調べました ここでcodeproject 。マクロと組み合わせてOpenOfficeの移植版(xcopy経由でデプロイ可能)を使用します。私たちはまだ自分で切り替えをしていませんが、非常に有望に見えます。

3
Cohen

ここにいくつかの関連情報があるようです。

ASP.NETでMS Word文書をPDFに変換

また、Office 2007がPDF機能にパブリッシュされている場合は、オフィスオートメーションを使用してWord 2007で* .DOCファイルを開き、PDFとして保存することもできます。私はOAは遅くてハングする傾向があるので、OAにはそれほど熱心ではありませんが、それを捨てるだけです...

1
MikeW

Word用のMicrosoft PDFアドインは現時点では最良の解決策のようですが、すべてのWord文書を正しくpdfに変換するわけではないことを考慮する必要があります。そして出力pdf。残念ながら、私はすべてのWord文書を正しく変換するAPIを見つけることができませんでした。変換が100%正しいことを確認するために私が見つけた唯一の解決策は、プリンタードライバーを通して文書を変換することでした。欠点は、文書が1つずつキューに入れられて変換されることですが、結果のPDFがWord文書のレイアウトとまったく同じであることを確認できます。私は個人的にはUDC(Universal document converter)を使用し、サーバーにFoxit Reader(無料版)をインストールしてから "Process"を起動し、Verbプロパティを "print"に設定してドキュメントを印刷しました。 FileSystemWatcherを使用して変換が完了したときにシグナルを設定することもできます。

1
Arvand

Word 2010以降がインストールされている限り、 DocTor を使用できます。これを実行するには、コマンドラインアプリケーションを使用します。

1
Toby Allen

私はABCpdfを使用しましたが、これはプログラムによるオプションで、あまり高価ではありませんでした。 OpenOfficeで動作するか、OpenOfficeが利用できない場合はWordにフォールバックします。セットアップはOpenOffice COMパーミッションに関して少しトリッキーでした、しかしそれは間違いなくアプリのその部分をアウトソーシングする価値がありました。

1
RyanW

Microsoft.Office.Interop.Wordを使用してPDFの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();
  }
}
0
daniele3004

自分のサーバーにOfficeをインストールできない、またはクラウド環境での運用が不可能な状況にあるプログラマーのために - 他の答えに代わる安価な方法は Api2Pdf WordファイルからPDF他のMS Officeファイルと同様に。これはWeb APIであり、内部でLibreOfficeを使用しています。

0
apexdodge