1

まず、私のコードは次のとおりです。

                    string pdfTemplate = Application.StartupPath + "\\Templates\\Template Medico.pdf";
                    string newFile = Application.StartupPath + "\\Relatórios\\Relatório Médico_" + dataArquivo + ".pdf";

                    PdfReader pdfReader = new PdfReader(pdfTemplate);
                    PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFile, FileMode.Create));

                    AcroFields pdfFormFields = pdfStamper.AcroFields;

                    // Form Filling
                    pdfFormFields.SetField("data", data);
                    pdfFormFields.SetField("medico_nome", campo);
                    pdfFormFields.SetField("numero_consultas", numeroConsultas);

                    // Table Building
                    int numColumns = ds.Tables[0].Columns.Count;
                    PdfPTable datatable = new PdfPTable(numColumns);
                    datatable.DefaultCell.Padding = 10;
                    datatable.WidthPercentage = 100; 
                    datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_LEFT;
                    float[] columnWidths = { 80, 80, 80, 80, 80, 80, 80, 80, 80 };
                    datatable.SetWidths(columnWidths);
                    float[] totalWidth = { 80, 80, 80, 80, 80, 80, 80, 80, 80 };
                    datatable.SetTotalWidth(totalWidth);

                    // Table Header
                    for (int k = 0; k < ds.Tables[0].Columns.Count; k++)
                    {
                        Phrase collumname = new Phrase(ds.Tables[0].Columns[k].ColumnName, FontFactory.GetFont("Verdana", 9));
                        datatable.AddCell(collumname);
                    }
                    // Lines and Columns
                    if (ds.Tables[0].Rows.Count <= 9) // less than 9 rows = no problem, no new pages and table spliting needed
                    {
                        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                        {
                            for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
                            {
                                datatable.DefaultCell.BackgroundColor = iTextSharp.text.BaseColor.WHITE;
                                datatable.DefaultCell.HorizontalAlignment = iTextSharp.text.Element.ALIGN_LEFT;
                                Phrase phrase = new Phrase(ds.Tables[0].Rows[i][j].ToString(), FontFactory.GetFont("Verdana", 9));
                                datatable.AddCell(phrase);
                            }
                        }
                        // Write down the table on page 2
                        PdfContentByte content = pdfStamper.GetUnderContent(2);
                        datatable.WriteSelectedRows(0, -1, 70.0f, 495.0f, content);
                    }
                    else
                    {
                        int newPage = 3;
                        int currentPage = 2;
                        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                        {
                            for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
                            {
                                datatable.DefaultCell.BackgroundColor = iTextSharp.text.BaseColor.WHITE;
                                datatable.DefaultCell.HorizontalAlignment = iTextSharp.text.Element.ALIGN_LEFT;
                                Phrase phrase = new Phrase(ds.Tables[0].Rows[i][j].ToString(), FontFactory.GetFont("Verdana", 9));
                                datatable.AddCell(phrase);
                            }
                            if (i > 0 && i % 9 == 0)
                            {   //How do i print the table ONLY every 9 iterations? (9 iterations = 9 rows)
                                PdfContentByte content = pdfStamper.GetUnderContent(currentPage);
                                // Or how do i make a loop using the rowStart and rowEnd arguments of the
                                // WriteSelectedRows function in order to write only a set of 9 rows for each page?
                                datatable.WriteSelectedRows(0, -1, 70.0f, 495.0f, content);
                                pdfStamper.InsertPage(newPage, pdfReader.GetPageSize(2));
                                newPage++;
                                currentPage++;
                            }
                        }
                    }

コードは、私が現在抱えている主な問題について十分にコメントされていますが、スレッドのタイトルに記載されているように、実際のより大きな問題は、行と列を一致させるためにループ/反復を何とか「分割」または「制御」することですページに移動し、別のページにジャンプして、表を書き続けます。

どんな助けも高く評価されます。

4

2 に答える 2

3

みんな、2日とたくさんのコーヒーを飲みましたが、やりました。コードは次のとおりです。

                else
                {
                    int newPageNumber = 3;
                    int currentPage = 2;
                    int lastLinePrinted = 0;
                    int maxLine = 9;
                    bool lastPage = false;
                    for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                    {
                        for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
                        {
                            datatable.DefaultCell.BackgroundColor = iTextSharp.text.BaseColor.WHITE;
                            datatable.DefaultCell.HorizontalAlignment = iTextSharp.text.Element.ALIGN_LEFT;
                            Phrase phrase = new Phrase(ds.Tables[0].Rows[i][j].ToString(), FontFactory.GetFont("Verdana", 9));
                            datatable.AddCell(phrase);
                        }
                        // must decrement the ds.Tables[0].Rows.Count here, 
                        // otherwise it'll never enter the code below, we'll
                        // increment it back when we reach the last page
                        if ((i > 0 && i % 9 == 0) || i == ds.Tables[0].Rows.Count - 1)
                        {
                            PdfContentByte content = pdfStamper.GetUnderContent(currentPage);
                            datatable.WriteSelectedRows(lastLinePrinted, maxLine, 70.0f, 495.0f, content);
                            if (!lastPage)
                            {
                                pdfStamper.InsertPage(newPage, pdfReader.GetPageSize(2));
                                newPage++;
                                currentPage++;
                                lastLinePrinted = maxLine;
                                maxLine += 9;
                            }
                            if (maxLine > ds.Tables[0].Rows.Count)
                            {
                                maxLine = ds.Tables[0].Rows.Count+1;
                                lastPage = true;
                            }
                        }
                    }
                }

より多くの人に役立つことを願っています:D

于 2012-05-18T04:10:07.053 に答える
1

完全に使用することで簡単に行うことができますWriteSelectedRows

int pageRows=0;    
while (pageRows<datatable.Rows.Count+8)
      {
         content.BeginText();
         table.WriteSelectedRows(pageRows, pageRows+9, 20, 550, cb);
         pageRows = pageRows + 9;
         content.EndText();
         document.NewPage();
       }

一度に 9 行を書き込み、新しいページを呼び出します。

于 2012-06-05T12:33:31.890 に答える