从 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 文件完全相同,因为目标文档的设置可能会覆盖某些传入设置。
我有一个方法,使用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 文件完全相同,因为目标文档的设置可能会覆盖某些传入设置。