Как я могу преобразовать файл RTF в файл PDF? - PullRequest
4 голосов
/ 05 декабря 2009

Как я могу преобразовать файл RTF в PDF? У меня есть Adobe PDF принтер, я должен его использовать? Если да, то как я могу получить к нему программный доступ?

Ответы [ 6 ]

2 голосов
/ 06 декабря 2009

Вы можете использовать принтер PDF, но тогда вам все еще придется решить несколько проблем.

Для обработки текста, занимающего несколько страниц, вам нужна эта статья для создания потомка RichTextbox, который обрабатывает сообщение EM_FORMATRANGE.

Существует множество (бесплатных) PDF-принтеров, но я обнаружил, что только BioPdf позволит вам контролировать имя выходного файла. У них также есть разумные цены на лицензионные версии.

Я использовал это для создания сложных отчетов (комбинаций нескольких сегментов RTF и пользовательской графики) в качестве вложений для отправки по электронной почте.

2 голосов
/ 06 декабря 2009

Вы можете использовать виртуальный драйвер печати 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, поэтому он должен быть простым в использовании. Вы можете назначить любой rtf, используя метод Rtb.rtf.

1 голос
/ 06 декабря 2009

См. эту статью . Похоже, вы можете использовать его без многих модификаций. Использует Open Office.

0 голосов
/ 08 декабря 2009

На самом деле, ни один из них не очень надежен и не делает то, что я хочу. Решение простое, установите Adobe Acrobat и просто откройте файл RTF с помощью класса Process.

Я также нашел более разумный подход. Я сохраняю файл в формате RTF, открываю его словом и сохраняю в формате PDF (должен быть установлен плагин Word's 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]);
                }
            }
0 голосов
/ 05 декабря 2009

ITextSharp должен помочь вам.

0 голосов
/ 05 декабря 2009

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.

...