abcpdf HttpAdditionalHeaders cookies

abcpdf HttpAdditionalHeaders cookies,cookies,http-headers,abcpdf,Cookies,Http Headers,Abcpdf,嗨,我正在尝试在使用abcpdf生成pdf文件时向http头添加cookie。到目前为止,我所做的工作基于以下文档: 从我的浏览器请求将页面转换为PDF时,标题为: Connection: keep-alive Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01 Accept-Encoding: gzip, deflate A

嗨,我正在尝试在使用abcpdf生成pdf文件时向http头添加cookie。到目前为止,我所做的工作基于以下文档:

从我的浏览器请求将页面转换为PDF时,标题为:

Connection: keep-alive
Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Accept-Encoding: gzip, deflate
Accept-Language: en-ie
Cookie: __utma=111872281.2030591713.1334325919.1348754241.1349943306.47; __utmz=111872281.1334325919.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); CurrentClient=AMF; UserHasMultipleClients=False; favFunds=%5B%7B%22id%22%3A57%2C%22alias_id%22%3A1690%7D%2C%7B%22id%22%3A794%2C%22alias_id%22%3Anull%7D%2C%7B%22id%22%3A818%2C%22alias_id%22%3Anull%7D%2C%7B%22id%22%3A21%2C%22alias_id%22%3Anull%7D%5D; favComparisons=%5B%7B%22selectedFunds%22%3A%5B%7B%22id%22%3A%22794%22%2C%22alias%22%3A%22null%22%7D%2C%7B%22id%22%3A%2217%22%2C%22alias%22%3A%22null%22%7D%2C%7B%22id%22%3A%22593%22%2C%22alias%22%3A%22old%22%7D%2C%7B%22id%22%3A%22593%22%2C%22alias%22%3A%221606%22%7D%5D%2C%22selectedIndexes%22%3A%5B%7B%22id%22%3A%2224002259%22%2C%22alias%22%3A%22null%22%7D%5D%2C%22timePeriosSelection%22%3A%7B%22dateOne%22%3A%2223-11-2011%22%2C%22dateTwo%22%3A%2223-11-2012%22%7D%2C%22defaultTimePeriodSelection%22%3A%7B%22OneYear%22%3Atrue%2C%22ThreeYears%22%3Afalse%2C%22FiveYears%22%3Afalse%7D%7D%2C%7B%22selectedFunds%22%3A%5B%7B%22id%22%3A%22774%22%2C%22alias%22%3A%22null%22%7D%2C%7B%22id%22%3A%22215%22%2C%22alias%22%3A%22null%22%7D%5D%2C%22selectedIndexes%22%3A%5B%7B%22id%22%3A%2224002259%22%2C%22alias%22%3A%22null%22%7D%5D%2C%22timePeriosSelection%22%3A%7B%22dateOne%22%3A%2223-11-2011%22%2C%22dateTwo%22%3A%2223-11-2012%22%7D%2C%22defaultTimePeriodSelection%22%3A%7B%22OneYear%22%3Atrue%2C%22ThreeYears%22%3Afalse%2C%22FiveYears%22%3Afalse%7D%7D%2C%7B%22selectedFunds%22%3A%5B%7B%22id%22%3A%22215%22%2C%22alias%22%3A%22null%22%7D%5D%2C%22selectedIndexes%22%3A%5B%7B%22id%22%3A%2224002259%22%2C%22alias%22%3A%22null%22%7D%5D%2C%22timePeriosSelection%22%3A%7B%22dateOne%22%3A%2223-11-2011%22%2C%22dateTwo%22%3A%2223-11-2012%22%7D%2C%22defaultTimePeriodSelection%22%3A%7B%22OneYear%22%3Atrue%2C%22ThreeYears%22%3Afalse%2C%22FiveYears%22%3Afalse%7D%7D%5D
Host: localhost:63706
Referer: http://localhost:63706/
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0.1
X-Requested-With: XMLHttpRequest
当请求来自abcpdf时,标题为:

Connection: keep-alive
Keep-Alive: 115
Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Accept-Charset: ISO-8859-1, utf-8; q=0.7, *; q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: en-us, en; q=0.5
Host: localhost:63706
Referer: http://localhost:63706/
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/ /2.0.1
X-Requested-With: XMLHttpRequest
正如你所看到的,它缺少饼干。因此,我手动将以下内容添加到头中(abcpdf发送请求之前的doc.HtmlOptions.HttpAdditionalHeaders值)

这是完整的代码:

