我正在使用表格来显示图例数据。该页面处于横向模式。我想将表行限制为每列15个。每页2列,然后创建新页面,依此类推。这是当前的输出。
这是一个模型,说明当有更多数据时我想要它的样子。如果超过30个项目,则需要创建新页面。
控制器中的代码
[HttpPost]
public PDF Post([FromBody]List<Data> data)
{
try
{
// Get some file names
string filePath = @"~\tempPdfs\";
string completeFilePath = HttpContext.Current.Server.MapPath(filePath);
var directory = new DirectoryInfo(completeFilePath);
var fileName = (from f in directory.GetFiles("*.pdf")
orderby f.LastWriteTime descending
select f).First();
// Open the output document
PdfDocument outputDocument = new PdfDocument();
// Open the document to import pages from it..
PdfDocument inputDocument = PdfReader.Open(fileName.FullName, PdfDocumentOpenMode.Import);
// Iterate pages
int count = inputDocument.PageCount;
for (int idx = 0; idx < count; idx++)
{
// Get the page from the external document...
PdfPage page = inputDocument.Pages[idx];
// ...and add it to the output document.
outputDocument.AddPage(page);
}
//Create an Empty Page
PdfPage pdfpage = outputDocument.AddPage();
pdfpage.Size = PageSize.Letter; // Change the Page Size
pdfpage.Orientation = PageOrientation.Landscape;// Change the orientation property
//Get an XGraphics object for drawing
XGraphics xGrap = XGraphics.FromPdfPage(pdfpage);
//Create Fonts
XFont titlefont = new XFont("Calibri", 20, XFontStyle.Regular);
XFont tableheader = new XFont("Calibri", 15, XFontStyle.Bold);
XFont bodyfont = new XFont("Calibri", 11, XFontStyle.Regular);
//Draw the text
//double x = 250;
double y = 50;
//Title Binding
XTextFormatter textformater = new XTextFormatter(xGrap); //Used to Hold the Custom text Area
foreach (var item in data)
{
string colorStr = item.Color;
Regex regex = new Regex(@"rgb\((?<r>\d{1,3}),(?<g>\d{1,3}),(?<b>\d{1,3})\)");
//regex.Match(colorStr.Replace(" ", ""));
Match match = regex.Match(colorStr.Replace(" ", ""));
if (match.Success)
{
int r = int.Parse(match.Groups["r"].Value);
int g = int.Parse(match.Groups["g"].Value);
int b = int.Parse(match.Groups["b"].Value);
y = y + 30;
XRect ColorVal = new XRect(85, y, 5, 5);
XRect NameVal = new XRect(100, y, 250, 25);
var brush = new XSolidBrush(XColor.FromArgb(r, g, b));
xGrap.DrawRectangle(brush, ColorVal);
textformater.DrawString(item.Name, bodyfont, XBrushes.Black, NameVal);
};
};
// Save the document...
var dt = DateTime.Now.ToString("g").Replace('/', '-').Replace(':', '-');
var filename = string.Format("{0}-{1}.pdf", "PdfSharpResult", dt);
string physicalPath = HttpContext.Current.Server.MapPath("/completePdfs");
string relativePath = Path.Combine(physicalPath, filename).Replace("\\", "/");
var pdfName = relativePath;
outputDocument.Save(pdfName);
// ...and start a viewer.
Process.Start(pdfName);
return new PDF
{
FileName = pdfName,
FileNameEncoded = HttpUtility.UrlEncode(pdfName)
};
}
catch (Exception ex)
{
Debug.Print(ex.ToString());
return new PDF
{
Error = ex.ToString()
};
}
}
答案 0 :(得分:1)
问题出在哪里?
你需要一个X变量。在15行之后,您重置Y并增加X.
在30行后,您重置X和Y,添加新页面,获取该页面的新XGrap
并重新生成XTextFormatter
并继续此操作直到列表完成。
行计数器可能会让事情变得更容易。
未经测试的代码显示了一个循环,可根据需要创建页面并关注第二列:
PdfPage pdfpage;
XGraphics xGrap;
XTextFormatter textformater;
//Create Fonts
XFont titlefont = new XFont("Calibri", 20, XFontStyle.Regular);
XFont tableheader = new XFont("Calibri", 15, XFontStyle.Bold);
XFont bodyfont = new XFont("Calibri", 11, XFontStyle.Regular);
//Draw the text
double x = 0;
double y = 50;
//Title Binding
int index = 0;
foreach (var item in data)
{
if (index % 30 == 0)
{
y = 50;
x = 0;
// Start a new page.
//Create an Empty Page
pdfpage = outputDocument.AddPage();
pdfpage.Size = PageSize.Letter; // Change the Page Size
pdfpage.Orientation = PageOrientation.Landscape;// Change the orientation property
//Get an XGraphics object for drawing
xGrap = XGraphics.FromPdfPage(pdfpage);
textformater = new XTextFormatter(xGrap); //Used to Hold the Custom text Area
}
else if (index % 15 == 0)
{
// Start a new column.
y = 50;
x = 400;
}
++index;
// Previous code stays here, but must use x in new XRect(...)
string colorStr = item.Color;
Regex regex = new Regex(@"rgb\((?<r>\d{1,3}),(?<g>\d{1,3}),(?<b>\d{1,3})\)");
//regex.Match(colorStr.Replace(" ", ""));
Match match = regex.Match(colorStr.Replace(" ", ""));
if (match.Success)
{
int r = int.Parse(match.Groups["r"].Value);
int g = int.Parse(match.Groups["g"].Value);
int b = int.Parse(match.Groups["b"].Value);
y = y + 30;
XRect ColorVal = new XRect(x + 85, y, 5, 5);
XRect NameVal = new XRect(x + 100, y, 250, 25);
var brush = new XSolidBrush(XColor.FromArgb(r, g, b));
xGrap.DrawRectangle(brush, ColorVal);
textformater.DrawString(item.Name, bodyfont, XBrushes.Black, NameVal);
};
};
x = 400只是让你开始的猜测。表标题缺失。