プログラムでWordファイルをPDFに変換するにはどうすればよいですか?[閉まっている]


221

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

SDKを使用して.docファイルを.pdfファイルに変換できるプログラムをいくつか見つけましたが、それらはすべてプロプライエタリタイプであり、ライセンスあたり2,000ドルです。

C#またはVB.NETを使用して、私の問題に対するクリーンで安価な(できれば無料の)プログラムによるソリューションを誰かが知っていますか?

ありがとう!


1
かどうかをチェックしPandocが持っているあなたの好きな言語のバインディングを。コマンドラインインターフェースも非常に使いやすいpandoc manual.docx -o manual.pdf
パニック大佐2016

また、GemBox.Document SDK も確認してください。無料版と廉価版があります。WordファイルをPDFに変換するためにプリンタードライバーもms officeも使用しません。
ヘルツォーク

docx2pdfを使用してこの変換を行うことができます:github.com/AlJohri/docx2pdf
Al 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 09/09/30

5
Webアプリケーションを備えたサーバーでこのメソッドを使用しましたか?MSで推奨されていない問題については言及していません。 support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2 ASPoseは素晴らしいと聞きましたが、とても親切です。
プラブ

6
ええと...単語がインストールされていない場合は、相互運用機能アセンブリをパッケージ化することで、心配する必要はほとんどありません。このコードは、インストールされるワードを必要とします。
BrainSlugs83 '25年

35

vb.netユーザー向けにまとめると、無料のオプション(Officeがインストールされている必要があります):

Microsoft Officeアセンブリのダウンロード:

  • オフィス2010のぴあ
  • Office 2007のPIA

  • Microsoft.Office.Interop.Word.Applicationへの参照を追加します

  • usingまたはimport(vb.net)ステートメントをMicrosoft.Office.Interop.Word.Applicationに追加する

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でも機能します。Office2013では、PIAを個別にダウンロードする必要はありません。
アダムアンダーソン

3
メッセージボックスを開いて何かを尋ねる場合(たとえば、Webアプリケーションで...または2つのドキュメントを同時に実行する場合)BOOM
Stefan Steiger

(nodejsとedge.js、またはJavascript.NETを介した)フリーミアムオプションはnpmjs.com/package/@nativedocuments/docx-wasm(Wordは不要)
JasonPlutext

14

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

しかし、私にはプリンターはあなたが必要とするものにすぎないようです-それをWordの自動化と混合するだけでよいのです。


このCOMコンポーネントはどこにありますか?「mik」とはどういう意味ですか?それは「ミックス」するつもりでしたか?
Shaul Behr

COMコンポーネントは、サンプルとともにダウンロードに含まれています。そして、はい、それは「ミックス」であるはずでした。
Mark Brackett

4
参考までに-この経路をたどると、PDFCreatorはインストーラにマルウェアをバンドルします。これは、2009
Phil

2
@PhilGorleyマルウェア?この答えは+8 ...
Mzn

@Mzn-FWIW、注意を払い、アドオンのインストールをオフにすることは、常に私にとってはうまくいきます。私はそれをJavaインストーラーのOracleバンドルのがらくたと何の違いもないと見ています。面倒ですが、私にとってソフトウェアを回避する価値はありません(そうですね、PdfCreatorのアドウェアは、おそらく最近Oracleが推進しているものよりもはるかに有用性が低く、煩わしいものです...私はまだどちらも欲しくありません)。
Mark Brackett 2015

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

7

9
ありがとうございます。ただし、提案はすべて、上で説明した2つのカテゴリに分類されます。プログラムによるものではないか、非常に高価です。具体的には、.docから.pdfをプログラムで作成する必要があります。
Shaul Behr

5

WordからPDFに変換するために10000ワードのファイルを誰かにダンプされたとき、WordからPDFへの苦労を経験しました。今私はC#でそれを行い、Wordの相互運用機能を使用しましたが、PCを使用しようとすると、遅くてクラッシュしました。非常にイライラしました。

これにより、相互運用性とその遅延をダンプできることを発見しました....使用しているExcel(EPPLUS)の場合、制限付きでPDFに変換できるSpireという無料のツールを入手できることを発見しました!

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


これをありがとう-Interopを使用しない優れたソリューション。無料のdocx to PDFコンバータを見つけるのがなぜそんなに難しいのですか?
mbdavis

私はこれに高い期待を持っていましたが、無料版はPDF出力の3ページに限定されています。無制限の展開が必要な場合、フルバージョンは非常に高価です。
grinder22

grinder22 GemBox.Documentには、サイズ制限付きの無料バージョンと有料バージョンもあります。ただし、無料のデプロイメントが含まれているため、無制限の数のプロジェクトを追加コストなしでビルドして公開できます。
ヘルツォーク

3

Microsoft.Office.Interop.WordWORDをPDFに変換するための簡単なコードとソリューション

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オートメーションを使用して* .DOCファイルをWord 2007で開いてPDFとして保存できると思います。オフィスオートメーションは遅くてハングしやすいので、あまり熱心ではありませんが、ただ捨てるだけです...


Asposeは機能するかもしれませんが、非常に高価です。
Shaul Behr

1

現在のところ、Word用のMicrosoft PDFアドインが最善の解決策のようですが、すべてのWord文書がPDFに正しく変換されず、場合によってはWordと出力PDFの間に大きな違いが生じることを考慮する必要があります。残念ながら、すべてのワードドキュメントを正しく変換するAPIを見つけることができませんでした。変換が100%正しいことを確認した唯一の解決策は、プリンタードライバーを介してドキュメントを変換することでした。欠点は、ドキュメントがキューに入れられて1つずつ変換されることですが、結果のPDFがWordドキュメントのレイアウトとまったく同じであることを確認できます。私は個人的にUDC(ユニバーサルドキュメントコンバーター)を使用してサーバーにFoxit Reader(無料版)をインストールし、 "Process"を起動してVerbプロパティを "print"に設定してドキュメントを印刷しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.