使用 PDFsharp 定位数据
Positioning data using PDFsharp
我正在使用 PDFsharp 为模型中的每个项目生成多页文档。
我得到了最终 PDF 需要的粗略模型:
长话短说,我必须制作两种不同类型的 PDF,我需要遵循模板的一种是多页 PDF,因此下面代码片段中的变量 _numberOfPages
.
我已经为多页 PDF 版本的每个项目实际生成了信息。根据请求中的项目数量,我添加了一个新页面,然后获取当前页面的项目数组的索引并附加这样的行。
PdfDocument Class
public PdfDocument BuildPdfDocument()
{
if (_numberOfPages > 1)
{
PdfDocument pdfDocument = new PdfDocument();
for (int i = 0; i < _numberOfPages; i++)
{
PdfPage page = pdfDocument.AddPage();
page.Orientation = PageOrientation.Landscape;
XGraphics gfx = XGraphics.FromPdfPage(page);
XFont font = new XFont("Arial", 30, XFontStyle.Regular);
XTextFormatter tf = new XTextFormatter(gfx);
XRect rect = new XRect(0, (page.Height / 4), page.Width, page.Height);
gfx.DrawRectangle(XBrushes.White, rect);
tf.Alignment = XParagraphAlignment.Left;
tf.DrawString(_request.GetText(i), font, XBrushes.Black, rect);
}
return pdfDocument;
}
else
{
// stuff relating to the other pdfDocument that is OK
}
}
FileRequest class 包含一个名为 GetText
的方法
public string GetText(int pageNo)
{
int[] fileRequestItems = this.FileRequestItems.Select(x => x.Id).ToArray();
var currentFileRequestItem = fileRequestItems[pageNo];
var items = FileRequestItems;
FileRequestItem item = items.FirstOrDefault(s => s.Id == currentFileRequestItem);
StringBuilder sb = new StringBuilder();
if (item.ObjectContextGetType() == typeof(FileRequestDocument)) // its a document so provide text for the PDF like this
{
var fileRequestDocument = item as FileRequestDocument;
sb.AppendLine("Date Requested: " + this.DateOfRequest.ToString("D"));
if (fileRequestDocument != null) sb.AppendLine("Box No: " + fileRequestDocument.Record.Box.BoxNumber);
sb.AppendLine("Location: " + this.Location.LocationName);
if (fileRequestDocument != null) sb.AppendLine("Description: " + fileRequestDocument.Record.Description);
sb.AppendLine("Requested By: " + this.Name);
sb.AppendLine("Tel: " + this.TelephoneNumber);
sb.AppendLine("Department: " + this.Department);
}
if (item.ObjectContextGetType() == typeof(FileRequestBox)) // its a box so provide text for the PDF like this
{
var fileRequestBox = item as FileRequestBox;
sb.AppendLine("Date Requested: " + this.DateOfRequest.ToString("D"));
if (fileRequestBox != null) sb.AppendLine("Box No: " + fileRequestBox.Box.BoxNumber);
sb.AppendLine("Location: " + this.Location.LocationName);
if (fileRequestBox != null) sb.AppendLine("Description: " + $"Entire Contents of Box Number {fileRequestBox.Box.BoxNumber}");
sb.AppendLine("Requested By: " + this.Name);
sb.AppendLine("Tel: " + this.TelephoneNumber);
sb.AppendLine("Department: " + this.Department);
}
return sb.ToString();
}
所有这一切的结果是下面的 PDF,一个包含 5 个项目的文件请求将超过 5 页,重复 Name/Date 等内容,但描述是独一无二的 FileRequestItem
或页面。
如您所见,虽然信息都在,但是定位与要求的模板不匹配
如何为每个页面创建指定模板或类似模板,然后相应地放置我的数据?
很好地尝试将长的多行字符串传递给 XTextFormatter
。如果您需要控制仓位,这是错误的做法。
要完全控制定位,请为单个项目调用 DrawString
。
我会使用 MigraDoc:MigraDoc 允许您创建 table 并将信息放在单独的 table 单元格中。
MigraDoc 使用 PDFsharp 创建 PDF 文件,但提供更高的 API 级别。
http://www.pdfsharp.net/wiki/Invoice-sample.ashx
这是一个老问题,但尝试提供一种不同的方法,您可以尝试在 HTML table 字符串中构建布局并在单独的文件中创建其 css 样式,然后执行以下操作:
string stylesUrl = Server.MapPath("pathToPdfStyle");
CssData css = PdfGenerator.ParseStyleSheet(File.ReadAllText(stylesUrl));
PdfDocument pdfTemp = PdfGenerator.GeneratePdf({HTMLString}, PageSize.A4, 20, css);
当您在浏览器中查看 html 文档和在 pdf reader 中查看 html 内容时,根据大小和格式的不同,视觉上会有细微差异,但它们非常相似。
我正在使用 PDFsharp 为模型中的每个项目生成多页文档。
我得到了最终 PDF 需要的粗略模型:
长话短说,我必须制作两种不同类型的 PDF,我需要遵循模板的一种是多页 PDF,因此下面代码片段中的变量 _numberOfPages
.
我已经为多页 PDF 版本的每个项目实际生成了信息。根据请求中的项目数量,我添加了一个新页面,然后获取当前页面的项目数组的索引并附加这样的行。
PdfDocument Class
public PdfDocument BuildPdfDocument()
{
if (_numberOfPages > 1)
{
PdfDocument pdfDocument = new PdfDocument();
for (int i = 0; i < _numberOfPages; i++)
{
PdfPage page = pdfDocument.AddPage();
page.Orientation = PageOrientation.Landscape;
XGraphics gfx = XGraphics.FromPdfPage(page);
XFont font = new XFont("Arial", 30, XFontStyle.Regular);
XTextFormatter tf = new XTextFormatter(gfx);
XRect rect = new XRect(0, (page.Height / 4), page.Width, page.Height);
gfx.DrawRectangle(XBrushes.White, rect);
tf.Alignment = XParagraphAlignment.Left;
tf.DrawString(_request.GetText(i), font, XBrushes.Black, rect);
}
return pdfDocument;
}
else
{
// stuff relating to the other pdfDocument that is OK
}
}
FileRequest class 包含一个名为 GetText
的方法public string GetText(int pageNo)
{
int[] fileRequestItems = this.FileRequestItems.Select(x => x.Id).ToArray();
var currentFileRequestItem = fileRequestItems[pageNo];
var items = FileRequestItems;
FileRequestItem item = items.FirstOrDefault(s => s.Id == currentFileRequestItem);
StringBuilder sb = new StringBuilder();
if (item.ObjectContextGetType() == typeof(FileRequestDocument)) // its a document so provide text for the PDF like this
{
var fileRequestDocument = item as FileRequestDocument;
sb.AppendLine("Date Requested: " + this.DateOfRequest.ToString("D"));
if (fileRequestDocument != null) sb.AppendLine("Box No: " + fileRequestDocument.Record.Box.BoxNumber);
sb.AppendLine("Location: " + this.Location.LocationName);
if (fileRequestDocument != null) sb.AppendLine("Description: " + fileRequestDocument.Record.Description);
sb.AppendLine("Requested By: " + this.Name);
sb.AppendLine("Tel: " + this.TelephoneNumber);
sb.AppendLine("Department: " + this.Department);
}
if (item.ObjectContextGetType() == typeof(FileRequestBox)) // its a box so provide text for the PDF like this
{
var fileRequestBox = item as FileRequestBox;
sb.AppendLine("Date Requested: " + this.DateOfRequest.ToString("D"));
if (fileRequestBox != null) sb.AppendLine("Box No: " + fileRequestBox.Box.BoxNumber);
sb.AppendLine("Location: " + this.Location.LocationName);
if (fileRequestBox != null) sb.AppendLine("Description: " + $"Entire Contents of Box Number {fileRequestBox.Box.BoxNumber}");
sb.AppendLine("Requested By: " + this.Name);
sb.AppendLine("Tel: " + this.TelephoneNumber);
sb.AppendLine("Department: " + this.Department);
}
return sb.ToString();
}
所有这一切的结果是下面的 PDF,一个包含 5 个项目的文件请求将超过 5 页,重复 Name/Date 等内容,但描述是独一无二的 FileRequestItem
或页面。
如您所见,虽然信息都在,但是定位与要求的模板不匹配
如何为每个页面创建指定模板或类似模板,然后相应地放置我的数据?
很好地尝试将长的多行字符串传递给 XTextFormatter
。如果您需要控制仓位,这是错误的做法。
要完全控制定位,请为单个项目调用 DrawString
。
我会使用 MigraDoc:MigraDoc 允许您创建 table 并将信息放在单独的 table 单元格中。
MigraDoc 使用 PDFsharp 创建 PDF 文件,但提供更高的 API 级别。
http://www.pdfsharp.net/wiki/Invoice-sample.ashx
这是一个老问题,但尝试提供一种不同的方法,您可以尝试在 HTML table 字符串中构建布局并在单独的文件中创建其 css 样式,然后执行以下操作:
string stylesUrl = Server.MapPath("pathToPdfStyle");
CssData css = PdfGenerator.ParseStyleSheet(File.ReadAllText(stylesUrl));
PdfDocument pdfTemp = PdfGenerator.GeneratePdf({HTMLString}, PageSize.A4, 20, css);
当您在浏览器中查看 html 文档和在 pdf reader 中查看 html 内容时,根据大小和格式的不同,视觉上会有细微差异,但它们非常相似。