如何使用 PDFsharp 限制每页 table 行?

How to limit table rows per page using PDFsharp?

我正在使用 table 来显示图例数据。该页面处于横向模式。我想将 table 行限制为每列 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()
            };
        }

    }

哪里出了问题?

您需要一个 X 变量。 15 行后,您重置 Y 并递增 X。

在您重置 X 和 Y 的 30 行之后,添加一个新页面,为该页面获取一个新的 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 只是一个让您入门的猜测。 Table 缺少标题。