ฉันจะแปลงไฟล์ Word เป็น PDF โดยทางโปรแกรมได้อย่างไร [ปิด]


221

ฉันได้พบโปรแกรมโอเพนซอร์ซ / ฟรีแวร์หลายโปรแกรมที่อนุญาตให้คุณแปลงไฟล์. doc เป็นไฟล์. pdf แต่เป็นแอพพลิเคชั่น / ไดรเวอร์เครื่องพิมพ์ที่หลากหลายโดยไม่มีการเชื่อมต่อกับ SDK

ฉันพบหลายโปรแกรมที่มี SDK ที่ช่วยให้คุณสามารถแปลงไฟล์. doc เป็นไฟล์. pdf ได้ แต่พวกเขาเป็นเจ้าของลิขสิทธิ์ $ 2,000 ใบอนุญาตหรือราว ๆ นั้น

ไม่มีใครรู้วิธีแก้ปัญหาทางโปรแกรมที่สะอาดราคาไม่แพง (ดีกว่า) โดยใช้ C # หรือ VB.NET หรือไม่?

ขอบคุณ!


1
ตรวจสอบว่าPandocมีการผูกสำหรับภาษาที่คุณชื่นชอบ ส่วนต่อประสานบรรทัดคำสั่งนั้นตายง่ายเช่นกันpandoc manual.docx -o manual.pdf
พันเอก Panic

ตรวจสอบGemBox.Document SDK ด้วย มันมีรุ่นฟรีและรุ่นที่ราคาไม่แพง ไม่ใช้ไดรเวอร์เครื่องพิมพ์หรือ ms office ในการแปลงไฟล์ Word เป็น PDF
hertzogth

คุณสามารถใช้ docx2pdf เพื่อทำการแปลงนี้: github.com/AlJohri/docx2pdf
Al Johri

คำตอบ:


204

ใช้ foreach loop แทน for for loop - มันแก้ปัญหาของฉันได้

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 พร้อมกับติดตั้งAdd-in แบบบันทึกเป็น PDF มันค้นหาไดเรกทอรีสำหรับไฟล์. doc เปิดใน Word แล้วบันทึกเป็น PDF โปรดทราบว่าคุณจะต้องเพิ่มการอ้างอิงถึง Microsoft.Office.Interop คำแนะนำในการแก้ไขปัญหา

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
ขอบคุณ! ฉันอาจไปกับ Aspose ต่อไปถ้ามันเร็วกว่า Word automation แต่ถ้าฉันสามารถทนความเชื่องช้าเล็กน้อยฉันจะใช้วิธีแก้ปัญหาของคุณ ขอบคุณอีกครั้ง!
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
อืม ... ถ้าไม่ได้ติดตั้งคำฉันคิดว่าการบรรจุชุดอินเทอร์พอยท์จะเป็นสิ่งที่คุณกังวลน้อยที่สุด รหัสนี้ต้องการคำที่จะติดตั้ง
BrainSlugs83

35

หากต้องการหาผลรวมสำหรับผู้ใช้ vb.net ตัวเลือกฟรี (ต้องติดตั้ง office):

ดาวน์โหลดชุดประกอบ Microsoft office:

ตัวอย่าง 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
ยังคงใช้งานได้ในปี 2558 ด้วย Office 2013 คุณไม่จำเป็นต้องดาวน์โหลด PIA แยกต่างหาก
Adam Anderson

3
และบูมถ้ามันเปิดกล่องข้อความและถามอะไรบางอย่าง - ตัวอย่างเช่นในเว็บแอปพลิเคชัน ... หรือทำเอกสาร 2 ฉบับในเวลาเดียวกัน ...
Stefan Steiger

ตัวเลือก freemium (ผ่าน nodejs และ edge.js หรือ Javascript.NET) คือnpmjs.com/package/@nativedocuments/docx-wasm (ไม่จำเป็นต้องใช้ Word)
JasonPlutext

14

PDFCreatorมีส่วนประกอบ COM, callable จาก. NET หรือ VBScript (ตัวอย่างรวมอยู่ในการดาวน์โหลด)

แต่สำหรับฉันแล้วมันดูเหมือนว่าเครื่องพิมพ์เป็นสิ่งที่คุณต้องการ - เพียงแค่ผสมมันเข้ากับระบบอัตโนมัติของ Wordและคุณควรจะไปได้ดี


คอมโพเนนต์ COM นี้อยู่ที่ไหน และ "มิค" หมายถึงอะไร? นั่นหมายถึงการเป็น "มิกซ์" หรือไม่?
Shaul Behr

คอมโพเนนต์ COM รวมอยู่ในการดาวน์โหลดพร้อมกับตัวอย่าง และใช่ว่าควรจะ "ผสม"
Mark Brackett

4
FYI - หากคุณไปเส้นทางนี้ PDFCreator จะรวมมัลแวร์ในตัวติดตั้ง ปัญหานี้เป็นปัญหาต่อเนื่องของ PDFCreator ตั้งแต่ปี 2009
Phil Gorley

2
@PhilGorley มัลแวร์? และคำตอบนี้คือ +8 ...
Mzn

