【问题标题】:generating pdf structure on dynamic inputs在动态输入上生成 pdf 结构
【发布时间】:2015-01-08 06:55:07
【问题描述】:

我有动态的行和列。 列:它包含公司详细信息, 行:在特定规模上。 数据:它包含绘制的图表

说明:
我的应用程序中的网格(假设应用程序的行 a_row 和 col a_col),其中 a_col 是公司名称(动态,用户可以添加更多 a_col),a_row 标题包含一些指标。 在 a_row 和 a_col 中包含图表(应用表格式网格包含 rowXcol 格式的图表)
现在 a_row 和 a_col 都是动态的,用户可以添加和删除图表和列。 (pdf abb. as p_row 和 col as p_col 的行)

对于 pdfexport:PdfPTable(3) 是 m 已修复的内容,即每个 a_col 标题将在 pdftable 行中(仅 3 )在 3 之后,将为那些 a_col 标题绘制该 a_row 的图表。

应用:
COL1        COL2 ROW1      chart00       chart01
ROW2      chart10       chart11
ROW3      chart20        chart21

行是应用程序中的指标

PDF 绘图:(请查看图片 - pdf 快照)

代码完成: 它是动态的,因为没有图表(行和列),没有行是要绘制的不同页面。 下面的代码工作正常且准确(根据旧需要)。

创建 PDF:

        page2 = new Paragraph();
        page2.Add(new Chunk(CriteriaAll, CriteriaFONT));
        page2.Alignment = Element.ALIGN_CENTER;
        newtable();
        int j = 0, temp_tablecount = 0, tablecount = 0;
        int checkrcnt = (int)(Math.Ceiling(chartnameLIST.Count / 3.0d)) * 3;  //chartnameList is total charts rowXcol)
        int col_newpg_temp = 1;
        int col_newpg = (int)(Math.Ceiling(col_count / 12.0d)); (col_count is no of col.)
        for (int row_tb = 0; row_tb < row_count; row_tb++)
        {
            col_newpg_temp = 1;
            newpagedatafeed(pdfDoc, Metric[row_tb]);
            newtable();
            tablepg1.AddCell(new Phrase(" ")); tablepg1.AddCell(new Phrase(" ")); tablepg1.AddCell(new Phrase(" "));
            for (int i = 0; i < checkrcnt; i++)
            {
                if (i < col_count)
                {
                    if (i == col_newpg_temp * 12)
                    {
                        pdfDoc.Add(tablepg1);
                        newtable();
                        newpagedatafeed(pdfDoc, Metric[row_tb]);
                        col_newpg_temp++;
                    }
                    tablepg1.AddCell(new Phrase(Companies[i], companiesH));
                }
                else
                    tablepg1.AddCell("");
                j++;
                if (j > 2)
                {
                    j = 0;
                    for (int k = 0; k < 3; k++)
                    {
                        if (temp_tablecount < col_count)
                        {
                            tablepg1.AddCell(ClipImpageProcess(chartnameLIST[tablecount], 8, writer));
                            tablecount++; temp_tablecount++;
                        }
                        else
                            tablepg1.AddCell("");
                    }
                }
            }//coll ends  
            temp_tablecount = 0;
            pdfDoc.Add(tablepg1);
        }
private static void newtable() //adds a new page
    {
        tablepg1 = new PdfPTable(3);
        tablepg1.DefaultCell.Border = 0;
        tablepg1.WidthPercentage = 95;
    }

    private static void newpagedatafeed(Document pdfDoc, string p) //somethng as a header
    {
        pdfDoc.NewPage();
        DrawLine(pdfDoc, writer.DirectContent);
        pdfDoc.Add(page2);
        tablepg1.AddCell(new Phrase(" ")); tablepg1.AddCell(new Phrase(" ")); tablepg1.AddCell(new Phrase(" "));
        p = "\n" + p;
        PdfPTable temptable = new PdfPTable(3);
        temptable.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER;
        temptable.DefaultCell.Border = 0;
        temptable.AddCell(""); temptable.AddCell(new Phrase(p, MetricH)); temptable.AddCell("");
        pdfDoc.Add(temptable);
    }

要做的事情:(新需求)
需要编码帮助,
1. 如果只有 2 或 3 列,那么图表应该在页面中间
2.既然pdf页面上只有很少的图表,那么下一行不应该转到下一页,应该在同一页上绘制。

