PDFsharp & MigraDoc Foundation
http://forum.pdfsharp.com/

RenderDocument generates Index out of range error
http://forum.pdfsharp.com/viewtopic.php?f=2&t=4420
Page 1 of 1

Author:  marty.nord [ Wed Feb 22, 2023 12:10 am ]
Post subject:  RenderDocument generates Index out of range error

RenderDocument generates Index out of Range error. How do you troubleshoot? Should I use an older version of PDFSharp? Please advise.

public static Document CreateDownloadableDirectory(long userID, string filePath)
{
// get user info
UserInfo uInfo = UserDAL.GetUserByID(userID);

// Create a new MigraDoc document
Document document = new Document();
document.Info.Title = "www.greenthumbhub.com Direectory";
document.Info.Subject = "www.greenthumbhub.com Direectory";
document.Info.Author = "https://www.greenthumbhub.com";

MigraDoc.DocumentObjectModel.Style style = document.Styles["Normal"];
style.Font.Name = "Verdana";
style.Font.Size = 10;

// Each MigraDoc document needs at least one section.
Section section = document.AddSection();

// Create footer
Paragraph paragraph = section.Footers.Primary.AddParagraph();
paragraph.AddText("www.greenthumbhub.com - Directory.pdf - " + DateTime.Today.ToShortDateString());
paragraph.Format.Font.Size = 10;
paragraph.Format.Alignment = ParagraphAlignment.Center;

// Create the item table
MigraDoc.DocumentObjectModel.Tables.Table tbl = section.AddTable();
tbl.Style = "Table";
tbl.Borders.Color = Color.FromRgb(0, 0, 0);
tbl.Rows.LeftIndent = 0;

// Before you can add a row, you must define the columns
Column column = tbl.AddColumn("6in");
column.Format.Alignment = ParagraphAlignment.Center;

Row row = tbl.AddRow();
row.Format.Alignment = ParagraphAlignment.Center;
string file = filePath + "Images/header-sm.jpg";
row.Cells[0].AddImage(file);
row.Cells[0].Format.Alignment = ParagraphAlignment.Center;
row.Cells[0].VerticalAlignment = VerticalAlignment.Bottom;
row.Cells[0].Borders.Top.Visible = false;
row.Cells[0].Borders.Right.Visible = false;
row.Cells[0].Borders.Left.Visible = false;
row.Cells[0].Borders.Bottom.Visible = false;

string latitude = string.Empty;
string longitude = string.Empty;
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MainDB"].ToString()))
{
conn.Open();
// retrieve latitude and longitude for zip
string sSQL = @"select Latitude, Longitude
from tblZipCodes
where (ZipCode = @ZIP)";
using (SqlCommand command = new SqlCommand(sSQL, conn))
{
command.Parameters.Add("@ZIP", SqlDbType.NVarChar).Value = uInfo.ZIP;
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
latitude = reader["LATITUDE"] == DBNull.Value ? string.Empty : Convert.ToString(reader["LATITUDE"]);
longitude = reader["LONGITUDE"] == DBNull.Value ? string.Empty : Convert.ToString(reader["LONGITUDE"]);
}
}
}

DataTable dtAds = new DataTable();
sSQL = @"select distinct a.ID, a.SiteAddress1, a.SiteAddress2, a.SiteCity, a.SiteState, a.SiteZip, va.Distance
from tblAds a,
(select ads.ID, convert(decimal(5,1),(3959 * acos(cos(radians(@lat)) * cos(radians(z.Latitude)) * cos(radians(z.Longitude) - radians(@long)) + sin(radians(@lat)) * sin(radians(z.Latitude))))) Distance
from tblAds ads Inner Join tblZipCodes z ON ((ads.SiteZip = z.ZipCode) And (3959 * acos(cos(radians(@lat)) * cos(radians(z.Latitude)) * cos(radians(z.Longitude) - radians(@long)) + sin(radians(@lat)) * sin(radians(z.Latitude)))) < @dist)) va
where (a.ID = va.ID) And (a.Status = 3)
Order By va.Distance, a.SiteState, a.SiteCity ";
using (SqlCommand command = new SqlCommand(sSQL, conn))
{
command.Parameters.Add("@lat", SqlDbType.NVarChar).Value = latitude;
command.Parameters.Add("@long", SqlDbType.NVarChar).Value = longitude;
command.Parameters.Add("@dist", SqlDbType.Int).Value = 180;
using (SqlDataAdapter adapter = new SqlDataAdapter(command))
{
adapter.Fill(dtAds);
}
}

