我想通过将HTML内容传递给函数来生成PDF。我已经为此使用了iTextSharp,但遇到表格并且布局变得混乱时效果不佳。
有更好的方法吗?
答案 0 :(得分:180)
试试wkhtmtopdf。这是迄今为止我找到的最好的工具。
对于.NET,您可以使用此small library轻松调用wkhtmtopdf命令行实用程序。
答案 1 :(得分:171)
编辑:新建议 HTML Renderer for PDF using PdfSharp
(尝试wkhtmltopdf并建议避免使用之后)
HtmlRenderer.PdfSharp是 100%完全C#托管代码,易于使用,线程安全,最重要的是免费 ( New BSD License)解决方案。
用法
使用示例方法。
public static Byte[] PdfSharpConvert(String html)
{
Byte[] res = null;
using (MemoryStream ms = new MemoryStream())
{
var pdf = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf(html, PdfSharp.PageSize.A4);
pdf.Save(ms);
res = ms.ToArray();
}
return res;
}
非常好的替代 Free Version iTextSharp
直到版本4.1.6 iTextSharp根据LGPL许可证获得许可,版本直到4.16(或者也可能有叉子)作为包提供,可以自由使用。当然有人可以使用续5 + paid version。
我尝试将 wkhtmltopdf 解决方案整合到我的项目中并遇到了一些障碍。
出于以下原因,我个人会避免在托管企业应用程序中使用 wkhtmltopdf - 解决方案。
--- PRE编辑部分---
对于想要在更简单的应用程序/环境中从html生成pdf的任何人,我将旧帖子作为建议。
https://www.nuget.org/packages/TuesPechkin/
或特别针对 MVC Web应用程序 (但我认为您可以在任何.net应用程序中使用它)
https://www.nuget.org/packages/Rotativa/
他们都利用了 用于将html转换为pdf的wkhtmtopdf二进制文件。它使用webkit引擎呈现页面,因此它也可以解析 css样式表。
它们提供易于使用的与C#的无缝集成。
Rotativa还可以从任何 Razor 视图直接生成PDF。
此外,对于真实世界的Web应用程序,他们还管理线程安全等...
答案 2 :(得分:29)
大多数HTML到PDF转换器都依赖于IE来进行HTML解析和渲染。当用户更新他们的IE时,这可能会中断。 Here是一个不依赖IE的。
代码是这样的:
EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);
与许多其他转换器一样,您可以传递文本,文件名或Url。结果可以保存到文件或流中。
答案 3 :(得分:27)
我最近执行了关于HTML到PDF转换的PoC,并希望分享我的结果。
我最喜欢的是OpenHtmlToPdf
此工具的优点:
其他测试工具:
答案 4 :(得分:20)
我强烈推荐NReco。它有免费和付费版本,非常值得。它在后台使用wkhtmtopdf,但你只需要一个程序集。奇妙。
使用示例:
通过NuGet安装。
var htmlContent = String.Format("<body>Hello world: {0}</body>", DateTime.Now);
var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);
免责声明:我不是开发人员,只是该项目的粉丝:)
答案 5 :(得分:13)
Winnovative提供支持HTML输入的.Net PDF库。他们提供无限free trial。根据您希望部署项目的方式,这可能就足够了。
答案 6 :(得分:10)
最后更新时间:2019年12月
这是我汇总的.NET中HTML到PDF转换的选项列表(有些是免费的,有些是付费的)
GemBox.Document
PDF变形.Net
HtmlRenderer.PdfSharp
PuppeteerSharp
EO.Pdf
WnvHtmlToPdf_x64
IronPdf
Spire.PDF
Aspose.Html
EvoPDF
ExpertPdfHtmlToPdf
Zetpdf
PDFtron
WkHtmlToXSharp
SelectPDF
如果以上选项均无济于事,您可以随时搜索 NuGet软件包 https://www.nuget.org/packages?q=html+pdf
答案 7 :(得分:7)
我使用了ExpertPDF Html To Pdf Converter。做得体。不幸的是,这不是免费的。
答案 8 :(得分:7)
还有一个新的基于网络的文档生成应用程序 - DocRaptor.com。看似易于使用,并且有免费选项。
答案 9 :(得分:7)
您可以从无头模式使用Google Chrome打印到pdf功能。我发现这是最简单但最可靠的方法。
wchar_t
答案 10 :(得分:7)
Essential PDF可用于convert HTML to PDF:C# sample。链接到此处的示例是基于ASP.NET的,但可以从Windows窗体,WPF,ASP.NET Webforms和ASP.NET MVC使用该库。该库提供了使用不同HTML呈现引擎的选项:Internet Explorer(默认)和WebKit(最佳输出)。
如果您符合资格,可通过community license计划免费提供整套控件(商业应用程序)。社区许可是完整的产品,没有任何限制或水印。
注意:我为Syncfusion工作。
答案 11 :(得分:6)
HTML-to-PDF要求有好消息。如this answer showed, W3C标准css-break-3将解决问题 ......这是一项候选建议书,计划在测试后于2017年或2018年转为最终建议书。< / p>
由于不是那么标准,有一些解决方案,带有C#插件,如print-css.rocks所示。
答案 12 :(得分:6)
如果你真的不需要真正的.Net PDF库,那么有很多free HTML to PDF tools,其中很多都可以从命令行运行。
一种解决方案是选择其中一种,然后在C#中编写一个薄包装器。例如,如this tutorial中所做的那样。
答案 13 :(得分:4)
ABCpdf.NET(http://www.websupergoo.com/abcpdf-5.htm)
我们使用并推荐。
非常好的组件,它不仅将网页转换为像图像一样的PDF,而且真正转换文本,图像,格式等......
它不是免费的,但它很便宜。
答案 14 :(得分:4)
下面是使用iTextSharp(iTextSharp + itextsharp.xmlworker)将html + css转换为PDF的示例
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;
byte[] pdf; // result will be here
var cssText = File.ReadAllText(MapPath("~/css/test.css"));
var html = File.ReadAllText(MapPath("~/css/test.html"));
using (var memoryStream = new MemoryStream())
{
var document = new Document(PageSize.A4, 50, 50, 60, 60);
var writer = PdfWriter.GetInstance(document, memoryStream);
document.Open();
using (var cssMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(cssText)))
{
using (var htmlMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(html)))
{
XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, htmlMemoryStream, cssMemoryStream);
}
}
document.Close();
pdf = memoryStream.ToArray();
}
答案 15 :(得分:3)
PDF Vision很好。但是,您必须具有完全信任才能使用它。我已经通过电子邮件询问为什么我的HTML没有在服务器上转换,但它在localhost上工作正常。
答案 16 :(得分:3)
这取决于您的任何其他要求。
一个非常简单但不易部署的解决方案是使用WebBrowser控件加载Html,然后使用Print方法打印到本地安装的PDF打印机。有几种免费的PDF打印机可用,WebBrowser控件是.Net框架的一部分。
编辑: 如果您的Html是XHtml,您可以使用PDFizer来完成这项工作。
答案 17 :(得分:3)
我发现以下库在将html转换为pdf方面更有效 nuget :https://www.nuget.org/packages/Select.HtmlToPdf/
答案 18 :(得分:2)
如果您需要使用pdf格式的完美html渲染,则需要使用商业库。
ExpertPdf Html To Pdf Converter非常易于使用,它支持最新的html5 / css3。您可以将整个网址转换为pdf:
using ExpertPdf.HtmlToPdf;
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromUrl(url);
或html字符串:
using ExpertPdf.HtmlToPdf;
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromHtmlString(html, baseUrl);
您还可以直接将生成的pdf文档保存到磁盘上的文件流中。
答案 19 :(得分:2)
我是Rotativa包的作者。它允许直接从剃刀视图创建PDF文件:
https://www.nuget.org/packages/Rotativa/
使用起来很简单,并且您可以完全控制布局,因为您可以将剃刀视图与来自Model和ViewBag容器的数据一起使用。
我在Azure上开发了一个SaaS版本。它使WebApi或任何.Net应用程序,服务,Azure网站,Azure webjob,无论运行.Net都更容易使用它。
免费帐户。
答案 20 :(得分:2)
我一直在寻找这个。我遇到了HTMLDOC http://www.easysw.com/htmldoc/这是一个免费的开源命令行应用程序,它将HTML文件作为参数并从中吐出PDF。这对我来说非常适合我的项目,但这一切都取决于你真正需要的东西。
制作它的公司销售已编译的二进制文件,但您可以从源代码下载和编译,并免费使用它。我设法编译了一个非常新的版本(版本1.9),我打算在几天内发布它的二进制安装程序,所以如果你感兴趣我可以在发布后立即提供它的链接。
修改(2014年2月25日):似乎将文档和网站移至http://www.msweet.org/projects.php?Z1
答案 21 :(得分:2)
到目前为止,似乎最好的免费 .NET解决方案是TuesPechkin库,它是wkhtmltopdf本机库的包装。
我现在已经使用单线程版本将数千个HTML字符串转换为PDF文件,并且看起来效果很好。它应该也可以在多线程环境(例如IIS)中工作,但我尚未对其进行测试。
此外,由于我想使用 wkhtmltopdf 的最新版本(在撰写本文时为0.12.5),因此我从官方网站下载了DLL,并将其复制到我的项目根目录下,设置了副本输出为true,并像这样初始化库:
var dllDir = AppDomain.CurrentDomain.BaseDirectory;
Converter = new StandardConverter(new PdfToolset(new StaticDeployment(dllDir)));
上面的代码将完全与 “ wkhtmltox.dll”匹配,因此请不要重命名该文件。我使用了DLL的64位版本。
请确保您已阅读多线程环境的说明,因为每个应用程序生命周期只需初始化一次即可,因此您需要将其放在单个实例中。
答案 22 :(得分:2)
大多数项目很可能会包装C / C ++引擎,而不是从头开始实现C#解决方案。尝试项目Gotenberg。
进行测试
docker run --rm -p 3000:3000 thecodingmachine/gotenberg:6
卷曲
curl --request POST \
--url http://localhost:3000/convert/url \
--header 'Content-Type: multipart/form-data' \
--form remoteURL=https://brave.com \
--form marginTop=0 \
--form marginBottom=0 \
--form marginLeft=0 \
--form marginRight=0 \
-o result.pdf
C#sample.cs
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
using static System.Console;
namespace HelloWorld
{
class Program
{
public static async Task Main(string[] args)
{
try
{
var client = new HttpClient();
var formContent = new MultipartFormDataContent
{
{new StringContent("https://duckduckgo.com/"), "remoteURL"},
{new StringContent("0"), "marginTop" }
};
var result = await client.PostAsync(new Uri("http://localhost:3000/convert/url"), formContent);
await File.WriteAllBytesAsync("duckduck.com.pdf", await result.Content.ReadAsByteArrayAsync());
}
catch (Exception ex)
{
WriteLine(ex);
}
}
}
}
要编译
csc sample.cs -langversion:latest -reference:System.Net.Http.dll && mono ./sample.exe
答案 23 :(得分:1)
作为HiQPdf软件的代表,我认为最佳解决方案是HiQPdf HTML to PDF converter for .NET。它包含市场上最先进的HTML5,CSS3,SVG和JavaScript渲染引擎。您还可以使用free version of the HTML to PDF library免费制作最多3个PDF页面。从HTML页面生成PDF作为byte []的最小C#代码是:
HtmlToPdf htmlToPdfConverter = new HtmlToPdf();
// set PDF page size, orientation and margins
htmlToPdfConverter.Document.PageSize = PdfPageSize.A4;
htmlToPdfConverter.Document.PageOrientation = PdfPageOrientation.Portrait;
htmlToPdfConverter.Document.Margins = new PdfMargins(0);
// convert HTML to PDF
byte[] pdfBuffer = htmlToPdfConverter.ConvertUrlToMemory(url);
您可以在HiQPdf HTML to PDF Converter examples repository中找到有关ASP.NET和MVC的更详细示例。
答案 24 :(得分:1)
对于所有在 .net 5
中寻找可行解决方案的人来说,这里是您。
这是我的工作解决方案。
wkhtmltopdf
:wkhtmltopdf
最新版本。public static string HtmlToPdf(string outputFilenamePrefix, string[] urls,
string[] options = null,
string pdfHtmlToPdfExePath = @"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe")
{
string urlsSeparatedBySpaces = string.Empty;
try
{
//Determine inputs
if ((urls == null) || (urls.Length == 0))
throw new Exception("No input URLs provided for HtmlToPdf");
else
urlsSeparatedBySpaces = String.Join(" ", urls); //Concatenate URLs
string outputFilename = outputFilenamePrefix + "_" + DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss-fff") + ".PDF"; // assemble destination PDF file name
var p = new System.Diagnostics.Process()
{
StartInfo =
{
FileName = pdfHtmlToPdfExePath,
Arguments = ((options == null) ? "" : string.Join(" ", options)) + " " + urlsSeparatedBySpaces + " " + outputFilename,
UseShellExecute = false, // needs to be false in order to redirect output
RedirectStandardOutput = true,
RedirectStandardError = true,
RedirectStandardInput = true, // redirect all 3, as it should be all 3 or none
WorkingDirectory = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location))
}
};
p.Start();
// read the output here...
var output = p.StandardOutput.ReadToEnd();
var errorOutput = p.StandardError.ReadToEnd();
// ...then wait n milliseconds for exit (as after exit, it can't read the output)
p.WaitForExit(60000);
// read the exit code, close process
int returnCode = p.ExitCode;
p.Close();
// if 0 or 2, it worked so return path of pdf
if ((returnCode == 0) || (returnCode == 2))
return outputFilename;
else
throw new Exception(errorOutput);
}
catch (Exception exc)
{
throw new Exception("Problem generating PDF from HTML, URLs: " + urlsSeparatedBySpaces + ", outputFilename: " + outputFilenamePrefix, exc);
}
}
HtmlToPdf("test", new string[] { "https://www.google.com" }, new string[] { "-s A5" });
HTML
字符串转换为PDF
,请调整上述方法并将Arguments
替换为Process StartInfo
为$@"/C echo | set /p=""{htmlText}"" | ""{pdfHtmlToPdfExePath}"" {((options == null) ? "" : string.Join(" ", options))} - ""C:\Users\xxxx\Desktop\{outputFilename}""";
这种方法的缺点:
wkhtmltopdf
的最新版本不支持最新的 HTML5
和 CSS3
。因此,如果您尝试将任何 html 导出为 CSS GRID
,那么输出将不会如预期。chrome headless
:var p = new System.Diagnostics.Process()
{
StartInfo =
{
FileName = "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe",
Arguments = @"/C --headless --disable-gpu --run-all-compositor-stages-before-draw --print-to-pdf-no-header --print-to-pdf=""C:/Users/Abdul Rahman/Desktop/test.pdf"" ""C:/Users/Abdul Rahman/Desktop/grid.html""",
}
};
p.Start();
// ...then wait n milliseconds for exit (as after exit, it can't read the output)
p.WaitForExit(60000);
// read the exit code, close process
int returnCode = p.ExitCode;
p.Close();
html
文件转换为 pdf
文件。url
转换为 pdf
,请使用以下作为 Argument
到 Process StartInfo
@"/C --headless --disable-gpu --run-all-compositor-stages-before-draw --print-to-pdf-no-header --print-to-pdf=""C:/Users/Abdul Rahman/Desktop/test.pdf"" ""https://www.google.com""",
这种方法的缺点:
HTML5
和 CSS3
功能按预期工作。输出将与您在浏览器中查看的相同,但通过 IIS 运行时,您需要在 AppliactionPool
标识下运行应用程序的 LocalSystem
,或者您需要提供 read
/{{1} } 访问write
。IISUSRS
:Selenium WebDriver
和 Selenium.WebDriver
。Selenium.WebDriver.ChromeDriver
这种方法的优点:
public async Task<byte[]> ConvertHtmlToPdf(string html)
{
var directory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments), "ApplicationName");
Directory.CreateDirectory(directory);
var filePath = Path.Combine(directory, $"{Guid.NewGuid()}.html");
await File.WriteAllTextAsync(filePath, html);
var driverOptions = new ChromeOptions();
// In headless mode, PDF writing is enabled by default (tested with driver major version 85)
driverOptions.AddArgument("headless");
using var driver = new ChromeDriver(driverOptions);
driver.Navigate().GoToUrl(filePath);
// Output a PDF of the first page in A4 size at 90% scale
var printOptions = new Dictionary<string, object>
{
{ "paperWidth", 210 / 25.4 },
{ "paperHeight", 297 / 25.4 },
{ "scale", 0.9 },
{ "pageRanges", "1" }
};
var printOutput = driver.ExecuteChromeCommandWithResult("Page.printToPDF", printOptions) as Dictionary<string, object>;
var pdf = Convert.FromBase64String(printOutput["data"] as string);
File.Delete(filePath);
return pdf;
}
和 HTML5
功能按预期工作。输出将与您在浏览器中查看的相同。这是我的工作项目存储库的链接 - HtmlToPdf
在几乎花了 2 天的可用选项之后,我得出了上述答案,并最终实施了基于 CSS3
的解决方案及其工作。希望这可以帮助您并节省您的时间。
答案 25 :(得分:1)
这是一个免费库,非常容易使用: OpenHtmlToPdf
Exception in thread "main" java.io.IOException: Server returned HTTP response code: 401 for URL: https://login.microsoftonline.com/"myTenantID"/oauth2/token
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
at com.nttdata.altemista.RateCardRest.getAccessToken(RateCardRest.java:38)
at com.nttdata.altemista.RateCardRest.main(RateCardRest.java:74)
答案 26 :(得分:1)
我发现并用于生成javascript和样式渲染视图或html页面的PDF的最佳工具是 phantomJS 。
使用在示例文件夹的exe的根目录中找到的rasterize.js函数下载.exe文件并将其放入解决方案中。
它甚至允许您在不打开该文件的情况下以任何代码下载文件,并且还允许在应用样式和特殊jquery时下载文件。
以下代码生成PDF文件:
public ActionResult DownloadHighChartHtml()
{
string serverPath = Server.MapPath("~/phantomjs/");
string filename = DateTime.Now.ToString("ddMMyyyy_hhmmss") + ".pdf";
string Url = "http://wwwabc.com";
new Thread(new ParameterizedThreadStart(x =>
{
ExecuteCommand(string.Format("cd {0} & E: & phantomjs rasterize.js {1} {2} \"A4\"", serverPath, Url, filename));
//E: is the drive for server.mappath
})).Start();
var filePath = Path.Combine(Server.MapPath("~/phantomjs/"), filename);
var stream = new MemoryStream();
byte[] bytes = DoWhile(filePath);
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=Image.pdf");
Response.OutputStream.Write(bytes, 0, bytes.Length);
Response.End();
return RedirectToAction("HighChart");
}
private void ExecuteCommand(string Command)
{
try
{
ProcessStartInfo ProcessInfo;
Process Process;
ProcessInfo = new ProcessStartInfo("cmd.exe", "/K " + Command);
ProcessInfo.CreateNoWindow = true;
ProcessInfo.UseShellExecute = false;
Process = Process.Start(ProcessInfo);
}
catch { }
}
private byte[] DoWhile(string filePath)
{
byte[] bytes = new byte[0];
bool fail = true;
while (fail)
{
try
{
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
bytes = new byte[file.Length];
file.Read(bytes, 0, (int)file.Length);
}
fail = false;
}
catch
{
Thread.Sleep(1000);
}
}
System.IO.File.Delete(filePath);
return bytes;
}
答案 27 :(得分:1)
答案 28 :(得分:0)
如果您使用的是itextsharp dll,则无需添加第三方dll(插件),我认为您使用的是htmlworker而不是使用xmlworker,您可以轻松地将html转换为pdf。
有些css不会工作,Supported CSS
Full Explain with example Reference Click here
MemoryStream memStream = new MemoryStream();
TextReader xmlString = new StringReader(outXml);
using (Document document = new Document())
{
PdfWriter writer = PdfWriter.GetInstance(document, memStream);
//document.SetPageSize(iTextSharp.text.PageSize.A4);
document.Open();
byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(outXml);
MemoryStream ms = new MemoryStream(byteArray);
XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, ms, System.Text.Encoding.UTF8);
document.Close();
}
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=" + filename + ".pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.BinaryWrite(memStream.ToArray());
Response.End();
Response.Flush();
答案 29 :(得分:0)
PDFmyURL最近发布了一个用于网页/ HTML到PDF转换的.NET组件。这有一个非常用户友好的界面,例如:
PDFmyURL pdf = new PDFmyURL("yourlicensekey");
pdf.ConvertURL("http://www.example.com", Application.StartupPath + @"\example.pdf");
文档:PDFmyURL .NET component documentation
免责声明:我为拥有PDFmyURL的公司工作
答案 30 :(得分:0)
您还可以查看 Spire ,它允许您使用这段简单的代码创建HTML to PDF
string htmlCode = "<p>This is a p tag</p>";
//use single thread to generate the pdf from above html code
Thread thread = new Thread(() =>
{ pdf.LoadFromHTML(htmlCode, false, setting, htmlLayoutFormat); });
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
// Save the file to PDF and preview it.
pdf.SaveToFile("output.pdf");
System.Diagnostics.Process.Start("output.pdf");
答案 31 :(得分:0)
如果您希望用户在浏览器中下载渲染页面的pdf,那么解决问题的最简单方法是
window.print();
在客户端,它将提示用户保存当前页面的pdf。您还可以通过链接样式
来自定义pdf的外观<link rel="stylesheet" type="text/css" href="print.css" media="print">
print.css在打印时应用于html。
<强>限制强>
您无法在服务器端存储该文件。 用户提示打印页面,而不是手动保存页面。 页面必须在选项卡中呈现。
答案 32 :(得分:0)
使用Winnovative HTML to PDF转换器,您可以在一行中转换HTML字符串
byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlString, baseUrl);
基本URL用于解析HTML字符串中相对URL引用的图像。或者,您可以使用HTML中的完整网址或使用src =“data:image / png”嵌入图片作为图片代码。
在回答关于Winnovative转换器的'fubaar'用户评论时,需要进行修正。转换器不使用IE作为渲染引擎。它实际上不依赖于任何已安装的软件,并且渲染与WebKit引擎兼容。
答案 33 :(得分:0)
使用Aspose.HTML在.NET中将HTML轻松转换为PDF:
var htmlDocument = new HTMLDocument(dataDir + "input.html");
// Initialize PdfSaveOptions
PdfSaveOptions options = new PdfSaveOptions
{
JpegQuality = 100
};
// Output file path
string outputPDF = dataDir + "output.pdf";
// Convert HTML to PDF
Converter.ConvertHTML(htmlDocument, options, outputPDF);
希望有帮助。否则,随时问我。
注意:我是Aspose的开发人员布道者。
答案 34 :(得分:0)
您可以使用WebBrowser控件的另一种技巧,下面是我完整的工作代码
在我的情况下,将Url分配给文本框控件
protected void Page_Load(object sender, EventArgs e)
{
txtweburl.Text = "https://www.google.com/";
}
下面是使用线程生成screeen的代码
protected void btnscreenshot_click(object sender, EventArgs e)
{
// btnscreenshot.Visible = false;
allpanels.Visible = true;
Thread thread = new Thread(GenerateThumbnail);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
private void GenerateThumbnail()
{
// btnscreenshot.Visible = false;
WebBrowser webrowse = new WebBrowser();
webrowse.ScrollBarsEnabled = false;
webrowse.AllowNavigation = true;
string url = txtweburl.Text.Trim();
webrowse.Navigate(url);
webrowse.Width = 1400;
webrowse.Height = 50000;
webrowse.DocumentCompleted += webbrowse_DocumentCompleted;
while (webrowse.ReadyState != WebBrowserReadyState.Complete)
{
System.Windows.Forms.Application.DoEvents();
}
}
在下面的代码中,下载后我将保存pdf文件
private void webbrowse_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
// btnscreenshot.Visible = false;
string folderPath = Server.MapPath("~/ImageFiles/");
WebBrowser webrowse = sender as WebBrowser;
//Bitmap bitmap = new Bitmap(webrowse.Width, webrowse.Height);
Bitmap bitmap = new Bitmap(webrowse.Width, webrowse.Height, PixelFormat.Format16bppRgb565);
webrowse.DrawToBitmap(bitmap, webrowse.Bounds);
string Systemimagedownloadpath = System.Configuration.ConfigurationManager.AppSettings["Systemimagedownloadpath"].ToString();
string fullOutputPath = Systemimagedownloadpath + Request.QueryString["VisitedId"].ToString() + ".png";
MemoryStream stream = new MemoryStream();
bitmap.Save(fullOutputPath, System.Drawing.Imaging.ImageFormat.Jpeg);
//generating pdf code
Document pdfDoc = new Document(new iTextSharp.text.Rectangle(1100f, 20000.25f));
PdfWriter writer = PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
pdfDoc.Open();
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(fullOutputPath);
img.ScaleAbsoluteHeight(20000);
img.ScaleAbsoluteWidth(1024);
pdfDoc.Add(img);
pdfDoc.Close();
//Download the PDF file.
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=ImageExport.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Write(pdfDoc);
Response.End();
}
您也可以参考我最早的帖子以获取更多信息:Navigation to the webpage was canceled getting message in asp.net web form
答案 35 :(得分:0)
尝试使用此 PDF Duo .Net 转换组件,以便在不使用其他dll的情况下转换HTML to PDF from ASP.NET应用程序。
您可以传递HTML字符串或文件,也可以传输流以生成PDF。 使用下面的代码(示例C#):
string file_html = @"K:\hdoc.html";
string file_pdf = @"K:\new.pdf";
try
{
DuoDimension.HtmlToPdf conv = new DuoDimension.HtmlToPdf();
conv.OpenHTML(file_html);
conv.SavePDF(file_pdf);
textBox4.Text = "C# Example: Converting succeeded";
}
您可以在http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx
找到的信息+ C#/ VB示例答案 36 :(得分:0)
答案 37 :(得分:-1)
另一个建议是https://grabz.it尝试解决方案。
它们提供了一个很好的.NET API来捕获屏幕截图并以一种简单灵活的方式对其进行操作。
要在您的应用中使用它,您需要先获得key + secret和download .NET SDK(它是免费的)。
现在是使用它的一个简短例子。
要使用API,您首先需要创建GrabzItClient类的实例,将您的应用程序密钥和应用程序密钥从GrabzIt帐户传递给构造函数,如下例所示:
//Create the GrabzItClient class
//Replace "APPLICATION KEY", "APPLICATION SECRET" with the values from your account!
private GrabzItClient grabzIt = GrabzItClient.Create("Sign in to view your Application Key", "Sign in to view your Application Secret");
现在,要将HTML转换为PDF,您需要执行以下操作:
grabzIt.HTMLToPDF("<html><body><h1>Hello World!</h1></body></html>");
您也可以转换为图片:
grabzIt.HTMLToImage("<html><body><h1>Hello World!</h1></body></html>");
接下来,您需要保存图像。如果可以使用公共可访问的回调句柄,则可以使用两种可用的保存方法之一,Save
,如果不可用,则使用SaveTo
。 Check the documentation了解详情。
答案 38 :(得分:-1)
您可以创建HTML页面的位图,然后使用例如iTextSharp将位图插入PDF中,而不是直接将HTML解析为PDF。
这是一个如何获取URL位图的代码。我在SO的某个地方找到了它,如果我找到了源码,我会链接它。
public System.Drawing.Bitmap HTMLToImage(String strHTML)
{
System.Drawing.Bitmap myBitmap = null;
System.Threading.Thread myThread = new System.Threading.Thread(delegate()
{
// create a hidden web browser, which will navigate to the page
System.Windows.Forms.WebBrowser myWebBrowser = new System.Windows.Forms.WebBrowser();
// we don't want scrollbars on our image
myWebBrowser.ScrollBarsEnabled = false;
// don't let any errors shine through
myWebBrowser.ScriptErrorsSuppressed = true;
// let's load up that page!
myWebBrowser.Navigate("about:blank");
// wait until the page is fully loaded
while (myWebBrowser.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
System.Windows.Forms.Application.DoEvents();
myWebBrowser.Document.Body.InnerHtml = strHTML;
// set the size of our web browser to be the same size as the page
int intScrollPadding = 20;
int intDocumentWidth = myWebBrowser.Document.Body.ScrollRectangle.Width + intScrollPadding;
int intDocumentHeight = myWebBrowser.Document.Body.ScrollRectangle.Height + intScrollPadding;
myWebBrowser.Width = intDocumentWidth;
myWebBrowser.Height = intDocumentHeight;
// a bitmap that we will draw to
myBitmap = new System.Drawing.Bitmap(intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding);
// draw the web browser to the bitmap
myWebBrowser.DrawToBitmap(myBitmap, new System.Drawing.Rectangle(0, 0, intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding));
});
myThread.SetApartmentState(System.Threading.ApartmentState.STA);
myThread.Start();
myThread.Join();
return myBitmap;
}
答案 39 :(得分:-1)
To convert HTML to PDF in C# use ABCpdf
ABCpdf可以使用Gecko或Trident渲染引擎,因此您的HTML表格看起来与FireFox和Internet Explorer中显示的相同。
在www.abcpdfeditor.com上有ABCpdf的在线演示。您可以使用它来检查表格的首次呈现方式,而无需下载和安装软件。
要渲染整个网页,您需要AddImageUrl或AddImageHtml函数。但是,如果您只想添加HTML样式的文本,那么您可以尝试使用AddHtml函数,如下所示:
Doc theDoc = new Doc();
theDoc.FontSize = 72;
theDoc.AddHtml("<b>Some HTML styled text</b>");
theDoc.Save(Server.MapPath("docaddhtml.pdf"));
theDoc.Clear();
ABCpdf是商业软件的标题,但标准版通常可以免费获得。