【问题标题】:Convert Image into Pdf using itextsharp in c#在 c# 中使用 itextsharp 将图像转换为 Pdf
【发布时间】:2016-04-24 11:46:49
【问题描述】:

我想使用 itextsharp 将包含图像和 gridview 的页面转换为 pdf 格式。下面是我的代码

  string attachment = "attachment; filename=Report.pdf";
        Response.ClearContent();
        Response.AddHeader("content-disposition", attachment);
        Response.ContentType = "application/pdf";
        StringWriter stw = new StringWriter();
        HtmlTextWriter htextw = new HtmlTextWriter(stw);
        divText.RenderControl(htextw);   //image is place inside 
        GridView1.RenderControl(htextw);           
        Document document = new Document();
        PdfWriter.GetInstance(document, Response.OutputStream);
        document.Open();
        StringReader str = new StringReader(stw.ToString());
        HTMLWorker htmlworker = new HTMLWorker(document);
        htmlworker.Parse(str);
        document.Close();
        Response.Write(document);
        Response.End();

我设法将 gridview 转换为 pdf,但无法转换图像。图像放置在 div 调用 divText 内。有谁可以帮助我吗?

【问题讨论】:

  • 图片是如何引用的? Base64 网址?相对网址?绝对网址?
  • 不相关但删除Response.Write(document); 行,它在Document 对象上调用ToString(),它不会覆盖默认值,因此您实际上是将文本iTextSharp.text.Document 写入每个末尾文件并最终以损坏的 PDF 告终。
  • 回到问题,我们需要查看stw.ToString() 的缩写版本,因为HTMLWorker 仅适用于HTML,不适用于GridViews,这才是最重要的。

标签: c# pdf itextsharp


【解决方案1】:

我建议尝试以下代码并根据您的修改

public static void ConvertImageToPdf(string srcFilename, string dstFilename)
    {
        iTextSharp.text.Rectangle pageSize = null;

        using (var srcImage = new Bitmap(srcFilename))
        {
            pageSize = new iTextSharp.text.Rectangle(0, 0, srcImage.Width, srcImage.Height);
        }
        using (var ms = new MemoryStream())
        {
            var document = new iTextSharp.text.Document(pageSize, 0, 0, 0, 0);
            iTextSharp.text.pdf.PdfWriter.GetInstance(document, ms).SetFullCompression();
            document.Open();
            var image = iTextSharp.text.Image.GetInstance(srcFilename);
            document.Add(image);
            document.Close();

            File.WriteAllBytes(dstFilename, ms.ToArray());
        }
    }

另请参阅Question

上面代码的解释click here

working with images itextsharp

【讨论】:

    【解决方案2】:

    更改图片 URL 路径,如“C:\images\Filename.jpg”

    【讨论】:

      【解决方案3】:

      您的代码示例看起来不错,但是它缺少IImageProvider 的实现。默认情况下,HTMLWorker 可以仅处理带有绝对 URL 的图像。因此,这里有一个简单的实现来帮助您入门:

      // handle <img> tags in any System.Web.UI.Control (GridView) with:
      // 1. base64 Data URI scheme - https://en.wikipedia.org/wiki/Data_URI_scheme
      // 2. relative URLs on local server
      // 3. absolute URLs on a remote/local server (DEFAULT)
      public class ImageHander : IImageProvider
      {
          public string BaseUri { get; set; }
          public static Regex Base64 = new Regex(
              @"^data:image/(?<mediaType>[^;]+);base64,(?<data>.*)",
              RegexOptions.Compiled
          );
      
          // alias: using iTextImage = iTextSharp.text.Image;
          public iTextImage GetImage(string src,
              IDictionary<string, string> attrs,
              ChainedProperties chain,
              IDocListener doc)
          {
              Match match;
              // [1]
              if ((match = Base64.Match(src)).Length > 0)
              {
                  return iTextImage.GetInstance(
                      Convert.FromBase64String(match.Groups["data"].Value)
                  );
              }
      
              // [2]
              if (!src.StartsWith("http", StringComparison.OrdinalIgnoreCase))
              {
                  src = HttpContext.Current.Server.MapPath(
                      new Uri(new Uri(BaseUri), src).AbsolutePath
                  ); 
              }
              return iTextImage.GetInstance(src);
          }
      }
      

      然后你像这样在后面的代码中使用实现(按钮事件处理程序):

      protected void ProcessHtml(object sender, CommandEventArgs e)
      {
          Response.ContentType = "application/pdf";
          Response.AppendHeader("Content-Disposition", "attachment; filename=table.pdf");
          using (Document document = new Document())
          {
              PdfWriter.GetInstance(document, Response.OutputStream);
              document.Open();
      
              var html = new StringBuilder();
              using (var stringWriter = new StringWriter(html))
              {
                  using (var htmlWriter = new HtmlTextWriter(stringWriter))
                  {
                      // replace 'ConvertControlToPdf' with **YOUR** GridView control Id!
                      ConvertControlToPdf.RenderControl(htmlWriter);
                  }
              }
      
              var providers = new Dictionary<string, Object>();
              // HTMLWorker does **NOT** understand relative URLs, so
              // make existing ones in HTML source absolute, and handle 
              // base64 Data URI schemes
              var ih = new ImageHander() { BaseUri = Request.Url.ToString() };
      
              // dictionary key 'img_provider' is **HARD-CODED**, in 
              // iTextSharp 5.0.0 - 5.0.5, so you may need to use next line
              // providers.Add("img_provider", ih);
              providers.Add(HTMLWorker.IMG_PROVIDER, ih);
              //            ^^^^^^^^^^^^^^^^^^^^^^^ - constant added in 5.0.6
              using (var sr = new StringReader(html.ToString()))
              {
                  foreach (IElement element in HTMLWorker.ParseToList(
                      sr, null, providers))
                  {
                      PdfPTable table = element as PdfPTable;
                      document.Add(element);
                  }
              }
          }
          Response.End();
      }
      

      不确定您运行的是哪个版本的 iTextSharp,因此请记下有关上述 HTMLWorker.IMG_PROVIDER const 的内联 cmets。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 2013-12-27
        • 2022-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-11
        相关资源
        最近更新 更多