читать текстовые документы из varbinary, редактировать, создавать защищенные от записи pdf - PullRequest
0 голосов
/ 08 января 2020

У меня есть метод, который использует Microsoft.Office.Interop для чтения документа Word, его редактирования и записи в формате PDF. У меня есть отдельный метод, который использует Itext7 для чтения этого PDF-файла и записи его в другой PDF-файл, который можно просматривать и распечатывать, но нельзя легко изменить.

Первый метод считывает документ word с диска; однако меня попросили заставить его прочитать документ из запроса sql из переменной, хранящейся как varbinary, и записать конечный результат как varbinary -w без использования любых промежуточных файлов на диске. Я думаю, что мне нужно прочитать их как "потоки"

Вот что у меня есть:

class clsMakeCert
{
    string myName;
    public string myDate;

    public clsMakeCert(string name, DateTime date)
    {
        myName = name;
        myDate = date.ToString("MM/dd/yyyy");
    }
    public void createCertPdf(string certFilename)
    {
        // Get the document out of the SQL table
        System.Data.DataTable dtContents = new System.Data.DataTable();
        SqlDataReader rdr_Contents = null;

        using (SqlConnection conn = new SqlConnection("Server=KGREEN3-LT\\SQLEXPRESS;Initial Catalog=SAN;Integrated Security=SSPI"))
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand("Select [file_data] From cert_files where filename=@certFilename", conn);
            {
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.AddWithValue("@certFilename", certFilename);
                rdr_Contents = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                dtContents.Load(rdr_Contents);
            }
        }
        byte[] byteArray = (byte[])dtContents.Rows[0]["file_data"];

        // Put it into a word document
        Application wordApp = new Application { Visible = false };
        Document doc = new Document();

        using (MemoryStream stream = new MemoryStream())
        {
            stream.Write(byteArray, 0, (int)byteArray.Length);
            doc = wordApp.Documents.Open(stream, ReadOnly: false, Visible: false);
            doc.Activate();
            FindAndReplace(wordApp, "First Middle Last", myName);
            FindAndReplace(wordApp, "11/11/1111", myDate);

        }



        return ;

    }

}

Не похоже, что открытый метод примет хотя stream.

Похоже, я могу использовать open XML, чтобы читать / редактировать docx как поток. Но это не будет конвертировать в PDF. Похоже, что я могу использовать Interop для чтения / редактирования документа и записи в PDF, но я не могу сделать это как поток (только как файл на диске).

Есть ли способ получить Interop читать поток (то есть файл, загруженный из varbinary)? к

1 Ответ

1 голос
/ 08 января 2020

Нет, слово «Interop» не поддерживает потоковую передачу. Самое близкое (и это единственное приложение Office, имеющее такую ​​возможность) - передать необходимый Word Open XML в формате плоского файла OP C, используя метод InsertXML модели obejct. Однако не гарантируется, что в результате будет получена точная копия файла Word Open XML, который передается, поскольку настройки целевого документа могут переопределить некоторые из входящих настроек.

...