@Mzn - FWIW ให้ความสนใจและไม่เลือกการติดตั้ง addon จะทำงานได้สำหรับฉันเสมอ ฉันไม่เห็นว่ามันแตกต่างจาก Oracle bundling crap ในตัวติดตั้ง Java มันน่ารำคาญ แต่ก็ไม่คุ้มที่จะหลีกเลี่ยงซอฟต์แวร์สำหรับฉัน (ใช่แล้วโอเคแอดแวร์ PdfCreator อาจมีประโยชน์น้อยกว่าและน่ารำคาญกว่าสิ่งใดที่ออราเคิลกำลังผลักดันในวันนี้ ... ฉันยังไม่ต้องการอย่างใดอย่างหนึ่ง)
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
เพียงบันทึกสำหรับผู้ที่ไม่ทราบว่าคุณต้องติดตั้ง Office บนเครื่องเพื่อใช้ไลบรารี Microsoft Interop
Sam Rueby

ดี! ฉันขอแนะนำให้ตั้งค่าapp.Visible = false;และเพิ่มการโทรapp.Quit();ในบล็อกสุดท้าย
Dan Korn

7

มีทั้งการอภิปรายของห้องสมุดสำหรับการแปลง Word เป็น PDFบนของโจเอลฟอรั่มการอภิปราย คำแนะนำจากเธรด:


9
ขอบคุณ แต่คำแนะนำทั้งหมดนั้นอยู่ในสองหมวดหมู่ที่ฉันได้อธิบายไว้ข้างต้น: ไม่ได้เป็นโปรแกรมหรือมีราคาแพงมาก ฉันต้องการ. doc เป็น. pdf โดยทางโปรแกรมโดยเฉพาะ
Shaul Behr

5

ฉันผ่านความเจ็บปวด Word เป็น PDF เมื่อมีคนทิ้งฉันด้วยไฟล์คำ 10,000 ไฟล์เพื่อแปลงเป็น PDF ตอนนี้ฉันทำมันใน C # และใช้ Word interop แต่มันช้าและพังถ้าฉันพยายามใช้ PC เลย .. น่าผิดหวังมาก

สิ่งนี้ทำให้ฉันค้นพบว่าฉันสามารถทิ้งการทำงานร่วมกันและความเชื่องช้าของพวกเขา ..... สำหรับ Excel ที่ฉันใช้ (EPPLUS) และจากนั้นฉันค้นพบว่าคุณสามารถรับเครื่องมือฟรีที่เรียกว่า Spire ที่อนุญาตให้แปลงเป็น PDF ...

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


ขอบคุณสำหรับสิ่งนี้ - โซลูชั่นที่ยอดเยี่ยมโดยไม่ต้องใช้ Interop เหตุใดจึงยากที่จะหาตัวแปลง docx เป็น PDF ฟรี
mbdavis

ฉันมีความหวังสูงในเรื่องนี้ แต่รุ่นฟรี จำกัด อยู่ที่ 3 หน้าของผลลัพธ์ PDF เวอร์ชันเต็มมีราคาแพงมากหากคุณต้องการการปรับใช้ที่ไม่ จำกัด
grinder22 22

grinder22 GemBox.Document ยังมีรุ่นฟรีที่มีข้อ จำกัด ด้านขนาดและรุ่นที่จำหน่ายได้แล้ว อย่างไรก็ตามมันรวมการปรับใช้ที่ไม่เสียค่าใช้จ่ายเพื่อให้คุณสามารถสร้างและเผยแพร่โครงการได้ไม่ จำกัด จำนวนโดยไม่มีค่าใช้จ่ายเพิ่มเติม
hertzogth

3

โค้ดที่ง่ายและวิธีการแก้ปัญหาที่ใช้Microsoft.Office.Interop.Wordในการแปลงคำในรูปแบบ 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

ดูเหมือนว่าจะเป็นข้อมูลที่เกี่ยวข้องที่นี่:

การแปลงเอกสาร MS Word เป็น PDF ใน ASP.NET

นอกจากนี้ด้วย Office 2007 ที่มีการเผยแพร่ไปยังฟังก์ชั่น PDF ฉันคิดว่าคุณสามารถใช้ระบบอัตโนมัติของ Office เพื่อเปิดไฟล์ * .DOC ใน Word 2007 และ Save as PDF ฉันไม่กระตือรือร้นกับระบบอัตโนมัติของสำนักงานมากนักเนื่องจากมันช้าและมีแนวโน้มที่จะแขวนอยู่ แต่ก็ทิ้งมันไว้ที่นั่น ...


Aspose อาจทำงานได้ แต่มีราคาแพงอย่างไม่มีการลด
Shaul Behr

1

Microsoft PDF add-in สำหรับ word ดูเหมือนจะเป็นทางออกที่ดีที่สุดในตอนนี้ แต่คุณควรคำนึงว่ามันไม่ได้แปลงเอกสาร word ทั้งหมดให้ถูกต้องเป็น pdf และในบางกรณีคุณจะเห็นความแตกต่างอย่างมากระหว่างคำและ PDF output น่าเสียดายที่ฉันไม่พบ API ใด ๆ ที่จะแปลงเอกสารคำทั้งหมดอย่างถูกต้อง ทางออกเดียวที่ฉันพบเพื่อให้แน่ใจว่าการแปลงถูกต้อง 100% คือการแปลงเอกสารผ่านไดรเวอร์เครื่องพิมพ์ ข้อเสียคือเอกสารถูกจัดคิวและแปลงทีละรายการ แต่คุณสามารถมั่นใจได้ว่าไฟล์ PDF ที่ได้นั้นเหมือนกับเค้าโครงเอกสาร Word ฉันชอบส่วนตัวโดยใช้ UDC (ตัวแปลงเอกสารสากล) และติดตั้ง Foxit Reader (รุ่นฟรี) บนเซิร์ฟเวอร์แล้วพิมพ์เอกสารโดยเริ่มต้น "กระบวนการ" และตั้งค่าคุณสมบัติกริยาเป็น "พิมพ์"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.