public MemoryStream HtmlToPdf(Uri pdfUrl, HttpCookieCollection cookies, bool landscape)
{
    var pdfStream = new MemoryStream();
    var theDoc = new Doc();
    if (landscape)
    {
        // apply a rotation transform
        double w = theDoc.MediaBox.Width;
        double h = theDoc.MediaBox.Height;
        double l = theDoc.MediaBox.Left;
        double b = theDoc.MediaBox.Bottom;
        theDoc.Transform.Rotate(90, l, b);
        theDoc.Transform.Translate(w, 0);
        // rotate our rectangle
        theDoc.Rect.Width = h;
        theDoc.Rect.Height = w;
    }

    theDoc.HtmlOptions.Engine = EngineType.Gecko;
    theDoc.HtmlOptions.Timeout = 60000;
    theDoc.HtmlOptions.UseScript = true;
    theDoc.HtmlOptions.OnLoadScript = "(function(){window.ABCpdf_go = false; setTimeout(function(){window.ABCpdf_go = true;}, 1000);})();";
    var url = Uri.UnescapeDataString(pdfUrl.ToString());

    if (cookies.Count > 0)
    {
        //send copy of cookies from original request
        var additionalHeadersString = "Cookie: ";
        foreach (var key in cookies.AllKeys)
        {
            if (!cookies.AllKeys[0].Equals(key)) //is NOT first element in cookie collection
            {
                additionalHeadersString += "; ";
            }
            additionalHeadersString += key + "=" + cookies[key].Value;
        }
        additionalHeadersString += "\r\n";
        theDoc.HtmlOptions.HttpAdditionalHeaders = additionalHeadersString;
        theDoc.HtmlOptions.NoCookie = true;
        theDoc.HtmlOptions.HostWebBrowser = false;
    }

    //send request
    var pageRef = theDoc.AddImageUrl(url, true, 1200, false);
    while (theDoc.Chainable(pageRef))
    {
        theDoc.Page = theDoc.AddPage();
        pageRef = theDoc.AddImageToChain(pageRef);
    }
    for (var i = 1; i <= theDoc.PageCount; i++)
    {
        theDoc.PageNumber = i;
        theDoc.Flatten();
    }

    theDoc.Save(pdfStream);
    theDoc.Clear();
    var byteInfo = pdfStream.ToArray();
    pdfStream.Write(byteInfo, 0, byteInfo.Length);
    pdfStream.Position = 0;
    return pdfStream;
}
公共内存流HtmlToPdf(Uri pdfUrl、HttpCookieCollection cookies、bool景观)
{
var pdfStream=newmemoryStream();
var theDoc=新文档();
国际单项体育联合会(景观)
{
//应用旋转变换
双w=Doc.MediaBox.Width;
双h=Doc.MediaBox.Height;
双l=doc.MediaBox.Left;
双b=doc.MediaBox.Bottom;
DOC变换旋转(90,l,b);
阶变换平移(w,0);
//旋转我们的矩形
doc.Rect.Width=h;
DOC.Rect.Height=w;
}
theDoc.HtmlOptions.Engine=EngineType.Gecko;
theDoc.HtmlOptions.Timeout=60000;
theDoc.HtmlOptions.UseScript=true;
theDoc.HtmlOptions.OnLoadScript=“(函数(){window.ABCpdf_go=false;设置超时(函数(){window.ABCpdf_go=true;},1000);}();”;
var url=Uri.UnescapeDataString(pdfUrl.ToString());
如果(cookies.Count>0)
{
//发送原始请求中的cookie副本
var additionalHeaderString=“Cookie:”;
foreach(cookies.allkey中的var键)
{
如果(!cookies.AllKeys[0].Equals(key))//不是cookie集合中的第一个元素
{
附加标题字符串+=“;”;
}
AdditionalHeaderString+=key+“=”+cookies[key]。值;
}
AdditionalHeaderString+=“\r\n”;
theDoc.HtmlOptions.HttpAdditionalHeaders=additionalHeadersString;
theDoc.HtmlOptions.NoCookie=true;
theDoc.HtmlOptions.HostWebBrowser=false;
}
//发送请求
var pageRef=doc.AddImageUrl(url,true,1200,false);
while(doc.chaineable(pageRef))
{
theDoc.Page=theDoc.AddPage();
pageRef=Doc.AddImageToChain(pageRef);
}

对于(var i=1;i,这里给出了解决方案及其不起作用的原因:

为什么不起作用?

当使用Gecko作为渲染引擎时,AbcPdf不支持doc.HtmlOptions.httpAdditionalHeader

在周围工作

在给定URL的情况下生成PDF的操作:

public class PdfController : Controller
{
    private readonly IPdfGenerator _pdfGenerator;

    public PdfController(IPdfGenerator pdfGenerator)
    {
        if (pdfGenerator == null)
            throw new ArgumentNullException();
        this._pdfGenerator = pdfGenerator;
    }

    public FileStreamResult Index(string url)
    {
        Response.AppendHeader("Content-Disposition", "attachment;filename=Download.Pdf");
        this._pdfGenerator.SetCookies(Request.Cookies);
        return new FileStreamResult(_pdfGenerator.HtmlToPdf(url.Uri, false, 1200), "application/pdf");
    }
}
PDF生成类:

    public class AbcPdfGenerator : IPdfGenerator
    {
        private static HttpCookieCollection _cookies = new HttpCookieCollection();

        public void SetCookies(HttpCookieCollection cookies)
        {
            lock (_cookies)
            {
                _cookies = cookies;
                System.Threading.Thread.MemoryBarrier();
            }
        }

        public HttpCookieCollection GetCookies()
        {
            return _cookies;
        }

        public MemoryStream HtmlToPdf(Uri pdfUrl, bool landscape, int screenResolutionWidth, bool enableCache)
        {
            var pdfStream = new MemoryStream();
            var theDoc = new Doc();
            if (landscape)
            {
                // apply a rotation transform
                double w = theDoc.MediaBox.Width;
                double h = theDoc.MediaBox.Height;
                double l = theDoc.MediaBox.Left;
                double b = theDoc.MediaBox.Bottom;
                theDoc.Transform.Rotate(90, l, b);
                theDoc.Transform.Translate(w, 0);
                // rotate our rectangle
                theDoc.Rect.Width = h;
                theDoc.Rect.Height = w;
            }
            theDoc.HtmlOptions.Engine = EngineType.Gecko;
            theDoc.HtmlOptions.Timeout = 60000;
            theDoc.HtmlOptions.UseScript = true;
            theDoc.HtmlOptions.OnLoadScript = "(function(){window.ABCpdf_go = false; setTimeout(function(){window.ABCpdf_go = true;}, 3000);})();";
            var url = Uri.UnescapeDataString(pdfUrl.ToString());

            var pageRef = theDoc.AddImageUrl(url, true, screenResolutionWidth, enableCache);
            while (theDoc.Chainable(pageRef))
            {
                theDoc.Page = theDoc.AddPage();
                pageRef = theDoc.AddImageToChain(pageRef);
            }
            for (var i = 1; i <= theDoc.PageCount; i++)
            {
                theDoc.PageNumber = i;
                theDoc.Flatten();
            }

            theDoc.Save(pdfStream);
            theDoc.Clear();
            var byteInfo = pdfStream.ToArray();
            pdfStream.Write(byteInfo, 0, byteInfo.Length);
            pdfStream.Position = 0;
            return pdfStream;
        }

        /// <summary>
        /// Will install the pdf software license on the server, this should be called on a Application_Start()
        /// </summary>
        public void InitializeService()
        {
            XSettings.InstallLicense(System.Configuration.ConfigurationManager.AppSettings["PdfGeneratorLicenseKey"]);
            //XSettings.InstallTrialLicense(System.Configuration.ConfigurationManager.AppSettings["PdfGeneratorLicenseKey"]);
        }
    }
之前使用的操作筛选器:

public class RequireCookiesForPdf : ActionFilterAttribute
{
    private readonly IPdfGenerator _pdfGenerator;

    public RequireCookiesForPdf()
    {
        //"Bastard injection" :( as action filters don't allow constructor injection
        this._pdfGenerator = DependencyResolver.Current.GetService<IPdfGenerator>();
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var cookies = this._pdfGenerator.GetCookies();
        if (cookies != null)
        {
            foreach (var key in cookies.AllKeys)
            {
                var httpCookie = cookies[key];
                if (httpCookie != null) filterContext.HttpContext.Response.Cookies.Set(new HttpCookie(key, httpCookie.Value));
            }
            this._pdfGenerator.SetCookies(new HttpCookieCollection());
        }
        base.OnActionExecuting(filterContext);
    }
}
公共类要求PDF:ActionFilterAttribute
{
专用只读IPdfGenerator\u PDFGGenerator;
公共要求PDF()的规定
{
//“私生子注入”:(因为动作过滤器不允许构造函数注入
这是.pdfGenerator=DependencyResolver.Current.GetService();
}
公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
var cookies=此项。pdfGenerator.GetCookies();
如果(cookies!=null)
{
foreach(cookies.allkey中的var键)
{
var httpCookie=cookies[key];
if(httpCookie!=null)filterContext.HttpContext.Response.Cookies.Set(新的httpCookie(key,httpCookie.Value));
}
此.u pdfGenerator.SetCookies(新的HttpCookieCollection());
}
base.OnActionExecuting(filterContext);
}
}
AbcPdf不支持
doc.HtmlOptions.HttpAdditionalHeaders
当 使用Gecko作为渲染引擎

在Gecko下,仅当您使用屏幕媒体或使用POST
RequestMethod
时,才会发送这些标题。例如:

theDoc.HtmlOptions.Media = MediaType.Screen;
问候!

关于“为什么它不起作用”这一部分并非严格正确。本页声明,Gecko下的
仅当您使用屏幕媒体或使用POST RequestMethod时,才会发送这些标题。更新:Oops刚刚看到cocacho已经说过这一点(见下文)
public class RequireCookiesForPdf : ActionFilterAttribute
{
    private readonly IPdfGenerator _pdfGenerator;

    public RequireCookiesForPdf()
    {
        //"Bastard injection" :( as action filters don't allow constructor injection
        this._pdfGenerator = DependencyResolver.Current.GetService<IPdfGenerator>();
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var cookies = this._pdfGenerator.GetCookies();
        if (cookies != null)
        {
            foreach (var key in cookies.AllKeys)
            {
                var httpCookie = cookies[key];
                if (httpCookie != null) filterContext.HttpContext.Response.Cookies.Set(new HttpCookie(key, httpCookie.Value));
            }
            this._pdfGenerator.SetCookies(new HttpCookieCollection());
        }
        base.OnActionExecuting(filterContext);
    }
}
theDoc.HtmlOptions.Media = MediaType.Screen;