如何使用PDFsharp限制每页的表行?

时间:2015-06-16 11:02:16

标签: c# foreach pdfsharp

我正在使用表格来显示图例数据。该页面处于横向模式。我想将表行限制为每列15个。每页2列,然后创建新页面,依此类推。这是当前的输出。 currentoutput

这是一个模型,说明当有更多数据时我想要它的样子。如果超过30个项目,则需要创建新页面。 whatIneedittolooklike

控制器中的代码

[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()
            };
        }

    }

1 个答案:

答案 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只是让你开始的猜测。表标题缺失。