Click here to Skip to main content
15,896,549 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
Hello All ,

Generate PDF using HTML string with page break is not proper working ... Below is my Code and Output

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="wkhtmltopdfTest._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />



<asp:Button ID="Button1" runat="server" Text="Download" OnClick="btnExport_Click" />

<asp:Panel ID="pnlPerson" runat="server">





























First Page
Second Page
Third Page
Fourth Page
Five Page










Default.cs.aspx

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

namespace wkhtmltopdfTest
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnExport_Click(object sender, EventArgs e)
{
try
{
string PrintStyle = System.IO.File.ReadAllText(Server.MapPath("/PrintStyle.css"));

StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);

pnlPerson.RenderControl(hw);
StringReader sr = new StringReader(sw.ToString());



string outXml = " " +
"<style type=\"text/css\"> " + PrintStyle + " " +
"
" + sw.ToString() + " " +
"
";
//table, tr, td, th, tbody, thead, tfoot { page-break-inside: avoid !important;}
//tr{display:block;}

byte[] result = ConvertHtmlToPdf(outXml);


HttpContext.Current.Response.Clear();
Response.ContentType = "application/pdf";
string outputFilename = "Report" + "_" + DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss-fff") + ".pdf";
Response.AddHeader("content-disposition", "attachment;filename=" + outputFilename);
Response.CacheControl = "No-cache";
MemoryStream ms = new MemoryStream(result);
ms.WriteTo(Response.OutputStream);
Response.Flush();
Response.SuppressContent = true;
HttpContext.Current.ApplicationInstance.CompleteRequest();

}
catch(Exception ex)
{
}
}
protected byte[] ConvertHtmlToPdf(string html)
{
System.Reflection.Assembly ass = System.Reflection.Assembly.GetExecutingAssembly();
string conPath = System.IO.Path.GetDirectoryName(ass.CodeBase);
Uri uri = new Uri(conPath);
conPath = uri.AbsolutePath.Replace("%20", " ").Replace("25", "");
conPath = Path.GetFullPath(Path.Combine(conPath, @"..\"));
conPath = conPath + "bin\\wkhtmltopdf.exe";
var p = new Process
{
StartInfo =
{
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
RedirectStandardInput = true,
UseShellExecute = false,
FileName = conPath
}
};
string s = "-q ";
s += "--margin-bottom 0 ";
s += "--margin-right 0 ";
s += "--margin-left 0 ";
s += "--margin-top 0 ";
s += "--page-size A4 ";
s += "--print-media-type ";
s += "--disable-smart-shrinking ";
s += "- -";
p.StartInfo.Arguments = s;
p.Start();
StreamWriter myStreamWriter = new StreamWriter(p.StandardInput.BaseStream, Encoding.UTF8);
myStreamWriter.Write(html);
myStreamWriter.Close();
var buffer = new byte[32768];
byte[] file;
using (var ms = new MemoryStream())
{
while (true)
{
var read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length);
if (read <= 0)
{
break;
}
ms.Write(buffer, 0, read);
}
file = ms.ToArray();
}
p.WaitForExit(60000);
var returnCode = p.ExitCode;
p.Close();
return returnCode == 0 ? file : null;
}
}
}


PrintStyle.css

@media print
{
tr.page-break {display: block;page-break-after: always; }
}

What I have tried:

I have run the Above code but i am able to get proper report with page break .
Posted
Updated 7-Apr-17 3:12am

1 solution

Explicit page break (with CSS 'page-break-after' rule) inside tables (tr tag in your case) is not supported by wkhtmltopdf.

As alternative you can split your table to several tables and force page break between them with
HTML
<div style='page-break-after:always;'></div>
 
Share this answer
 
Comments
Darshan E Ksheerasagar 10-Apr-17 2:02am    
Thank You Sir

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900