【问题讨论】:

  • 您的问题存在矛盾,无法回答。你说如果只有2或3列,那么图表应该在页面中间。我假设表格应该水平居中,这是默认的 iText 的行为。然而,你突然开始谈论行,以及应该或不应该分布在不同页面上的表。目前尚不清楚您是在谈论列还是行,也不清楚您是在谈论垂直居中还是水平居中。
  • m 谈论要在中间单元格中绘制的图表,因为 pdf 页面的每一行都表示为 pdfptable(3)。制作表格中心已完成,但我想为上述问题提供动态代码。它应该确保如何绘制 pdf 中的表格行,并且在 x 行(pdf 表格)之后,它应该移动到下一页。
  • 还是不清楚。什么是中间单元格?是 3 列表格的第 2 列中的单元格(水平中间),还是中间行(垂直中间)的单元格。不要指望人们阅读你的代码来找出答案。您发布的代码不是SSCCE,而且很难破译。
  • 我应该向你发送我的要求的快照以及上述代码的输出吗?
  • 不是“发给我”,而是用快照更新您的问题。

标签: c# pdf itextsharp


【解决方案1】:

我将对您的问题做出一些假设。如果假设是错误的,您应该更新您的问题以澄清它。

请查看CenterVertically 示例。在此示例中,我创建了一个包含五行文本的单元格(您有图像而不是文本,但这无关紧要):

PdfPCell cell = new PdfPCell();
for (int i = 1; i <= 5; i++)
     cell.addElement(new Paragraph("Line " + i));

然后我创建两个表。一张三行表,一张十行表。

这是应该适合单个页面的短表:

table = new PdfPTable(1);
table.addCell(cell);
table.addCell(cell);
table.addCell(cell);

这是一个不适合页面的长表,因此应该分布在不同的页面上:

table = new PdfPTable(1);
table.addCell(cell);
table.addCell(cell);
table.addCell(cell);
table.addCell(cell);
table.addCell(cell);
table.addCell(cell);
table.addCell(cell);
table.addCell(cell);
table.addCell(cell);
table.addCell(cell);

如果我正确理解您的问题,您希望前一个表格不要拆分,而是垂直居中。第二个表需要拆分,因为它不适合单个页面。

这是通过使用这两种方法来实现的:

private int status = ColumnText.START_COLUMN;
private float y_position = 0;

public void addTable(Document document, PdfContentByte canvas, PdfPTable table)
    throws DocumentException {
    Rectangle pagedimension = new Rectangle(36, 36, 559, 806);
    drawColumnText(document, canvas, pagedimension, table, true);
    Rectangle rect;
    if (ColumnText.hasMoreText(status)) {
        rect = pagedimension;
    }
    else {
        rect = new Rectangle(36, 36, 559, 806 - ((y_position - 36) / 2));
    }
    drawColumnText(document, canvas, rect, table, false);
}

public void drawColumnText(Document document, PdfContentByte canvas, Rectangle rect, PdfPTable table, boolean simulate)
    throws DocumentException {
    ColumnText ct = new ColumnText(canvas);
    ct.setSimpleColumn(rect);
    ct.addElement(table);
    status = ct.go(simulate);
    y_position = ct.getYLine();
    while (!simulate && ColumnText.hasMoreText(status)) {
        document.newPage();
        ct.setSimpleColumn(rect);
        status = ct.go(simulate);
    }
}

在第一种方法中,我们将 PdfPTable 添加到 A4 Document 中,边距为半英寸:

Rectangle pagedimension = new Rectangle(36, 36, 559, 806);

我们首先在模拟模式下使用第二种方法。这意味着我们假装添加表格,但我们并没有真正添加它,我们只想知道 (1.) 表格是否适合页面 (status),如果适合, (2.) 占用了多少空间 (y_position)。

根据该信息,我们要么使用页面尺寸添加表格(如果表格不适合页面),要么使用垂直居中表格的新尺寸添加表格(如果表格适合页)。

查看生成的 PDF:center_vertically.pdf

此示例向您展示如何找出表格垂直占用的空间。如果这不是您的申请中缺少的链接,请重新表述问题。

【讨论】:

  • 问题已解决,我还更新了 itextsharp。系统 aFOxit Reader 也被感染了,所以它也不能正常工作。我同意我无法澄清,但你的假设是正确的。所有这一切都是边距问题,并作为 center_vertically 解决。抱歉迟到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2017-11-02
  • 2020-08-11
  • 1970-01-01
  • 2018-09-17
相关资源
最近更新 更多