我正在开发一个由一百多个用户使用的 VB6 应用程序。它生成 Word 文档,然后将该文档的 TIFF 图像保存在数据库中。目前,它只是将打印机设置为 Microsoft Office Document Image Writer,将文档“打印”到设定位置,然后将生成的 TIFF 文件导入数据库。然而,该组织正在将所有人升级到 Office 07,这意味着 Microsoft Office Document Image Writer 即将消失。所以,我想知道以编程方式从 Word 转换为 TIFF 有多难。
我们已经引入了 C# (.NET 3.5) 控件库作为 COM,因此这似乎是放置该功能的好地方。在某个时候,我会将整个应用程序转换为 3.5,因此我希望任何新代码都已经存在,这样需要转换的内容就会更少。
编辑:我很欣赏这些建议,但我真的很想尝试在不使用昂贵的第三方组件的情况下做到这一点。只是很难让有钱人看到花费数千美元来修复以前免费使用的东西的好处。另外,我真的很感兴趣自己如何滚动它。我知道有点受虐狂,但我进入编程是因为我渴望知道事情是如何工作的......:)
感谢您的帮助!
据我所知(快速谷歌似乎证实了这一点),TIFF 格式和 DOC 二进制格式规范都可以在网络上免费获得。因此,这将是一个相当大且复杂的项目(我认为是人月而不是人周),您可以编写代码来读取 DOC 文档并填充对象模型。然后,您可以编写更多代码,将对象模型输出为 TIFF 文档。
但是,想想一些复杂性:表格、格式、字符集、间距、嵌入内容等。哎呀!我想这就是为什么它通常是昂贵的第三方图书馆或专业文档管理系统的工作。
出于兴趣,现在是否是时候放弃专有文档格式并将文档作为更易于管理的内容存储在数据库中?
您可以利用 Microsoft Windows 附带的标准“传真”驱动程序以编程方式将 Word 文档转换为 TIFF。此工作的关键是确保 OutputFileName 具有“.tiff”扩展名 这是示例代码(VB.net 和 Word 2010):
Dim objWdDoc As Word.Document
Dim objWord As Word.Application
Dim sDesktop As String = Environment.GetEnvironmentVariable("userprofile") & "\Desktop\"
objWord = CreateObject("Word.Application")
objWdDoc = objWord.Documents.Open(sDesktop & "testdocument.doc")
objWord.Visible = True
'Select Printer
objWord.ActivePrinter = "Fax"
'Print to Tiff
objWdDoc.PrintOut(Range:=WdPrintOutRange.wdPrintAllDocument, _
OutputFileName:=sDesktop & "test.tiff", _
Item:=WdPrintOutItem.wdPrintDocumentContent, _
PrintToFile:=True)
'Close Document
objWdDoc.Close()
'Close Word
objWord.Quit()
'General Cleanup
objWdDoc = Nothing
objWord = Nothing
尝试Aspose.Word组件
Microsoft Office Document Image Writer 在 Office 2007 中仍然可用(至少在 Enterprise 中) - 它是一个可选组件。
您需要使用Aspose.Word dotnet 包。这是示例代码:
public byte[] ConvertWordToTiff(byte[] sourceWordDoc)
{
return ConvertWord(sourceWordDoc, SaveFormat.Tiff);
}
private static byte[] ConvertWord(byte[] sourceWordDoc, SaveFormat format)
{
byte[] result = null;
try
{
var doc = new Document(new MemoryStream(sourceWordDoc));
ClearFormat(doc);
var options = SaveOptions.CreateSaveOptions(format);
options.PrettyFormat = true;
options.UseAntiAliasing = true;
options.UseHighQualityRendering = true;
using (var m = new MemoryStream())
{
doc.Save(m, options);
m.Position = 0;
result = m.ToArray();
}
}
catch (Exception ex)
{
LogManager.GetCurrentClassLogger().Fatal(ex);
}
return result;
}
private static void ClearFormat(Document doc)
{
for (var i = 0; i < doc.Sections.Count; i++)
{
var nodes = doc.Sections[i].GetChildNodes(NodeType.Run, true);
if (nodes == null || nodes.Count <= 0) continue;
foreach (var item in (from Run item in nodes
where item.Font.Name.ToLower().Contains("nastaliq")
select item).ToList())
{
item.Font.Name = "Times New Roman";
item.Font.Size = item.Font.Size > 12 ? 12 : item.Font.Size;
}
}
}