0

iTextSharp を使用して生成された html ページを pdf に変換すると、asp:DataGrid から作成されたテーブルを PDF に表示できません。データグリッドのページの HTML 出力は次のようになります。

<p>Purchases:</p>
    <table rules="all" id="dg_Purchase" style="font-size: smaller; border-collapse: collapse;" border="1" cellspacing="0">
    <tbody><tr>
        <td>Lot #</td>
        <td>&nbsp;</td>
        <td>Title</td>
        <td align="right">Price</td>
        <td align="right">Buyer's Premium</td>
        <td align="right">Tax</td>
        <td align="right">Sub Total</td>
    </tr><tr>
        <td>118</td>
        <td><input id="dg_Purchase_ctl02_CheckBox1" name="dg_Purchase$ctl02$CheckBox1" type="checkbox"></td>
        <td>Yih-Wen Kuo (1959, Taiwan)</td>
        <td align="right">$1,900.00</td>
        <td align="right">$332.50</td>
        <td align="right">$0.00</td>
        <td align="right">$2,232.50</td>
    </tr><tr>
        <td>119</td>
        <td><input id="dg_Purchase_ctl03_CheckBox1" name="dg_Purchase$ctl03$CheckBox1" type="checkbox"></td>
        <td>Yih-Wen Kuo (1959, Taiwan)</td>
        <td align="right">$1,800.00</td>
        <td align="right">$315.00</td>
        <td align="right">$0.00</td>
        <td align="right">$2,115.00</td>
    </tr>
</tbody></table>

<p>Payments:</p>
    <table rules="all" id="dg_Payment" style="font-size: smaller; border-collapse: collapse;" border="1" cellspacing="0">
    <tbody><tr>
        <td style="width: 120px;">Payment Method</td>
        <td>Date</td>
        <td align="right">Amount&nbsp;&nbsp;</td>
    </tr><tr>
        <td>Total</td>
        <td>&nbsp;</td>
        <td align="right">$0.00</td>
    </tr>
</tbody></table>

HTML ページを表示すると、表は本来あるべき姿に正確に見えます。しかし、PDF を生成すると、テーブル (または、テーブル内のすべて) が表示されません。境界線のみが表示され、各テーブルのほとんどが 2 ピクセルの直線です。

したがって、私の通常のスクリプトでは、ページ全体が読み込まれた後、最後に行うことは次のとおりです。

    StringWriter stringWriter = new StringWriter();
    HtmlTextWriter writer = new HtmlTextWriter(stringWriter);
    Render(writer);

iTextSharp の関数は次のとおりです。

protected override void Render(HtmlTextWriter writer)
{
    MemoryStream mem = new MemoryStream();
    StreamWriter twr = new StreamWriter(mem);
    HtmlTextWriter myWriter = new HtmlTextWriter(twr);
    base.Render(myWriter);
    myWriter.Flush();
    myWriter.Dispose();
    StreamReader strmRdr = new StreamReader(mem);
    strmRdr.BaseStream.Position = 0;
    string pageContent = strmRdr.ReadToEnd();
    strmRdr.Dispose();
    mem.Dispose();
    writer.Write(pageContent);
    CreatePDFDocument(pageContent);
}

public void CreatePDFDocument(string strHtml)
{

    string strFileName = HttpContext.Current.Server.MapPath("test.pdf");
    // step 1: creation of a document-object
    Document document = new Document();
    // step 2:
    // we create a writer that listens to the document
    PdfWriter.GetInstance(document, new FileStream(strFileName, FileMode.Create));
    StringReader se = new StringReader(strHtml);
    HTMLWorker obj = new HTMLWorker(document);
    document.Open();
    obj.Parse(se);
    document.Close();
    ShowPdf(strFileName);
}

public void ShowPdf(string strFileName)
{
    Response.ClearContent();
    Response.ClearHeaders();
    Response.AddHeader("Content-Disposition", "inline;filename=" + strFileName);
    Response.ContentType = "application/pdf";
    Response.WriteFile(strFileName);
    Response.Flush();
    Response.Clear();
}

繰り返しますが、プログラムで設定されたページ上のすべてのものは、データグリッドを除いて PDF に表示されます。国境を越えて、それはwidth問題ではないようです。空っぽに見えるだけです。どんな助けでも大歓迎です。

4

1 に答える 1

0

なぜこれがうまくいかないのかについての韻や理由を見つけることができなかったので、別のルートに行きました。HTML コードを生成するページをセカンダリ ページにし、PDF を生成するページはそれを参照するだけにすることにしました。私は結局:

String address = "http://address.com/admin/Invoice2.aspx?sale_id=" + sale_id + "&bidder_number=" + bidder_number;

using (WebClient wc = new WebClient())
{
    string content = wc.DownloadString(address);
    CreatePDFDocument(content);
}

私のページロードメソッドで、他の2つの機能を保持しました:

public void CreatePDFDocument(string strHtml)
{

    string strFileName = HttpContext.Current.Server.MapPath("invoice.pdf");
    // step 1: creation of a document-object
    Document document = new Document();
    // step 2:
    // we create a writer that listens to the document
    PdfWriter.GetInstance(document, new FileStream(strFileName, FileMode.Create));
    StringReader se = new StringReader(strHtml);
    HTMLWorker obj = new HTMLWorker(document);
    document.Open();
    obj.Parse(se);
    document.Close();
    ShowPdf(strFileName);
}

public void ShowPdf(string strFileName)
{
    Response.ClearContent();
    Response.ClearHeaders();
    Response.AddHeader("Content-Disposition", "inline;filename=" + strFileName);
    Response.ContentType = "application/pdf";
    Response.WriteFile(strFileName);
    Response.Flush();
    Response.Clear();
}

ここで、テーブルのスタイルを取得して PDF に転送するだけで十分です。しかし、それは別の問題です。

于 2012-06-12T12:58:07.920 に答える