0

画像ハンドラーを使用して相対パスを絶対パスに変換します。

    protected byte[] ConvertHTMLToPDF(string HTMLCode)
    {
        if (Request.Url == null)
            throw new Exception();

        var doc = new Document(PageSize.A4);
        doc.Open();

        var interfaceProps = new Hashtable();
        var ih = new ImageHander {BaseUri = Request.Url.ToString()};

        interfaceProps.Add("img_provider", ih);

        foreach (IElement element in HTMLWorker.ParseToList(new StringReader(HTMLCode), null, interfaceProps))
        {
            doc.Add(element);
        }

        var _xmlr = new XmlTextReader(new StringReader(HTMLCode));
        HtmlParser.Parse(doc, _xmlr);

        var stream = new MemoryStream();
        PdfWriter.GetInstance(doc, stream);

        doc.Close();
        return stream.ToArray();
    }

クラス:

public class ImageHander : IImageProvider
{
    public string BaseUri;

    public Image GetImage(string src, Hashtable h, ChainedProperties cprops, IDocListener doc)
    {
        string imgPath;

        if (src.ToLower().Contains("http://") == false)
            imgPath = HttpContext.Current.Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + src;
        else
            imgPath = src;

        return Image.GetInstance(imgPath);
    }
}

末尾の imgPath は正しいです。ただし、静的ファイルではなく、画像を返すアクションの url であるため、画像を要求するときに Cookie を渡す必要があります。出来ますか?

4

1 に答える 1

1

Image.GetInstanceはい、可能ですが、メソッドに依存するのではなく、自分でリクエストを送信する必要があります。たとえば、 を使用しHttpClientて、リクエストとともに Cookie を送信できます。

var imageUrl = new Uri(imagePath);
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler))
{
    cookieContainer.Add(
        new Uri(imageUrl.GetLeftPart(UriPartial.Authority)), 
        new Cookie("CookieName", "cookie_value")
    );
    var response = client.GetAsync(imageUrl).Result;
    response.EnsureSuccessStatusCode();
    Stream imageStream = response.Content.ReadAsStreamAsync().Result;

    // You've got the Stream here, read the documentation of iTextSharp 
    // how to create an Image instance from a Stream:
    return Image.FromStream(imageStream); // ?????

    // or maybe there's a method allowing you to create an Image from byte[]
    byte[] imageData = new byte[imageStream.Length];
    imageStream.Read(imageData, 0, imageData.Length);
    return Image.FromByteArray(imageData); // ?????
}
于 2013-07-03T08:31:15.317 に答える