如何将RTF文件转换为PDF文件?我有adobe PDF打印机,我应该使用它吗?如果是这样,我如何以编程方式访问它?
答案 0 :(得分:2)
如果在生产计算机上允许,则可以使用虚拟打印驱动程序doPdf http://www.dopdf.com/。这会将或多或少的任何文件类型转换为pdf格式而不仅仅是rtf。一旦安装,它就会在打印管理器中显示为另一台打印机。
要在winforms代码中使用它,我修改了msdn打印示例http://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.aspx上找到的代码
private void button1_Click(object sender, EventArgs e)
{
try
{
streamToPrint = new System.IO.StreamReader
(@"F:\temp\labTest.txt");
try
{
printFont = new Font("Arial", 10);
PrintDocument pd = new PrintDocument();
pd.PrinterSettings.PrinterName = "doPDF v6";//<-------added
pd.PrintPage += new PrintPageEventHandler
(this.pd_PrintPage);
pd.Print();
}
finally
{
streamToPrint.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
我需要添加的代码的唯一部分是上面标记的代码,例如: pd.PrinterSettings.PrinterName =“doPDF v6”;
可能有一种打印机枚举方法更优雅,更健壮,而且可以测试打印驱动程序是否存在于配置文件设置中。
更新: 在此方法中处理多个页面:this.pd_PrintPage根据msdn示例。 PrintDocument支持从页面打印到页面打印。 DoPdf会自动弹出一个fileSaveAsDialog框,这样文件就可以保存为pdf文档。
rtf虽然怎么样? 看起来不太支持Microsoft格式。这篇带有演示代码的文章http://msdn.microsoft.com/en-us/library/ms996492.aspx使用RichTextBox作为起点,并使用P / Invoke利用Win32的强大功能将RTF打印为WYSIWG。控件定义了它自己的页面长度方法,取代了上面在代码片段中使用的方法,并且仍然使用PrintDocument,因此它应该易于使用。您可以使用Rtb.rtf方法指定任何rtf。
答案 1 :(得分:2)
您可以使用PDF打印机,但是仍然有一些问题需要解决。
为了处理跨越多个页面的文本,您需要this article来创建处理EM_FORMATRANGE消息的RichTextbox的后代。
那里有很多(免费)PDF打印机,但我发现只有BioPdf才能控制输出的文件名。它们对许可版本也有合理的费率。
我用它来创建复杂的报告(多个RTF段和自定义图形的组合)作为电子邮件附件。
答案 2 :(得分:1)
见this article。看起来你可以使用它而无需很多修改。它使用Open Office。
答案 3 :(得分:0)
某些可以理解该格式的应用程序必须读取和解释RTF文档。您需要以编程方式启动该应用程序,加载RTF文件,然后将其发送到PDF打印机。 Word会很好,因为它有一个很好的.NET界面。这些步骤的概述如下:
ApplicationClass word = new ApplicationClass();
Document doc = word.Documents.Open(ref filename, ...);
doc.PrintOut(...);
您需要使用Microsoft.Office.Interop.Word
命名空间并添加对Microsoft.Office.Interop.Word.dll
程序集的引用。
答案 4 :(得分:0)
ITextSharp应该为你做到这一点。
答案 5 :(得分:-1)
实际上,这些都不是非常可靠或者我想要的。解决方案很简单,安装Adobe Acrobat并让它使用Process类打开RTF文件。
我也找到了一种更合理的方法。我将文件保存为RTF,将其打开,然后将其保存为PDF(必须安装Word的Print as PDF插件)
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Personal Document File (*.pdf)|*.pdf";
if (sfd.ShowDialog() == DialogResult.OK) {
String filename = Path.GetTempFileName() + ".rtf";
using (StreamWriter sw = new StreamWriter(filename)) {
sw.Write(previous);
}
Object oMissing = System.Reflection.Missing.Value; //null for VB
Object oTrue = true;
Object oFalse = false;
Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Document oWordDoc = new Microsoft.Office.Interop.Word.Document();
oWord.Visible = false;
Object rtfFile = filename;
Object saveLoc = sfd.FileName;
Object wdFormatPDF = 17; //WdSaveFormat Enumeration
oWordDoc = oWord.Documents.Add(ref rtfFile, ref oMissing, ref oMissing, ref oMissing);
oWordDoc.SaveAs(ref saveLoc, ref wdFormatPDF, 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);
oWordDoc.Close(ref oFalse, ref oMissing, ref oMissing);
oWord.Quit(ref oFalse, ref oMissing, ref oMissing);
//Get the MD5 hash and save it with it
FileStream file = new FileStream(sfd.FileName, FileMode.Open);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
file.Close();
using (StreamWriter sw = new StreamWriter(sfd.FileName + ".md5")) {
sw.WriteLine(sfd.FileName + " - " + DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToShortTimeString() + " md5: " + BinaryToHexConverter.To64CharChunks(retVal)[0]);
}
}