问题
I know this tool looks up on a url and converts the repsponse to pdf. How do I convert a
<html> content.. </html>
into a pdf?
I was looking at the help files on wkhtml2pdf and looks like it provides an option of stdin but I can't really figure out how to emulate stdin.
Also if you know a tool which does a better job, please suggest me some.
Thanks a lot!
回答1:
wkhtmltopdf is a free tool, but it's not written in .NET and it could be kind of hard to integrate into your asp.net application.
you can take a look at iTextSharp, which is free, but cannot handle any kind of html, or you can take a look at commercial tools to convert html to pdf, like ExpertPDF or ABCpdf, that can handle any html/css.
回答2:
I just started a new project to provide a C# P/Invoke wrapper around wkhtmltopdf.
You can checkout my code at: https://github.com/pruiz/WkHtmlToXSharp
Greets.
回答3:
Take a look at Pechkin
.NET Wrapper for WkHtmlToPdf DLL, library that uses Webkit engine to convert HTML pages to PDF.
Nuget packages:
Pechkin.Synchronized
Pechkin
Example code:
private void ConvertToPdf()
{
var loadPath = Server.MapPath("~/HtmlTemplates");
var loadFile = Path.Combine(loadPath, "Test.html");
var savePath = Server.MapPath("~/Pdf");
var saveFile = Path.Combine(savePath, DateTime.Now.ToString("HH-mm-ss.fff") + ".pdf");
var globalConfig = new GlobalConfig()
.SetMargins(0, 0, 0, 0)
.SetPaperSize(PaperKind.A4);
var pdfWriter = new SynchronizedPechkin(globalConfig);
pdfWriter.Error += OnError;
pdfWriter.Warning += OnWarning;
var objectConfig = new ObjectConfig()
.SetPrintBackground(true)
.SetIntelligentShrinking(false);
var pdfBuffer = pdfWriter.Convert(objectConfig, File.ReadAllText(loadFile));
File.WriteAllBytes(saveFile, pdfBuffer);
}
private void OnWarning(SimplePechkin converter, string warningtext)
{
throw new NotImplementedException();
}
private void OnError(SimplePechkin converter, string errortext)
{
throw new NotImplementedException();
}
回答4:
I found a way. You can set up another to output the normal html. And use that url as the input value of wkhtml2pdf process.
----------Edit
public byte[] WKHtmlToPdf(string url_input)
{
try
{
var fileName = " - ";
var wkhtmlDir = ConfigurationSettings.AppSettings["wkhtmlDir"];
var wkhtml = ConfigurationSettings.AppSettings["wkhtml"];
var p = new Process();
string url = Request.Url.GetLeftPart(UriPartial.Authority) + @"/application/" + url_input;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = wkhtml;
p.StartInfo.WorkingDirectory = wkhtmlDir;
string switches = "";
switches += "--print-media-type ";
switches += "--margin-top 10mm --margin-bottom 10mm --margin-right 10mm --margin-left 10mm ";
switches += "--page-size Letter ";
p.StartInfo.Arguments = switches + " " + url + " " + fileName;
p.Start();
//read output
byte[] buffer = new byte[32768];
byte[] file;
using (var ms = new MemoryStream())
{
while (true)
{
int read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length);
if (read <= 0)
{
break;
}
ms.Write(buffer, 0, read);
}
file = ms.ToArray();
}
// wait or exit
p.WaitForExit(60000);
// read the exit code, close process
int returnCode = p.ExitCode;
p.Close();
return returnCode == 0 ? file : null;
}
catch (Exception ex)
{
// set your exceptions here
return null;
}
}
----------web.config key example
<add key="wkhtmlDir" value="C:\Program Files (x86)\wkhtmltopdf\bin"/>
<add key="wkhtml" value="C:\Program Files (x86)\wkhtmltopdf\bin\wkhtmltopdf.exe"/>
The basic idea is passing url to the exe as an argument.
HTH !
回答5:
if you want to print specific part of html with Css
install Nuget packages:
Pechkin.Synchronized
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
pnlprint.RenderControl(hw);
StringReader sr = new StringReader(sw.ToString());
string cssPath = Server.MapPath("~/css/style1.css");
string cssString = File.ReadAllText(cssPath);
cssPath = Server.MapPath("~/css/bootstrap.css");
string cssString2 = File.ReadAllText(cssPath);
cssString += cssString2;
GlobalConfig gc = new GlobalConfig();
byte[] pdfContent = new SimplePechkin(new GlobalConfig()).Convert(@"<html><head><style>" + cssString + "</style></head><body>" + sw.ToString() + "</body></html>");
here you can easily understand the working of wkhtmltopdf https://ourcodeworld.com/articles/read/366/how-to-generate-a-pdf-from-html-using-wkhtmltopdf-with-c-in-winforms
来源:https://stackoverflow.com/questions/3957268/wkhtmltopdf-convert-html-code-to-pdf-directly-in-c-sharp