我需要打印一份我已更改的pdf文档,而不将其保存为新的pdf文档。下面的代码没有问题。但是,我想以完全不同的方式做到这一点,我同时有一个大脑滞后,无法看到解决方案。
我的代码示例
byte[] result;
using (MemoryStream ms = new MemoryStream())
{
PdfReader pdfReader = new PdfReader("c:\\templatePdf.pdf");
PdfStamper pdfStamper = new PdfStamper(pdfReader, ms);
/* abbreviated but here I alter the template pdf */
pdfStamper.FormFlattening = true;
pdfStamper.Close();
result = ms.GetBuffer();
}
/* Instead of saving a new file I would rather like to print
the altered template pdf in memory and then discard it */
using (FileStream fs = File.Create("C:\\Test.pdf"))
{
fs.Write(result, 0, (int)result.Length);
}
Process process = new Process();
process.StartInfo.FileName = "C:\\Test.pdf";
process.StartInfo.Verb = "printto";
process.StartInfo.Arguments = "\"" + ppr_PrinterDropDown.Text + "\"";
process.Start();
File.Delete("C:\\Test.pdf");
答案 0 :(得分:1)
如果您使用的是基于文件的API,那么您将很难在没有文件的情况下执行此操作。您可能能够设置命名管道服务器,但坦率地说,这是一个巨大的小提琴。但是,我会试着四处寻找具有打印支持的完全托管的PDF库。但最终......文件系统有什么害处,真的?可能不是很多。我可能会建议一些调整,但是:
Path.GetTempPath()
),而不是C:\Test
答案 1 :(得分:0)
首先我们需要写入我们的内存流,然后借助内存流方法“WriteTo”,我们可以写入页面的响应,如下面的代码所示。
MemoryStream filecontent = null;
filecontent =//CommonUtility.ExportToPdf(inputXMLtoXSLT);(This will be your MemeoryStream Content)
Response.ContentType = "image/pdf";
string headerValue = string.Format("attachment; filename={0}", formName.ToUpper() + ".pdf");
Response.AppendHeader("Content-Disposition", headerValue);
filecontent.WriteTo(Response.OutputStream);
Response.End();
FormName是给定的fileName,此代码将通过调用PopUp使生成的PDF文件可下载。
答案 2 :(得分:0)
这很容易。困难的部分是获取有关打印状态完成和总页数的有用信息。
var pq = LocalPrintServer.GetDefaultPrintQueue();
var theJob = pq.AddJob();
try{
using(var js = theJob.JobStream){
var buffer = File.ReadAllBytes("yourPathToPdf");
js.Write(buffer,0,buffer.Length);
}
var done=false;
while(!done)
{
pq.Refresh();
theJob.Refresh();
done = theJob.IsCompleted || theJob.IsDeleted || theJob.IsPrinted;
}
}
catch(Exception ex){
//handle this
}
finally{
theJob?.Dispose();
pq?.Dispose();
}
这假设您的打印机当然具有原生PDF支持。否则,您将不得不在客户端上自行完成渲染工作,而不是将其作为原始流发送。