diff --git a/PROMS/Volian.Print.Library/PDFReport.cs b/PROMS/Volian.Print.Library/PDFReport.cs index add45bc4..be6dcefb 100644 --- a/PROMS/Volian.Print.Library/PDFReport.cs +++ b/PROMS/Volian.Print.Library/PDFReport.cs @@ -195,23 +195,10 @@ namespace Volian.Print.Library public void Build() { iTextSharp.text.Document document = new iTextSharp.text.Document(PageSize.LETTER, 36, 36, 36, 36); + if (!CreateResultsPDF(document)) return; try { - PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(_FileName, FileMode.Create)); - - // we add some meta information to the document - //document.AddAuthor("Gerald Henson"); - //document.AddSubject("This is the result of a Test."); - document.SetMargins(36, 36, 36, 36); - // step 3: we open the document - document.Open(); BuildTable1(document); - //AddTable(document, 10, 90); - //AddTable(document, 10, 100); - //AddTable(document, 15, 75); - //AddTable(document, 20, 70); - //AddTable(document, 25, 65); - //AddTable(document, 30, 60); } catch (Exception ex) { @@ -226,10 +213,72 @@ namespace Volian.Print.Library } finally { - document.Close(); + if (document.IsOpen()) + { + document.Close(); + System.Diagnostics.Process.Start(_FileName); + } } } /// + /// Attempt to open a file for the PDF output. + /// If the file cannot be opened because it is in use, try adding a suffix + /// If the file cannot be opened for some other reason, display an error message + /// + /// + /// + private bool CreateResultsPDF(iTextSharp.text.Document document) + { + bool result = false; + string suffix = ""; + int i = 0; + // Try to open a file for creating the PDF. + while (result == false) + { + string fileName = _FileName.ToLower().Replace(".pdf", suffix + ".pdf"); + try + { + PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(fileName, FileMode.Create)); + document.SetMargins(36, 36, 36, 36); + document.Open(); + _FileName = fileName; + result = true; + } + catch (System.IO.IOException exIO) + { + + if (exIO.Message.Contains("because it is being used by another process")) + suffix = string.Format("_{0}", ++i);// If this file is in use, increment the suffix and try again + else // If some other error, display a message and don't print the results + { + ShowException(exIO); + return false; + } + } + catch (Exception ex) + { + ShowException(ex); + return false; // Could not open the output file + } + } + return true; + } + private static void ShowException(Exception ex) + { + Console.WriteLine("{0} - {1}", ex.GetType().Name, ex.Message); + StringBuilder msg = new StringBuilder(); + string sep = ""; + string indent = ""; + while (ex != null) + { + msg.Append(string.Format("{0}{1}{2}:\r\n{1}{3}", sep, indent, ex.GetType().Name, ex.Message)); + ex = ex.InnerException; + sep = "\r\n"; + indent += " "; + } + System.Windows.Forms.MessageBox.Show(msg.ToString(), "Error during PDF creation for search:", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation); + } + /// /// Use Cells within Cells to see if I can limit the way Cells break from Page to Page /// /// diff --git a/PROMS/Volian.Print.Library/vlnParagraph.cs b/PROMS/Volian.Print.Library/vlnParagraph.cs index c920d500..9396ba3e 100644 --- a/PROMS/Volian.Print.Library/vlnParagraph.cs +++ b/PROMS/Volian.Print.Library/vlnParagraph.cs @@ -772,7 +772,14 @@ namespace Volian.Print.Library if (rnoLevel < maxRNO && itemInfo.RNOs != null) yOffRight = ChildrenRight.Add(cb, itemInfo.RNOs, XOffset + RnoOffset, YTop, YTop, rnoLevel + 1, maxRNO, formatInfo); // Need code to determine if the table will overlap the Right Column if it does then // use YOffRight rather than yoff - if (itemInfo.Tables != null) yoff = ChildrenBelow.Add(cb, itemInfo.Tables, XOffset, yoff, yOffRight, rnoLevel, maxRNO, formatInfo); + if (itemInfo.Tables != null) + { + bool aerTableOrFigure = itemInfo.FormatStepData.Type.Contains("AER"); + if(!aerTableOrFigure && itemInfo.RNOLevel == 0) // Centered Table + yoff = ChildrenBelow.Add(cb, itemInfo.Tables, XOffset, yOffRight, yOffRight, rnoLevel, maxRNO, formatInfo); + else // AER or RNO Table + yoff = ChildrenBelow.Add(cb, itemInfo.Tables, XOffset, yoff, yOffRight, rnoLevel, maxRNO, formatInfo); + } if (itemInfo.Steps != null) yoff = ChildrenBelow.Add(cb, itemInfo.Steps, XOffset, yoff, yOffRight, rnoLevel, maxRNO, formatInfo); if (itemInfo.Sections != null) yoff = ChildrenBelow.Add(cb, itemInfo.Sections, xoff, yoff, yoff, rnoLevel, maxRNO, formatInfo); if (itemInfo.Procedures != null) yoff = ChildrenBelow.Add(cb, itemInfo.Procedures, xoff, yoff, yoff, rnoLevel, maxRNO, formatInfo); @@ -794,17 +801,26 @@ namespace Volian.Print.Library private void CalculateXOffset(ItemInfo itemInfo, int maxRNO, FormatInfo formatInfo) { - bool aerFigure = itemInfo.FormatStepData.Type.Contains("AER"); + bool aerTableOrFigure = itemInfo.FormatStepData.Type.Contains("AER"); vlnParagraph hls1 = MyParent; while (hls1.MyParent != null && !hls1.MyItemInfo.IsHigh) hls1 = hls1.MyParent; XOffset = hls1.XOffset + hls1.Width / 2 - Width / 2; // xoffset if AER column - if (!aerFigure) + int colR = int.Parse(formatInfo.MyStepSectionLayoutData.ColRTable.Split(",".ToCharArray())[itemInfo.ColumnMode]); + float xLowerLimit = 6; // Adjusted for HLP VE-PROMS + float xUpperLimit = hls1.XOffset + hls1.Width + colR * itemInfo.ColumnMode + 18; // Adjusted for HLP VE-PROMS + if (!aerTableOrFigure && itemInfo.RNOLevel == 0) // Centered Table of Figure { // adjust for RNO - int colR = int.Parse(formatInfo.MyStepSectionLayoutData.ColRTable.Split(",".ToCharArray())[itemInfo.ColumnMode]); - XOffset += (colR * maxRNO) / 2; + XOffset += (colR * itemInfo.ColumnMode) / 2; XOffset -= (hls1.XOffset - (float)itemInfo.MyDocStyle.Layout.LeftMargin) / 2; } + else // AER or RNO + XOffset = MyParent.XOffset + MyParent.Width / 2 - Width / 2; + //XOffset += colR * itemInfo.RNOLevel; + if (XOffset < xLowerLimit) + XOffset = xLowerLimit; + if (XOffset + Width > xUpperLimit) + XOffset = xUpperLimit - Width; if (XOffset < (float)itemInfo.MyDocStyle.Layout.LeftMargin) XOffsetBox = (float)itemInfo.MyDocStyle.Layout.LeftMargin; }