2012-02-26 9 views
3

htmlが画像リンク付きデータベースに保存されるプロセスがあります。画像もDBに保存されます。私はデータベースから画像を読み込むコントローラーアクションを作成しました。私が生成しているパスは/File/Image?path=Root/test.jpgのようなものです。 はこのイメージパスはこのコードは、私に不正な文字を与え、私は、データベースからHTMLを読み込み、PDF文書データベースからの画像でitextsharpを使ってpdfを作成する

string _html = GenerateDocumentHelpers.CommissioningSheet(fleetId); 
string _html = GenerateDocumentHelpers.CommissioningSheet(fleetId); 
Document _document = new Document(PageSize.A4, 80, 50, 30, 65); 
MemoryStream _memStream = new MemoryStream(); 
PdfWriter _writer = PdfWriter.GetInstance(_document, _memStream); 
StringReader _reader = new StringReader(_html);    
HTMLWorker _worker = new HTMLWorker(_document); 
_document.Open();    
_worker.Parse(_reader); 
_document.Close(); 
Response.Clear(); 
Response.AddHeader("content-disposition", "attachment; filename=Commissioning.pdf"); 
Response.ContentType = "application/pdf"; 
Response.Buffer = true; 
Response.OutputStream.Write(_memStream.GetBuffer(), 0, _memStream.GetBuffer().Length); 
Response.OutputStream.Flush(); 
Response.End(); 
return new FileStreamResult(Response.OutputStream, "application/pdf"); 

を作成するためにitextsharpを使用しようとしている<img alt="logo" src="/File/Image?path=Root/001.jpg" />

のようなimgタグでHTMLに埋め込まれていますエラー。これはイメージタグから来て、認識していませんか?と=文字は、私はimgタグでこのHTMLをレンダリングする方法があるので、私はそれがデータベースからHTMLとイメージをレンダリングし、pdfを作成するか、またはitextsharpがそれを行うことができない場合は、このタスクを達成できる他のサードパーティのオープンソースツールですか?

答えて

4

イメージソースがプロトコルを含む完全修飾URLでない場合、iTextSharpはファイルベースのURLであるとみなします。解決策は、すべての画像リンクを絶対形式に変換することです。形式はhttp://YOUR_DOMAIN/File/Image?path=Root/001.jpgです。

ます。また、HTML <BASE>タグと同じほとんど機能し、パーサーにグローバルプロパティを設定することができ

:以下

//Create a provider collection to set various processing properties 
System.Collections.Generic.Dictionary<string, object> providers = new System.Collections.Generic.Dictionary<string, object>(); 
//Set the image base. This will be prepended to the SRC so watch your forward slashes 
providers.Add(HTMLWorker.IMG_BASEURL, "http://YOUR_DOMAIN"); 
//Bind the providers to the worker 
worker.SetProviders(providers); 
worker.Parse(reader); 

を示しiTextSharp 5.1.2.0をターゲットに完全に動作するC#の2010年のWinFormsアプリです相対的なイメージを使用して、グローバルプロバイダを使用してそのベースを設定します。私はusing文の束を使って適切なクリーンアップを保証しますが、すべてはあなたのコードとほとんど同じです。先頭と末尾のスラッシュをすべて確認してください。ベースURLは直接SRC属性の先頭に追加され、正しく行われていない場合はダブルスラッシュで終わることがあります。私はここでドメインを固めていますが、簡単にSystem.Web.HttpContext.Current.Requestオブジェクトを使用できるはずです。

using System; 
using System.IO; 
using System.Windows.Forms; 
using iTextSharp.text; 
using iTextSharp.text.html.simpleparser; 
using iTextSharp.text.pdf; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

      string html = @"<img src=""/images/home_mississippi.jpg"" />"; 
      string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "HtmlTest.pdf"); 
      using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) { 
       using (Document doc = new Document(PageSize.TABLOID)) { 
        using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) { 
         doc.Open(); 

         using (StringReader reader = new StringReader(html)) { 
          using (HTMLWorker worker = new HTMLWorker(doc)) { 
           //Create a provider collection to set various processing properties 
           System.Collections.Generic.Dictionary<string, object> providers = new System.Collections.Generic.Dictionary<string, object>(); 
           //Set the image base. This will be prepended to the SRC so watch your forward slashes 
           providers.Add(HTMLWorker.IMG_BASEURL, "http://www.vendiadvertising.com"); 
           //Bind the providers to the worker 
           worker.SetProviders(providers); 
           worker.Parse(reader); 
          } 
         } 

         doc.Close(); 
        } 
       } 
      } 

      this.Close(); 
     } 
    } 
} 
+0

ありがとう、魅力的な作品です! – user1230089

+0

@Chris、あなたのコードは "using"の内部にあるので、本当にdoc.Close()が必要ですか? – Alexandre

+1

あなたは正しいです、私はお互いのバランスをとるように私のコマンドが好きです。明示的にopenを使用すると、明示的にcloseを使用するのが好きです。個人の好み。 –

関連する問題