HTMLの内容を関数に渡してPDFを生成したいのですが。私はこのためにiTextSharpを使用しましたが、テーブルに遭遇してレイアウトが乱雑になったときにはうまく機能しません。
もっと良い方法はありますか?
wkhtmltopdf を試してください。これは私がこれまで見つけた中で最高のツールです。
.NETの場合、wkhtmltopdfコマンドラインユーティリティを簡単に呼び出すには、この 小さなライブラリ を使用します。
編集:新しい提案PdfSharpを使用したPDFのHTMLレンダラー
(wkhtmltopdfを試して、それを回避することを提案した後)
HtmlRenderer.PdfSharpは、100%完全C#管理コード、簡単、スレッドセーフ、そして最も重要なFREE( 新しいBSDライセンス )ソリューションです。 。
使用法
メソッド例を使用してください。
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;
}
非常に良い代替は 無料版 / iTextSharp
バージョン4.1.6までiTextSharpはLGPLライセンスの下でライセンスされ、バージョン4.16まで(またはフォークもあるかもしれません)のパッケージとして利用可能であり、自由に使用することができます。もちろん、誰かが継続的な5+ 有料版を使うことができます 。
私は自分のプロジェクトにwkhtmltopdfソリューションを統合しようとしましたが、たくさんのハードルがありました。
私は個人的には、以下の理由でHosted Enterpriseアプリケーションでwkhtmltopdfベースのソリューションを使用しないでください。
--- PRE編集セクション---
より簡単なアプリケーション/環境でHTMLからPDFを生成したい人のために私は提案として私の古い記事を残します。
https://www.nuget.org/packages/TuesPechkin/ /
または特にMVC Webアプリケーション(しかし、私はあなたがどんな.netアプリケーションでもそれを使うかもしれないと思う)
https://www.nuget.org/packages/Rotativa/ /
両方ともhtmlをpdfに変換するために wkhtmtopdf バイナリを利用します。これはcssスタイルシートを解析できるようにページのレンダリングにWebkitエンジンを使用します。
これらはC#とのシームレスで使いやすい統合を提供します。
Rotativaは任意のRazorビューから直接PDFを生成することもできます。
さらに実社会のWebアプリケーションでは、スレッドの安全性なども管理します。
HTMLからPDFへのコンバータのほとんどは、HTMLの解析とレンダリングを行うためにIEに依存しています。これはユーザーが自分のIEを更新するときに壊れる可能性があります。 ここで はIEに依存しないものです。
コードは次のようなものです。
EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);
他の多くのコンバーターと同様に、テキスト、ファイル名、またはURLを渡すことができます。結果はファイルまたはストリームに保存できます。
私は最近HTMLからPDFへの変換に関してPoCを行い、自分の結果を共有したいと思いました。
私のこれまでのお気に入りは OpenHtmlToPdf です。
このツールの利点:
テストした他のツール:
NReco を強くお勧めします。無料版と有料版があり、本当に価値があります。バックグラウンドでwkhtmtopdfを使用しますが、アセンブリが1つだけ必要です。素晴らしいです。
使用例
NuGet からインストールしてください。
var htmlContent = String.Format("<body>Hello world: {0}</body>", DateTime.Now);
var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);
免責事項:私は開発者ではなく、プロジェクトのファンに過ぎません:)
Winnovative HTML入力をサポートする.Net PDFライブラリを提供する。彼らは無制限の 無料トライアル を提供しています。プロジェクトのデプロイ方法によっては、これで十分な場合があります。
私はExpertPDFを使いました HtmlからPdfへのコンバータ まともな仕事をします。残念ながら、無料ではありません。
必須PDF を使用して HTMLをPDF : C#sample に変換できます。ここにリンクされているサンプルはASP.NETベースですが、このライブラリはWindowsフォーム、WPF、ASP.NET Webフォーム、およびASP.NET MVCから使用できます。このライブラリでは、Internet Explorer(デフォルト)とWebKit(最適な出力)の異なるHTMLレンダリングエンジンを使用することができます。
資格がある場合は、 コミュニティライセンス プログラムを通じて、一連のコントロール全体を無料で(商用アプリケーションでも)入手できます。コミュニティライセンスは完全な製品であり、制限や透かしはありません。
注意:私はSyncfusionに勤めています。
新しいWebベースの文書生成アプリもあります - DocRaptor.com 。使いやすいようで、そして無料のオプションがあります。
あなたが本当に本当の.Net PDFライブラリを必要としないのであれば、たくさんの PDF toolsへの無料のHTML があります。ライン。
1つの解決策はそれらのうちの1つを選んでからC#でそれの周りに薄いラッパーを書くことでしょう。たとえば、 このチュートリアル で行ったように。
HTMLからPDFへの要求には良い知らせがあります。 この回答が示したように 、 W3C標準 css-break-3 は問題を解決する ...これは2017年または2018年に決定版の勧告に変わることを計画した勧告候補です。テスト後.
それほど標準的でないものとして、 print-css.rocks で示されるように、C#用のプラグインを使った解決策があります。
以下は、iTextSharpを使用してhtml + cssをPDFに変換する例です(iTextSharp + itextsharp.xmlworker)。
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();
}
ABCpdf.NET(http://www.websupergoo.com/abcpdf-5.htm)
使ってお勧めします。
非常に優れたコンポーネントです。画像のようにWebページをPDFに変換するだけでなく、テキスト、画像、書式設定なども実際に変換します。
無料ではありませんが、安いです。
それはあなたが持っている他のどんな要求にも左右される。
WebBrowserコントロールを使用してHtmlを読み込み、次にPrintメソッドを使用してローカルにインストールされたPDFプリンタに印刷することは、非常に単純ですが簡単には展開できないソリューションです。利用可能な無料のPDFプリンタがいくつかあり、WebBrowserコントロールは.Netフレームワークの一部です。
編集:あなたがHTMLである場合XTMLあなたは仕事をするために PDFizer を使用することができます。
私は以下のライブラリがhtmlをpdfに変換するのにより効果的であるとわかりました。
nuget : https://www.nuget.org/packages/Select.HtmlToPdf/
PDFビジョン 良いです。ただし、それを使用するには完全信頼が必要です。私はすでにメールを送って、なぜ私のHTMLがサーバー上で変換されないのかと尋ねましたが、localhost上ではうまく機能しました。
あなたがpdfで完璧なhtmlレンダリングを必要とするならば、あなたは商業ライブラリを使う必要があります。
ExpertPdf HTMLからPDFへの変換 は非常に使いやすく、最新のhtml5/css3をサポートしています。 URL全体をpdfに変換することもできます。
using ExpertPdf.HtmlToPdf;
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromUrl(url);
またはHTML文字列:
using ExpertPdf.HtmlToPdf;
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromHtmlString(html, baseUrl);
生成されたPDFドキュメントをディスク上のファイルのストリームに直接保存することもできます。
私はRotativaパッケージの作者です。かみそりビューから直接PDFファイルを作成することができます。
https://www.nuget.org/packages/Rotativa/ /
ModelおよびViewBagコンテナからのデータでかみそりビューを使用できるので、使用するのは簡単で、あなたはレイアウトを完全に制御できます。
AzureでSaaSバージョンを開発しました。それはWebApiまたはあらゆる.Netアプリ、サービス、Azure Webサイト、Azure Webジョブ、それが.Netを実行するものすべてからそれを使用することをさらに簡単にします。
利用可能な無料のアカウント。
私もしばらく前にこれを探していました。私はHTMLDOCに出会いました http://www.easysw.com/htmldoc/ は引数としてHTMLファイルを取り、そこからPDFを吐き出す無料のオープンソースのコマンドラインアプリです。 。私のサイドプロジェクトではかなりうまくいきましたが、実際に必要なものによって異なります。
それを作っている会社はコンパイルされたバイナリを売っています、しかしあなたはソースから無料でダウンロードしてコンパイルして、そして無料でそれを使うことができます。私はかなり最近のリビジョン(バージョン1.9用)をコンパイルすることができました、そして私は数日以内にそれのためにバイナリインストーラーをリリースするつもりです。
編集(2/25/2014):ドキュメントとサイトは http://www.msweet.org/projects.php?Z1 に移動したようです。
これは 無料のライブラリ であり、とても簡単に動作します。 OpenHtmlToPdf
string timeStampForPdfName = DateTime.Now.ToString("yyMMddHHmmssff");
string serverPath = System.Web.Hosting.HostingEnvironment.MapPath("~/FolderName");
string pdfSavePath = Path.Combine(@serverPath, "FileName" + timeStampForPdfName + ".FileExtension");
//OpenHtmlToPdf Library used for Performing PDF Conversion
var pdf = Pdf.From(HTML_String).Content();
//FOr writing to file from a ByteArray
File.WriteAllBytes(pdfSavePath, pdf.ToArray()); // Requires System.Linq
HiQPdfソフトウェアの代表として、私は最善の解決策が HiQPdf HTMLからPDF .NET for .NETへの変換 であると思います。それは市場で最も先進的なHTML5、CSS3、SVGとJavaScriptレンダリングエンジンを含みます。 HTMLからPDFライブラリへの無料版 _もあり、これを使用して最大3個のPDFページまで無料で作成できます。 HTMLページからbyte []としてPDFを生成するための最小限の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);
ASP.NETとMVCの両方に関するより詳細な例は、 HiQPdf HTMLからPDFへのコンバータの例のリポジトリ にあります。
私が見つけたJavascriptのPDFや、レンダリングされたビューやhtmlページのスタイルを生成するのに最適なツールは phantomJS です。
サンプルフォルダのexeのルートにあるrasterize.js関数で.exeファイルをダウンロードして、解の中に入れます。
それはあなたがそのファイルを開かずにどんなコードででもファイルをダウンロードすることを可能にしますまたそれはスタイルと特別にjqueryが適用されるときそれもファイルをダウンロードすることを可能にします。
次のコードはPDF Fileを生成します。
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;
}
PDFmyURLは最近、Webページ/ HTMLからPDFへの変換用の.NETコンポーネントもリリースしました。これは非常にユーザーフレンドリーなインターフェースを持っています、例えば:
PDFmyURL pdf = new PDFmyURL("yourlicensekey");
pdf.ConvertURL("http://www.example.com", Application.StartupPath + @"\example.pdf");
ドキュメンテーション: PDFmyURL .NETコンポーネントドキュメンテーション
免責事項:私はPDFmyURLを所有する会社で働いています
Itextsharp dllを使用しているのであれば、サードパーティdll(プラグイン)を追加する必要はありません。xmlworkerを使用する代わりにhtmlworkerを使用していると思います。httmlを簡単にpdfに変換できます。
いくつかのCSSはそれらが動作しないでしょう サポートされているCSS
例を使用した詳細説明の参照ここをクリック
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();
あなたがユーザーにブラウザでレンダリングされたページのpdfをダウンロードさせたいなら、その問題に対する最も簡単な解決策は、
window.print();
クライアント側では、現在のページのPDFを保存するようにユーザーに促します。リンクスタイルでpdfの外観をカスタマイズすることもできます
<link rel="stylesheet" type="text/css" href="print.css" media="print">
印刷中にprint.cssがHTMLに適用されます。
制限
ファイルをサーバー側に保存することはできません。ユーザーは手動でページを保存しなければならなかったよりもページを印刷するように促します。ページはタブでレンダリングされる必要があります。
WebBrowserコントロールを使用できるもう1つのトリックは、以下の完全に機能するコードです
私の場合、テキストボックスコントロールにURLを割り当てる
protected void Page_Load(object sender, EventArgs e)
{
txtweburl.Text = "https://www.google.com/";
}
以下は、スレッドを使用して画面を生成するためのコードです
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();
}
詳細については、私の最も古い投稿を参照することもできます: Webページへのナビゲーションがキャンセルされ、asp.net Webフォームにメッセージが表示されました
Winnovative HTML to PDF converterを使用すると、HTML文字列を1行で変換できます。
byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlString, baseUrl);
ベースURLは、HTML文字列内の相対URLによって参照される画像を解決するために使用されます。あるいは、HTMLのフルURLを使用するか、または画像タグにsrc = "data:image/png"を使用して画像を埋め込むことができます。
Winnovativeコンバーターに関する 'fubaar'ユーザーのコメントに答えて、修正が必要です。コンバーターはレンダリングエンジンとしてIEを使用しません。実際にはインストールされているソフトウェアには依存せず、レンダリングはWebKitエンジンと互換性があります。
https://grabz.it で解決策を試すことを提案します。
彼らはスクリーンショットをキャッチし、簡単で柔軟なアプローチでそれを操作するニース.NET APIを提供します。
アプリで使用するには、最初に key + secret および download を取得する必要があります(無料です)。
今、それを使用する短い例。
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>");
次に、画像を保存する必要があります。使用可能な2つの保存メソッドのいずれかを使用できます。公開アクセス可能なコールバックハンドルが使用可能な場合はSave
、使用できない場合はSaveTo
です。 ドキュメントを確認してください 詳細については。
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");
詳細な記事:asp.net C#でHTMLをPDFに変換する方法 [
HTMLを直接PDFに解析する代わりに、HTMLページのビットマップを作成してから、たとえば iTextSharp を使用して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;
}
追加のDLLを使用せずに HTMLからASP.NETからPDF アプリケーションへの変換のためのこのPDF Duo .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";
}
あなたが見つけることができる情報+ C#/ VBの例: http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx