通过 eDrawings API 批量将 SOLIDWORKS 文件导出为 PDF(无需 SOLIDWORKS 软件)。
这个用 C# 开发的控制台应用程序允许通过 SOLIDWORKS eDrawings 的免费版本及其 API 将 SOLIDWORKS、DXF、DWG 文件导出为 PDF。使用此工具无需安装 SOLIDWORKS。
运行工具
此应用程序可以从命令行运行,并需要两个必填参数和一个可选参数,如下所述:
示例命令
exportpdf.exe "C:\SOLIDWORKS Drawings" "test.slddrw""C:\PDFs"
using System;
using System.Collections.Generic;
using System.Drawing.Printing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using eDrawings.Interop;
using eDrawings.Interop.EModelViewControl;
namespace ExportPdf
{
static class Module1
{
private static EModelViewControl m_Ctrl;
private static List<string> m_Files;
private static string m_OutDir;
public static void Main()
{
try
{
ExtractInputParameters();
var eDrwCtrl = new EDrawingsHost();
eDrwCtrl.ControlLoaded += OnEdrawingsControlLoaded;
var winForm = new Form();
winForm.Controls.Add(eDrwCtrl);
eDrwCtrl.Dock = DockStyle.Fill;
winForm.ShowIcon = false;
winForm.ShowInTaskbar = false;
winForm.WindowState = FormWindowState.Minimized;
winForm.ShowDialog();
}
catch (Exception ex)
{
PrintError(ex.Message);
}
}
private static void ExtractInputParameters()
{
string[] args = Environment.GetCommandLineArgs();
string input = args[1];
string filter = args[2];
m_OutDir = "";
if (args.Length > 3)
{
m_OutDir = args[3];
}
if (!string.IsNullOrEmpty(m_OutDir))
{
if (!Directory.Exists(m_OutDir))
{
Directory.CreateDirectory(m_OutDir);
}
}
if (Directory.Exists(input))
{
m_Files = Directory.GetFiles(input, filter, SearchOption.AllDirectories).ToList();
}
else if (File.Exists(input))
{
m_Files = new List<string>();
m_Files.Add(input);
}
else
{
throw new Exception("Specify input file or directory");
}
}
public static void OnEdrawingsControlLoaded(EModelViewControl ctrl)
{
Console.WriteLine(string.Format("Starting job. Exporting {0} file(s)", m_Files.Count));
m_Ctrl = ctrl;
global::ExportPdf.Module1.m_Ctrl.OnFinishedLoadingDocument += OnDocumentLoaded;
global::ExportPdf.Module1.m_Ctrl.OnFailedLoadingDocument += OnDocumentLoadFailed;
global::ExportPdf.Module1.m_Ctrl.OnFinishedPrintingDocument += OnDocumentPrinted;
global::ExportPdf.Module1.m_Ctrl.OnFailedPrintingDocument += OnPrintFailed;
PrintNext();
}
public static void PrintNext()
{
if (m_Files.Any())
{
string filePath;
filePath = m_Files.First();
m_Files.RemoveAt(0);
m_Ctrl.CloseActiveDoc("");
m_Ctrl.OpenDoc(filePath, false, false, false, "");
}
else
{
Console.WriteLine("Completed");
Environment.Exit(0);
}
}
public static void OnDocumentLoaded(string fileName)
{
MessageBox.Show("3");
const string PRINTER_NAME = "Microsoft Print to PDF";
const int AUTO_SOURCE = 7;
Console.WriteLine(string.Format("Opened {0}", fileName));
m_Ctrl.SetPageSetupOptions(EMVPrintOrientation.eLandscape, (int)PaperKind.A4, 100, 100, 1, AUTO_SOURCE, PRINTER_NAME, 0, 0, 0, 0);
string pdfFileName = Path.GetFileNameWithoutExtension(fileName) + ".pdf";
string outDir;
if (!string.IsNullOrEmpty(m_OutDir))
{
outDir = m_OutDir;
}
else
{
outDir = Path.GetDirectoryName(fileName);
}
string pdfFilePath;
pdfFilePath = Path.Combine(outDir, pdfFileName);
Console.WriteLine(string.Format("Exporting {0} to {1}", fileName, pdfFilePath));
m_Ctrl.Print5(false, fileName, false, false, true, EMVPrintType.eOneToOne, 1, 0, 0, true, 1, 1, pdfFilePath);
}
public static void OnDocumentLoadFailed(string fileName, int errorCode, string errorString)
{
PrintError(string.Format("Failed to load {0}: {1}", fileName, errorString));
PrintNext();
}
public static void OnDocumentPrinted(string printJobName)
{
Console.WriteLine(string.Format("'{0}' export completed", printJobName));
PrintNext();
}
public static void OnPrintFailed(string printJobName)
{
PrintError(string.Format("Failed to export '{0}'", printJobName));
PrintNext();
}
public static void PrintError(string msg)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(msg);
Console.ResetColor();
}
}
}
主要代码模块
-
Main
方法:- 程序的入口点,捕获可能出现的异常。
- 创建
EDrawingsHost
实例eDrwCtrl
,并设置其ControlLoaded
事件处理程序为OnEdrawingsControlLoaded
。 - 创建一个
Form
,将eDrwCtrl
添加到Form
的控件中,并设置一些属性后以对话框形式显示。
-
ExtractInputParameters
方法:- 从命令行参数中提取输入参数,包括输入文件或文件夹路径、筛选器和可选的输出文件夹路径。
- 如果输出文件夹不存在,则创建该文件夹。
- 如果输入是一个目录,则获取该目录下符合筛选条件的所有文件路径存入
m_Files
;如果输入是一个文件,则将该文件路径存入m_Files
。
-
OnEdrawingsControlLoaded
方法:- 当 eDrawings 控件加载完成时触发。
- 打印开始任务的信息,并设置
m_Ctrl
的各种事件处理程序。 - 调用
PrintNext
方法开始处理第一个文件。
-
PrintNext
方法:- 如果
m_Files
中有文件,则取出第一个文件路径,关闭当前打开的文档,打开这个文件。 - 如果
m_Files
为空,则打印任务完成信息并退出程序。
- 如果
-
OnDocumentLoaded
方法:- 当文档加载成功时触发。
- 设置页面打印选项,确定输出 PDF 文件的名称和路径。
- 使用
m_Ctrl
的打印方法将当前文档打印为 PDF 文件。
-
OnDocumentLoadFailed
方法:- 当文档加载失败时触发。
- 打印错误信息,并调用
PrintNext
方法继续处理下一个文件。
-
OnDocumentPrinted
方法:- 当文档打印成功时触发。
- 打印文档导出完成的信息,并调用
PrintNext
方法继续处理下一个文件。
-
OnPrintFailed
方法:- 当文档打印失败时触发。
- 打印错误信息,并调用
PrintNext
方法继续处理下一个文件。
-
PrintError
方法:- 将错误信息以红色字体打印到控制台,然后恢复控制台颜色。