現在のhtmlページをpdfに変換する必要があり、そのpdfはサーバーのボタンクリックで自動的に保存され、その参照はデータベースに保存されるプロジェクトで作業しています。データがデータベースからのものであるが、このフォームは静的です。つまり、ビューには非常に多くのラジオボタンとテキストボックスがあり、詳細を書き込んで、[保存]ボタンをクリックした後にチェックボックスをオンにすると、サーバーに保存され、その参照がデータに保存されます。ベース。
その理由は、データベースにデータを保存しないのは、レポートがクライアントにとってあまり使用されないためですが、データベースにデータを保存すると、データベースが非常に大きくなり、処理が複雑になります。レポートには約100個のフィールドがあるためです。誰かが私を助けてくれるならお願いします。
SelectPdf( http://selectpdf.com/community-edition/ )から無料のHTMLからPDFへのコンバーターを使用できます。
MVCのコードは次のようになります。
[HttpPost]
public ActionResult Convert(FormCollection collection)
{
// read parameters from the webpage
string url = collection["TxtUrl"];
string pdf_page_size = collection["DdlPageSize"];
PdfPageSize pageSize = (PdfPageSize)Enum.Parse(typeof(PdfPageSize), pdf_page_size, true);
string pdf_orientation = collection["DdlPageOrientation"];
PdfPageOrientation pdfOrientation = (PdfPageOrientation)Enum.Parse(
typeof(PdfPageOrientation), pdf_orientation, true);
int webPageWidth = 1024;
try
{
webPageWidth = System.Convert.ToInt32(collection["TxtWidth"]);
}
catch { }
int webPageHeight = 0;
try
{
webPageHeight = System.Convert.ToInt32(collection["TxtHeight"]);
}
catch { }
// instantiate a html to pdf converter object
HtmlToPdf converter = new HtmlToPdf();
// set converter options
converter.Options.PdfPageSize = pageSize;
converter.Options.PdfPageOrientation = pdfOrientation;
converter.Options.WebPageWidth = webPageWidth;
converter.Options.WebPageHeight = webPageHeight;
// create a new pdf document converting an url
PdfDocument doc = converter.ConvertUrl(url);
// save pdf document
byte[] pdf = doc.Save();
// close pdf document
doc.Close();
// return resulted pdf document
FileResult fileResult = new FileContentResult(pdf, "application/pdf");
fileResult.FileDownloadName = "Document.pdf";
return fileResult;
}
コードのVB.NETMVCバージョンはここにあります: http://selectpdf.com/convert-from-html-to-pdf-in-asp-net-mvc-csharp-and-vb-net /
要するに:
HTMLレンダラーfor PDF using PdfSharp
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;
}
以下のC#コードをMVCアプリケーションで使用して、現在のビューをPDFに変換し、サーバーに保存できるバッファーにPDFダウンロードのためにブラウザに送信されます。コードは 。netのevopdfライブラリ を使用してHTMLをPDF変換:
[HttpPost]
public ActionResult ConvertCurrentPageToPdf(FormCollection collection)
{
object model = null;
ViewDataDictionary viewData = new ViewDataDictionary(model);
// The string writer where to render the HTML code of the view
StringWriter stringWriter = new StringWriter();
// Render the Index view in a HTML string
ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, "Index", null);
ViewContext viewContext = new ViewContext(
ControllerContext,
viewResult.View,
viewData,
new TempDataDictionary(),
stringWriter
);
viewResult.View.Render(viewContext, stringWriter);
// Get the view HTML string
string htmlToConvert = stringWriter.ToString();
// Get the base URL
String currentPageUrl = this.ControllerContext.HttpContext.Request.Url.AbsoluteUri;
String baseUrl = currentPageUrl.Substring(0, currentPageUrl.Length - "Convert_Current_Page/ConvertCurrentPageToPdf".Length);
// Create a HTML to PDF converter object with default settings
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Convert the HTML string to a PDF document in a memory buffer
byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlToConvert, baseUrl);
// Send the PDF file to browser
FileResult fileResult = new FileContentResult(outPdfBuffer, "application/pdf");
fileResult.FileDownloadName = "Convert_Current_Page.pdf";
return fileResult;
}
ABCpdf
dllを使用します。ここのテキスト領域にhtmlコードを記述でき、ボタンをクリックすると対応するpdfが表示されます。ABCpdf
トレイルバージョンはダウンロードに簡単に利用でき、linlkを追加してABCpdf
dll https://www.websupergoo.com/download.htm
index.cshtml
@using (Html.BeginForm("covertopdf", "simple", FormMethod.Post))
{
<p style="margin-top:50px">
Input Html: @Html.TextArea("Htmlcontent", new { @class = "form-control",@cols="160" , @rows="20"})<br />
<input type="submit" class="btn-primary" value="Convertopdf" />
</p>
}
SimpleController.cs
public class SimpleController : Controller
{
public class FileViewModel
{
public byte[] Content { get; set; }
public string Extension { get; set; }
public string FileName { get; set; }
}
[HttpPost]
[ValidateInput(false)]
public FileStreamResult covertopdf(string Htmlcontent)
//public FileStreamResult covertopdf(file fo)
{
var result = ExecuteAction(() =>
{
var fileViewmodel = new FileViewModel
{
Content = ConvertHtmlToPdf(Htmlcontent),
//Content= ConvertHtmlToPdf(fo.cont),
Extension = "application/pdf",
FileName = "Policy Information.pdf"
};
return fileViewmodel;
}, "covertopdf");
// return result;
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
// Content is the file
Stream stream = new MemoryStream(result.Content);
return new FileStreamResult(stream, "application/pdf")
{
};
}
public T ExecuteAction<T>(Func<T> action, string method)
{
try
{
return action.Invoke();
}
catch (Exception ex)
{
return default(T);
}
}
protected byte[] ConvertHtmlToPdf(string html, string header = null, string footer = null, bool isPageNumberInFooter = false)
{
// Create ABCpdf Doc object
var doc = new Doc();
if (header == null && footer == null)
doc.Rect.Inset(20, 20);
else
doc.Rect.String = "0 70 600 760"; /*padding from left, padding from bottom, width from left, height from bottom*/
// Add html to Doc
//html = "<html><head></head><body></body></html>";
int theId = doc.AddImageHtml(html);
// Loop through document to create multi-page PDF
while (true)
{
if (!doc.Chainable(theId))
break;
doc.Page = doc.AddPage();
theId = doc.AddImageToChain(theId);
}
var count = doc.PageCount;
/*****************Footer area******************/
if (footer != null)
{
var newfooter = "";
doc.Rect.String = "40 20 580 50";
for (int i = 1; i <= count; i++)
{
doc.PageNumber = i;
if (isPageNumberInFooter)
{
newfooter = footer.Replace("PageNumber", "Page " + i.ToString() + " of " + count.ToString());
int id = doc.AddImageHtml(newfooter);
while (true)
{
if (!doc.Chainable(id))
break;
id = doc.AddImageToChain(id);
}
}
else
doc.AddText(footer);
}
}
/*****************Footer area******************/
// Flatten the PDF
for (int i = 1; i <= doc.PageCount; i++)
{
doc.PageNumber = i;
doc.Flatten();
}
var pdf = doc.GetData();
doc.Clear();
// Get PDF as byte array. Couls also use .Save() to save to disk
return pdf;
}
}
特別なnugetパッケージRazorPDFがあります。簡単に動作します。 RazorPDFサイト
そこに利用可能な.NET用のhtmlからpdfへのコンバーターがたくさんあります。 ExpertPdf( www.html-to-pdf.net )をお勧めします。
コードは次のようになります。
PdfConverter pdfConverter = new PdfConverter();
pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
byte[] downloadBytes = pdfConverter.GetPdfFromUrlBytes(url);
ここにオンラインデモがあります: http://www.html-to-pdf.net/free-online-pdf-converter.aspx
IDiTect.Converterを使用してasp.netmvcでhtmlをpdfに変換しました https://www.iditect.com/tutorial/html-to-pdf/ しかし、要するに無料のコードではありません
public static Byte[] ConvertToBytes()
{
HtmlToPdfConverter converter = new HtmlToPdfConverter();
converter.DefaultStyleSheet = ".para{font-size: 24px; color: #FF0000;}";
string htmlContent = "<p class=\"para\">Content with special style.</p><p>Content without style</p>";
converter.Load(htmlContent);
return converter.SaveAsBytes();
}