webgridをpdf(画面上)にエクスポートする権利はありますが、すべての書式設定とスタイリングが失われています。どうして ?iTextSharpを使用してMVCでWebGridをPDFにエクスポート
ビュー:
<div id="gridContent" style="font-family: Arial; padding: 20px; overflow:auto;height:380px" class="col-md-12">
@grid.GetHtml(tableStyle: "webgrid-table",
headerStyle: "webgrid-header",
footerStyle: "webgrid-footer",
alternatingRowStyle: "webgrid-alternating-row",
selectedRowStyle: "webgrid-selected-row",
rowStyle: "webgrid-row-style",
mode: WebGridPagerModes.All,
columns:
grid.Columns(
grid.Column("NodeNumber", "Node Nr.", format: @<text> <span class="display-mode">@item.NodeNumber </span> <label id="NodeNumber" class="edit-mode">@item.NodeNumber</label> </text>, style: "col1Width"),
grid.Column("Accumulated_Length", "Accumulated Length", format: @<text> <span class="display-mode"> <label id="lblAccumulated_Length">@item.Accumulated_Length</label> </span> <input type="text" id="Accumulated_Length" value="@item.Accumulated_Length" class="edit-mode" /></text>, style: "col2Width"),
grid.Column("Elevation", "Elevation", format: @<text> <span class="display-mode"> <label id="lblElevation">@item.Elevation</label> </span> <input type="text" id="Elevation" value="@item.Elevation" class="edit-mode" /> </text>, style: "col2Width"),
grid.Column("Pipe_Outside_Diameter", "Pipe Outside Diameter", format: @<text> <span class="display-mode"> <label id="lblPipe_Outside_Diameter">@item.Pipe_Outside_Diameter</label> </span> <input type="text" id="Pipe_Outside_Diameter" value="@item.Pipe_Outside_Diameter" class="edit-mode" /> </text>, style: "col2Width"),
grid.Column("Wall_Thickness", "Wall Thickness", format: @<text> <span class="display-mode"> <label id="lblWall_Thickness">@item.Wall_Thickness</label> </span> <input type="text" id="Wall_Thickness" value="@item.Wall_Thickness" class="edit-mode" /> </text>, style: "col2Width"),
grid.Column("Control_Point_Description", "Control Point Description", format: @<text> <span class="display-mode"> <label id="lblControl_Point_Description">@item.Control_Point_Description</label> </span> <input type="text" id="Control_Point_Description" value="@item.Control_Point_Description" class="edit-mode" /> </text>, style: "col2Width"),
grid.Column("Control_Point_Size", "Control Point Size", format: @<text> <span class="display-mode"> <label id="lblControl_Point_Size">@item.Control_Point_Size</label> </span> <input type="text" id="Control_Point_Size" value="@item.Control_Point_Size" class="edit-mode" /> </text>, style: "col2Width"),
grid.Column("", format: @<text>
<input type="hidden" class="fkiProjectID" value="@item.fkiProjectID" />
<input type="hidden" class="pkiPipeline" value="@item.pkiPipeline" />
<div class="container" style="width:120px">
<div class="btn-group-xs">
<button data-loading-text="Loading..." class="edit-user display-mode btn btn-default2" autocomplete="off">Edit</button>
<button class="delete-user display-mode btn btn-default2">Delete</button>
</div>
</div>
</text>, style: "col3Width", canSort: false)
))
</div>
@Html.ActionLink("Pipeline", "ExportPDF", new { ProjectID = Model.fkiProjectID }, new { target = "_blank" })
コントローラー:
public void ExportPDF(int ProjectID)
{
List<PipelineDetails> PipeList = new List<PipelineDetails>();
ProjectManager PM = new ProjectManager();
PipeList = PM.GetPipelineList(ProjectID);
WebGrid grid = new WebGrid(source: PipeList, canPage: false, canSort: false);
string griddata = grid.GetHtml(tableStyle: "webgrid-table",
headerStyle: "webgrid-header",
footerStyle: "webgrid-footer",
alternatingRowStyle: "webgrid-alternating-row",
selectedRowStyle: "webgrid-selected-row",
rowStyle: "webgrid-row-style").ToString();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=Pipeline_Report.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
StringWriter s_w = new StringWriter();
HtmlTextWriter h_w = new HtmlTextWriter(s_w);
StringReader sr = new StringReader(griddata);
Document pdfDoc = new Document(PageSize.A4, 50, 50, 50, 50);
HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
pdfDoc.Open();
htmlparser.Parse(sr);
pdfDoc.Close();
Response.Write(pdfDoc);
Response.End();
}
両方obove作品:
public FileStreamResult ExportPDF(int ProjectID)
{
List<PipelineDetails> PipeList = new List<PipelineDetails>();
ProjectManager PM = new ProjectManager();
PipeList = PM.GetPipelineList(ProjectID);
WebGrid grid = new WebGrid(source: PipeList, canPage: false, canSort: false);
string gridHtml = grid.GetHtml(tableStyle: "webgrid-table",
headerStyle: "webgrid-header",
footerStyle: "webgrid-footer",
alternatingRowStyle: "webgrid-alternating-row",
selectedRowStyle: "webgrid-selected-row",
rowStyle: "webgrid-row-style",
columns: grid.Columns(
grid.Column("NodeNumber", "Node Nr."),
grid.Column("Accumulated_Length", "Accumulated Length"),
grid.Column("Elevation", "Elevation"),
grid.Column("Pipe_Outside_Diameter", "Pipe Outside Diameter"),
grid.Column("Wall_Thickness", "Wall Thickness"),
grid.Column("Control_Point_Description", "Control Point Description"),
grid.Column("Control_Point_Size", "Control Point Size"))).ToString();
string exportData = String.Format("<html><body>{0}</body></html>", gridHtml);
var bytes = System.Text.Encoding.UTF8.GetBytes(exportData);
using (var input = new MemoryStream(bytes))
{
var output = new MemoryStream();
var document = new iTextSharp.text.Document(PageSize.A4, 50, 50, 50, 50);
var writer = PdfWriter.GetInstance(document, output);
writer.CloseStream = false;
document.Open();
var xmlWorker = iTextSharp.tool.xml.XMLWorkerHelper.GetInstance();
xmlWorker.ParseXHtml(writer, document, input, System.Text.Encoding.UTF8);
document.Close();
output.Position = 0;
return new FileStreamResult(output, "application/pdf");
}
}
アイブ氏も、コントローラーで以下の変更を試してみました。 1番目はpdfを新しいタブに開き、2番目はpdfに保存してダウンロードします。しかし、どちらも書式設定がありません。
コントローラにwebgrid用の書式を追加するかどうかにかかわらず、書式設定はPDFには適用されません。私は何が間違っている/間違っていますか?
ご協力いただきありがとうございます。
私はこれを十分に強調することはできません:**あなたがそれを解析したいHTMLとCSSをiTextに配送することはあなたの責任です。**それはあなたが 'srあなたがiTextに働きかけるすべてのものです。また、iTextはWebアプリケーションのコンテキストでは実行されず、代わりに「ブラインドボックス」として呼び出されるため、相対リンクを解決する方法はあなたには知らされません。したがって、絶対的なものではないもの(CSSファイルなど)は絶対的なものにするか、そのコンテキストで渡す必要があります。 –
お返事ありがとうございます@ChrisHaas。遅い返事をして申し訳ありません、私はしばらくの間、他のものにこだわっていました。私はこのすべてに新しいし、ドキュメントを見つけるのに苦労しています。 CSSファイルのようなものを絶対にするにはどうすればいいですか?または、iTextに渡すものをどのようにフォーマットするのですか? – AxleWack