foreach (DataRow drAd in dtAds.Rows)
{
MigraDoc.DocumentObjectModel.Tables.Table table = section.AddTable();
table.Style = "Table";
table.Borders.Color = Color.FromRgb(0, 0, 0);
table.Rows.LeftIndent = 0;

// Before you can add a row, you must define the columns
column = table.AddColumn("5in");
column.Format.Alignment = ParagraphAlignment.Left;

column = table.AddColumn("1in");
column.Format.Alignment = ParagraphAlignment.Center;

string siteAddress = "<b>Site Address:</b><br />";
if (!string.IsNullOrWhiteSpace(drAd["SITEADDRESS2"].ToString()))
{
siteAddress += drAd["SITEADDRESS1"].ToString() + "<br />" + drAd["SITEADDRESS2"].ToString() + "<br />";
}
else
{
siteAddress += drAd["SITEADDRESS1"].ToString() + "<br />";
}
siteAddress += drAd["SITECITY"].ToString() + ", " + drAd["SITESTATE"].ToString() + " " + drAd["SITEZIP"].ToString() + "<br />";
siteAddress += "<b>Ad Link:</b><br />https://www.greenthumbhub.com/ViewAd.aspx?ID=" + drAd["ID"].ToString() + "";

DataTable dtFruit = new DataTable();
DataTable dtVegetables = new DataTable();
DataTable dtHerbs = new DataTable();
DataTable dtNuts = new DataTable();
DataTable dtMisc = new DataTable();

DataTable dtItems = AdDAL.GetCurrentItemsForAdDisplayCategory(Convert.ToInt64(drAd["ID"]));
DataRow[] drItems;

drItems = dtItems.Select("ItemCatID = " + GreenThumbConstants.ITEM_CAT_FRUIT.ToString(), "Name Asc");
if (drItems.Length > 0)
{
dtFruit = drItems.CopyToDataTable();
}

drItems = dtItems.Select("ItemCatID = " + GreenThumbConstants.ITEM_CAT_VEGETABLES.ToString(), "Name Asc");
if (drItems.Length > 0)
{
dtVegetables = drItems.CopyToDataTable();
}

drItems = dtItems.Select("ItemCatID = " + GreenThumbConstants.ITEM_CAT_HERBS.ToString(), "Name Asc");
if (drItems.Length > 0)
{
dtHerbs = drItems.CopyToDataTable();
}

drItems = dtItems.Select("ItemCatID = " + GreenThumbConstants.ITEM_CAT_NUTS.ToString(), "Name Asc");
if (drItems.Length > 0)
{
dtNuts = drItems.CopyToDataTable();
}

drItems = dtItems.Select("ItemCatID = " + GreenThumbConstants.ITEM_CAT_MISC.ToString(), "Name Asc");
if (drItems.Length > 0)
{
dtMisc = drItems.CopyToDataTable();
}
string item = string.Empty;
string sProduce = string.Empty;
if (dtFruit.Rows.Count > 0)
{
sProduce = "<b>Fruit:</b><br/>";
foreach (DataRow dr in dtFruit.Rows)
{
item = string.IsNullOrWhiteSpace(dr["Name"].ToString()) ? string.Empty : dr["Name"].ToString();
if (!string.IsNullOrWhiteSpace(item))
sProduce += string.Format("{0}, ", item);
}
sProduce = sProduce.Remove(sProduce.Length - 2, 2);
sProduce += "<br />";
}
if (dtVegetables.Rows.Count > 0)
{
sProduce += "<b>Vegetables:</b><br/>";
foreach (DataRow dr in dtVegetables.Rows)
{
item = string.IsNullOrWhiteSpace(dr["Name"].ToString()) ? string.Empty : dr["Name"].ToString();
if (!string.IsNullOrWhiteSpace(item))
sProduce += string.Format("{0}, ", item);
}
sProduce = sProduce.Remove(sProduce.Length - 2, 2);
sProduce += "<br />";
}
if (dtHerbs.Rows.Count > 0)
{
sProduce += "<b>Herbs:</b><br/>";
foreach (DataRow dr in dtHerbs.Rows)
{
item = string.IsNullOrWhiteSpace(dr["Name"].ToString()) ? string.Empty : dr["Name"].ToString();
if (!string.IsNullOrWhiteSpace(item))
sProduce += string.Format("{0}, ", item);
}
sProduce = sProduce.Remove(sProduce.Length - 2, 2);
sProduce += "<br />";
}
if (dtNuts.Rows.Count > 0)
{
sProduce += "<b>Nuts:</b><br/>";
foreach (DataRow dr in dtNuts.Rows)
{
item = string.IsNullOrWhiteSpace(dr["Name"].ToString()) ? string.Empty : dr["Name"].ToString();
if (!string.IsNullOrWhiteSpace(item))
sProduce += string.Format("{0}, ", item);
}
sProduce = sProduce.Remove(sProduce.Length - 2, 2);
sProduce += "<br />";
}
if (dtMisc.Rows.Count > 0)
{
sProduce += "<b>Other Items:</b><br/>";
foreach (DataRow dr in dtMisc.Rows)
{
item = string.IsNullOrWhiteSpace(dr["Name"].ToString()) ? string.Empty : dr["Name"].ToString();
if (!string.IsNullOrWhiteSpace(item))
sProduce += string.Format("{0}, ", item);
}
sProduce = sProduce.Remove(sProduce.Length - 2, 2);
sProduce += "<br />";
}

AdsInfo aInfo = AdDAL.GetAdByID(Convert.ToInt64(drAd["ID"]));

row = table.AddRow();
row.Format.Alignment = ParagraphAlignment.Center;
row.Cells[0].AddParagraph(siteAddress);
row.Cells[0].Format.Alignment = ParagraphAlignment.Left;
row.Cells[0].VerticalAlignment = VerticalAlignment.Bottom;
row.Cells[1].AddParagraph("<b>Distance:</b><br />" + drAd["Distance"].ToString());
row.Cells[1].Format.Alignment = ParagraphAlignment.Center;
row.Cells[1].VerticalAlignment = VerticalAlignment.Bottom;
row.Cells[1].MergeDown = 3;

row = table.AddRow();
row.Format.Alignment = ParagraphAlignment.Center;
row.Cells[0].AddParagraph(sProduce);
row.Cells[0].Format.Alignment = ParagraphAlignment.Left;
row.Cells[0].VerticalAlignment = VerticalAlignment.Bottom;

row = table.AddRow();
row.Format.Alignment = ParagraphAlignment.Center;
row.Cells[0].AddParagraph("<b>Description:</b><br />" + aInfo.DESCRIPTION);
row.Cells[0].Format.Alignment = ParagraphAlignment.Left;
row.Cells[0].VerticalAlignment = VerticalAlignment.Bottom;
}
}
return document;

}

Author:  TH-Soft [ Wed Feb 22, 2023 10:35 am ]
Post subject:  Re: RenderDocument generates Index out of range error

marty.nord wrote:
Should I use an older version of PDFSharp?
Definitely maybe.

Would be good to know which version you are using. Would be good to see error details. Would be good if we could replicate the issue.
See also:
http://forum.pdfsharp.net/viewtopic.php?f=2&t=832

Author:  marty.nord [ Wed Feb 22, 2023 11:24 am ]
Post subject:  Re: RenderDocument generates Index out of range error

I was able to figure out the issue.

For some reason, I had to change MergeDown from 3 to 2 which seems weird to me. After I made this change, it no longer generated an error.

I thought MergeDown included the existing cell that you are in just like a colspan does in HTML.

You may close this issue.

Thank you,
Marty

Page 1 of 1 All times are UTC
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/