从 varbinary 读取 word 文档,编辑,创建一个写保护的 pdf

read word document from varbinary, edit, create a write protected pdf

我有一个方法,使用Microsoft.Office.Interop阅读Word文档,编辑它,然后将它写成PDF。我有一个单独的方法,使用 Itext7 读取此 PDF 并将其写入另一个可以查看和打印但不能轻易更改的 PDF。

第一种方法从磁盘读取word文档;但是,我被要求让它从存储为 varbinary 的变量的 sql 查询中读取文档,并将最终结果写入 varbinary - 不使用磁盘上的任何中间文件。我想我需要将这些阅读为 "streams"

这是我拥有的:

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 ;

    }

}

不过,open 方法似乎不会接受流。

看来我可以使用 openXML 以流的形式读取/编辑 docx。但它不会转换为pdf。 看起来我可以使用 Interop 来读取/编辑 docx 并写入 PDF,但我不能将其作为流(只能作为磁盘上的文件)。

有没有办法让 Interop 读取流(即从 varbinary 加载的文件)? k

不,Word "Interop" 不支持流式传输。最接近的(它是唯一具有此功能的 Office 应用程序)是使用对象模型的 InsertXML 方法以 OPC 平面文件格式传递必要的 Word Open XML。但是,不能保证结果将与传入的 Word Open XML 文件完全相同,因为目标文档的设置可能会覆盖某些传入设置。