diff --git a/PROMS/Volian.Print.Library/PromsPrinter.cs b/PROMS/Volian.Print.Library/PromsPrinter.cs index 283b8a40..da7026fe 100644 --- a/PROMS/Volian.Print.Library/PromsPrinter.cs +++ b/PROMS/Volian.Print.Library/PromsPrinter.cs @@ -116,7 +116,7 @@ namespace Volian.Print.Library string MSWordFile = null; if (section.MyContent.ContentEntryCount == 1) { - MSWordFile = MSWordToPDF.ToPDFReplaceROs(section, false); + MSWordFile = MSWordToPDF.GetDocPdf(section, PrintOverride.TextColor); OnStatusChanged("MSWord converted to PDF " + MSWordFile, PromsPrinterStatusType.MSWordToPDF); } return MSWordFile; @@ -248,30 +248,33 @@ namespace Volian.Print.Library myPdfFile = BuildMSWordPDF(mySection); readerWord = myPdfFile != null ? new PdfReader(myPdfFile) : null; OnStatusChanged("Get Section", PromsPrinterStatusType.GetSection); - int sectPageCount = (int)(Math.Ceiling(decimal.Parse(mySection.SectionConfig.Section_NumPages))); - for (int ii = 0; ii < sectPageCount; ii++) + if (mySection.SectionConfig.Section_NumPages != "") { - int pageNumber = 1 + ii; - if (readerWord != null) + int sectPageCount = (int)(Math.Ceiling(decimal.Parse(mySection.SectionConfig.Section_NumPages))); + for (int ii = 0; ii < sectPageCount; ii++) { - bool doimport2 = true; - PdfImportedPage fgPage = null; - try + int pageNumber = 1 + ii; + if (readerWord != null) { - fgPage = cb.PdfWriter.GetImportedPage(readerWord, ii + 1); + bool doimport2 = true; + PdfImportedPage fgPage = null; + try + { + fgPage = cb.PdfWriter.GetImportedPage(readerWord, ii + 1); + } + catch (Exception ex) + { + Console.WriteLine(ex); + doimport2 = false; + } + OnStatusChanged("Read MSWord", PromsPrinterStatusType.ReadMSWord); + if (doimport2) AddImportedPageToLayer(cb.PdfWriter.DirectContentUnder, _MSWordLayer, fgPage, 0, 0); + OnStatusChanged("Merge MSWord", PromsPrinterStatusType.MergeMSWord); } - catch (Exception ex) - { - Console.WriteLine(ex); - doimport2 = false; - } - OnStatusChanged("Read MSWord", PromsPrinterStatusType.ReadMSWord); - if (doimport2) AddImportedPageToLayer(cb.PdfWriter.DirectContentUnder, _MSWordLayer, fgPage, 0, 0); - OnStatusChanged("Merge MSWord", PromsPrinterStatusType.MergeMSWord); + OnStatusChanged("Before NewPage", PromsPrinterStatusType.Before); + cb.PdfDocument.NewPage(); + OnStatusChanged("After NewPage", PromsPrinterStatusType.NewPage); } - OnStatusChanged("Before NewPage", PromsPrinterStatusType.Before); - cb.PdfDocument.NewPage(); - OnStatusChanged("After NewPage", PromsPrinterStatusType.NewPage); } } } @@ -390,257 +393,4 @@ namespace Volian.Print.Library return svgText; } } - public static class MSWordToPDF - { - private static LBApplicationClass _MyApp = null; - public static LBApplicationClass MyApp - { - get - { - if (_MyApp == null) - _MyApp = new LBApplicationClass(); - return _MyApp; - } - } - public static string ToPDFReplaceROs(SectionInfo sect, bool openPdf) - { - string fileName = GetFileName(sect); - // TODO: do we want to cache the word pdfs - //if (System.IO.File.Exists(@"C:\Temp\" + fileName + ".pdf")) - // return @"C:\Temp\" + fileName + ".pdf"; - int docStyleIndex = ((int)sect.MyContent.Type) % 10000; - DocStyle myDocStyle = sect.ActiveFormat.PlantFormat.DocStyles.DocStyleList[docStyleIndex]; - PageStyle myPageStyle = myDocStyle.pagestyle; - ProcedureInfo proc = sect.MyProcedure;//sect.ActiveParent as ProcedureInfo; - DocVersionInfo dvi = proc.ActiveParent as DocVersionInfo; - ROFstInfo rofst = dvi.DocVersionAssociations[0].MyROFst; - ROFSTLookup lookup = rofst.ROFSTLookup; - string igPrefix = dvi.DocVersionConfig.RODefaults_graphicsprefix; - string spPrefix = dvi.DocVersionConfig.RODefaults_setpointprefix; - // string AccPageID = string.Format("<{0}-{1}>", accPrefix, roch.appid); - using (DSOFile myFile = new DSOFile(sect.MyContent.MyEntry.MyDocument)) - { - LBDocumentClass myDoc = MyApp.Documents.Open(myFile.FullName); - float newTop = (float)myDocStyle.Layout.TopRow; - float newLeft = (float)myDocStyle.Layout.LeftMargin; - float newLength = (float)myDocStyle.Layout.PageLength; - float newWidth = (float)myDocStyle.Layout.PageWidth; - float oldTop = myDoc.PageSetup.TopMargin; - float oldLeft = myDoc.PageSetup.LeftMargin; - float oldBottom = myDoc.PageSetup.BottomMargin; - float oldRight = myDoc.PageSetup.RightMargin; - float oldHeight = myDoc.PageSetup.PageHeight; - float oldWidth = myDoc.PageSetup.PageWidth; - float newRight = oldWidth - (newWidth + newLeft); - if (newRight < 0) newRight = 0; - float newBottom = oldBottom - newTop; - //Console.WriteLine("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}", newTop, newLeft, newLength, newWidth, oldTop, oldLeft, oldBottom, oldRight,oldHeight,oldWidth); - myDoc.PageSetup.BottomMargin = 0;// 11 * 72 - (newTop + newLength); - myDoc.PageSetup.RightMargin = newRight; - myDoc.PageSetup.LeftMargin = newLeft; - myDoc.PageSetup.TopMargin = newTop; - LBSelection sel = FindRO(); - while (sel != null) - { - string val = lookup.GetROValueByAccPagID(sel.Text, spPrefix, igPrefix); - int? type = lookup.GetROTypeByAccPagID(sel.Text, spPrefix, igPrefix); - if ((int)type == 8) // Image - { - //Console.WriteLine("Image: {0} - {1}", sect.MyContent.Number, sect.MyContent.Text); - bool imageROTokenReplaced = false; - string[] vals = val.Split("\n".ToCharArray()); - ROImageInfo roImage = ROImageInfo.GetByROFstID_FileName(rofst.ROFstID, vals[0]); - if (roImage != null) - { - ROImageFile roImageFile = new ROImageFile(roImage); - float width = 72 * Int32.Parse(vals[3], System.Globalization.NumberStyles.AllowHexSpecifier) / 12.0F; - int lines = Int32.Parse(vals[2], System.Globalization.NumberStyles.AllowHexSpecifier); - float height = 72 * lines / 6.0F; - //sel.MoveEnd(LBWdUnits.wdLine, lines);// The number of lines depends on the third parameter - //sel.EndKey(LBWdUnits.wdLine, true); - //sel.MoveEnd(LBWdUnits.wdCharacter, -1); - //Console.WriteLine("Lines = {0}", lines); - sel.Text = ""; - // TODO: Need to create a temporary file for printing. - // TODO: Need a way to eliminate the temporary file when done printing. - // LBInlineShape shape = sel.InlineShapes.AddPicture(@"C:\Plant\HLP\VEHLP\ro\No1Seal.bmp"); - float x = (float)sel.get_Information(LBWdInformation.wdHorizontalPositionRelativeToPage); - float y = (float)sel.get_Information(LBWdInformation.wdVerticalPositionRelativeToPage); - //LBInlineShape shape = sel.InlineShapes.AddPicture(pngFile); - LBRange myRange = sel.Paragraphs.First.Range; - float yTop = (float)myRange.get_Information(LBWdInformation.wdVerticalPositionRelativeToPage); - LBShape shape = myDoc.Shapes.AddPicture(roImageFile.MyFile.FullName, x, y - yTop, sel.Range); - // LBInlineShape shape = sel.InlineShapes.AddPicture(roImageFile.MyFile.FullName); - //Console.WriteLine("{0} Shape Width {1} Height {2}", val.Replace("\n", "','"), shape.Width, shape.Height); - shape.Width = width; - shape.Height = height; - //Console.WriteLine("{0} Shape Width {1} Height {2}", val.Replace("\n", "','"), shape.Width, shape.Height); - imageROTokenReplaced = true; - } - if (!imageROTokenReplaced) - sel.Text = string.Format("Bad Image Link (Missing Image File:{0})", vals[0]); - } - else if ((int)type == 4) // X-Y Plot - { - val = val.Replace("`", "\xB0"); - //AddInfo("\tRO Found {0} = '{1}'", sel.Text, val); - sel.Text = ""; - //float width = 72 * Int32.Parse(vals[3], System.Globalization.NumberStyles.AllowHexSpecifier) / 12.0F; - //float height = 72 * lines / 6.0F; - string pngFile = @"C:\Temp\XYPlot1.png"; - RectangleF plotRect = CreatePlot(pngFile, val, 600F); - //LBShape shape = myDoc.Shapes.AddPicture(@"C:\Temp\XYPlot.png", 0, 0, sel.Range); - float x = (float)sel.get_Information(LBWdInformation.wdHorizontalPositionRelativeToPage); - float y = (float)sel.get_Information(LBWdInformation.wdVerticalPositionRelativeToPage); - //LBInlineShape shape = sel.InlineShapes.AddPicture(pngFile); - LBRange myRange = sel.Paragraphs.First.Range; - float yTop = (float)myRange.get_Information(LBWdInformation.wdVerticalPositionRelativeToPage); - float xAdjust = -29.3F; // TODO: Check this value - float yAdjust = 9.1F; // TODO: Check this value - LBShape shape = myDoc.Shapes.AddPicture(pngFile, x + xAdjust + plotRect.X, yAdjust + y - yTop + plotRect.Y, sel.Range); - //Console.WriteLine(",{0},{1},{2},{3}", x, y - yTop, xAdjust,yAdjust); - shape.LockAspectRatio = LBMsoTriState.msoTrue; - //shape.Width = .89F * shape.Width; - //shape.Width = float.Parse(tbAdjust.Text) * shape.Width; - shape.Width = plotRect.Width; - //shape.Height = .89F * shape.Height; - sel.WholeStory(); - // TODO: Do we want to color code ROs - //sel.Range.Font.Color = LBWdColor.wdColorRed; - //Console.WriteLine("{0} Shape Width {1} Height {2}", val.Replace("\n", "','"), shape.Width, shape.Height); - //shape.Width = width; - //shape.Height = height; - //Console.WriteLine("{0} Shape Width {1} Height {2}", val.Replace("\n", "','"), shape.Width, shape.Height); - //imageROTokenReplaced = true; - } - else - { - val = val.Replace("`", "\xB0"); - //AddInfo("\tRO Found {0} = '{1}'", sel.Text, val); - InsertROValue(sel, val, sect.ActiveFormat.PlantFormat.FormatData.ROData.UpRoIfPrevUpper); - } - sel = FindRO(); - } - sel = MyApp.Selection; - sel.WholeStory(); - sel.Range.Font.Color = (LBWdColor)WordColor(PrintOverride.OverrideTextColor(System.Drawing.Color.Black)); - sel.ParagraphFormat.LineSpacingRule = LBWdLineSpacing.wdLineSpaceExactly; - sel.ParagraphFormat.LineSpacing = 12; - fileName = CreatePDF(fileName, openPdf); - MyApp.ActiveDocument.Close(); - MyApp.Quit(); - _MyApp = null; - return fileName; - } - } - private static int WordColor(System.Drawing.Color color) - { - System.Drawing.Color c1 = System.Drawing.Color.FromArgb(0, color.B, color.G, color.R); - return c1.ToArgb(); - } - private static string GetFileName(SectionInfo sect) - { - string fileName = "Doc " + sect.MyContent.MyEntry.DocID.ToString(); // +" " + (sect.DisplayNumber == "" ? sect.DisplayText : sect.DisplayNumber); - return fileName; - } - private static RectangleF CreatePlot(string pngFile, string xyPlot, float resolution) - { - RectangleF retval = new RectangleF(0, 0, 0, 0); - Form frm = Application.OpenForms[0]; - Graphics grfx = frm.CreateGraphics(); - string emfFile = pngFile.Replace(".png", ".emf"); - Metafile mf = new Metafile(emfFile, grfx.GetHdc()); - grfx.Dispose(); - grfx = Graphics.FromImage(mf); - float dpi = grfx.DpiX; - //grfx.ScaleTransform(resolution / grfx.DpiX, (resolution +1F) / grfx.DpiY); - grfx.ScaleTransform(resolution / grfx.DpiX, resolution / grfx.DpiY); - grfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; - grfx.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; - grfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; - grfx.Clear(System.Drawing.Color.Transparent); - XYPlots.XYPlot.BlackColor = System.Drawing.Color.Red; - XYPlots.XYPlot myPlot = new XYPlots.XYPlot(xyPlot); - myPlot.SetMargins(0, 0, 0, 0); - myPlot.Process(new VG.VGOut_Graphics(grfx)); - grfx.Dispose(); - GraphicsUnit gu = new GraphicsUnit(); - retval = mf.GetBounds(ref gu); - retval.Width *= dpi / resolution; - retval.Height *= dpi / resolution; - retval.X *= dpi / resolution; - retval.Y *= dpi / resolution; - //retval.X = myPlot.Width-retval.Width; - //AddInfo("{0},{1},{2},{3},{4},{5}", myPlot.Width, myPlot.Height, retval.Width, retval.Height,retval.X,retval.Y); - //Console.Write("{0},{1},{2},{3}", myPlot.Width, myPlot.Height, retval.Width, retval.Height); - mf.Save(pngFile, ImageFormat.Png); - //Console.WriteLine("'pngfile','{0}'", pngFile); - mf.Dispose(); - FileInfo myFile = new System.IO.FileInfo(emfFile); - myFile.Delete(); - return retval; - } - private static void InsertROValue(LBSelection sel, string roValue, bool upRoIfPrevUpper) - { - if (roValue == null) - { - sel.Text = "RO Not Found"; - sel.Font.Color = LBWdColor.wdColorRed; - } - else - { - if (upRoIfPrevUpper && sel.LastWasUpper) roValue = roValue.ToUpper(); - // Convert fortran formatted numbers to scientific notation. - - string tmp = DisplayRO.ConvertFortranFormatToScienctificNotation(roValue); - // Look for superscript or subscript and insert the appropriate commands - //Match roMatch = Regex.Match(tmp, @"(.*?)\\(super|sub) (.*?)\\nosupersub "); - Match roMatch = Regex.Match(tmp, @"(.*?)\\(up3|dn3) (.*?)\\(up0|dn0) "); - if (roMatch.Groups.Count == 4)// Superscript or subscript found - { - sel.Font.Color = LBWdColor.wdColorRed; - while (roMatch.Groups.Count == 4) - { - sel.TypeText(roMatch.Groups[1].Value); // output the text preceeding the super or sub command - sel.Font.Position = roMatch.Groups[2].Value == "up3" ? 2 : -2; // Shift the vertical position for super or sub - //sel.Font.Position = roMatch.Groups[2].Value == "super" ? 2 : -2; // Shift the vertical position for super or sub - sel.TypeText(roMatch.Groups[3].Value); // output the superscript or subscript - sel.Font.Position = 0; // restore the vertical position - tmp = tmp.Substring(roMatch.Length); // remove the processed text - //roMatch = Regex.Match(tmp, @"(.*?)\\(super|sub) (.*?)\\nosupersub "); // check to see if the text contain another super or sub - roMatch = Regex.Match(tmp, @"(.*?)\\(up3|dn3) (.*?)\\(up0|dn0) "); // check to see if the text contain another super or sub - } - if(tmp != "")// Add any remaining text - sel.TypeText(tmp); - sel.Font.Color = LBWdColor.wdColorAutomatic; - } - else // if no superscripts or subscripts just output the text - { - sel.Text = roValue; - sel.Font.Color = LBWdColor.wdColorRed; - } - } - } - private static LBSelection FindRO() - { - LBSelection sel = MyApp.Selection; - LBFind find = sel.Find; - find.ClearFormatting(); - find.Text = "[<](?@)-(?@)[>]"; - //find.Wrap = LBWdFindWrap.wdFindStop; - find.Wrap = LBWdFindWrap.wdFindContinue; - find.MatchCase = false; - find.MatchWholeWord = false; - find.MatchWildcards = true; - find.MatchSoundsLike = false; - find.MatchAllWordForms = false; - if (find.Execute()) return sel; - return null; - } - private static string CreatePDF(string fileName, bool openPdf) - { - return MyApp.CreatePDF(@"C:\Temp\" + fileName + ".pdf", openPdf); - } - - } } diff --git a/PROMS/Volian.Print.Library/VlnSvgPageHelper.cs b/PROMS/Volian.Print.Library/VlnSvgPageHelper.cs index 7ed043a0..57665193 100644 --- a/PROMS/Volian.Print.Library/VlnSvgPageHelper.cs +++ b/PROMS/Volian.Print.Library/VlnSvgPageHelper.cs @@ -56,15 +56,26 @@ namespace Volian.Print.Library } public override void OnCloseDocument(PdfWriter writer, iTextSharp.text.Document document) { + AddBookmarks(writer); MyPageCounts.DrawTemplates(); } public override void OnEndPage(PdfWriter writer, iTextSharp.text.Document document) { + AddBookmarks(writer); MyPageCounts.CanIncrement = true; base.OnEndPage(writer, document); DrawChangeBars(writer.DirectContent); DrawMessages(writer.DirectContent); } + private void AddBookmarks(PdfWriter writer) + { + if (MySectionTitle != null) + { + PdfDestination dest = new PdfDestination(PdfDestination.FIT); + PdfOutline outline = new PdfOutline(writer.DirectContent.RootOutline, dest, MySectionTitle, false); + MySectionTitle = null; + } + } private void DrawMessages(PdfContentByte cb) { if (TopMessage != null) @@ -114,9 +125,16 @@ namespace Volian.Print.Library set { _MySection = value; + MySectionTitle = (_MySection.DisplayNumber == null ? "" : _MySection.DisplayNumber + " - ") + _MySection.DisplayText; MySvg = BuildSvg(_MySection); } } + private string _MySectionTitle; + public string MySectionTitle + { + get { return _MySectionTitle; } + set { _MySectionTitle = value; } + } private int _MaxRNO; public int MaxRNO { diff --git a/PROMS/Volian.Print.Library/vlnBox.cs b/PROMS/Volian.Print.Library/vlnBox.cs index a3fe9a01..d926dccd 100644 --- a/PROMS/Volian.Print.Library/vlnBox.cs +++ b/PROMS/Volian.Print.Library/vlnBox.cs @@ -59,22 +59,22 @@ namespace Volian.Print.Library } else { + float lineThickness = 0; switch (MyBox.BoxStyle) { case BoxThin: - cb.SetLineWidth(.6F); - cb.Rectangle(left, bottom, right - left, Height * MyPageHelper.YMultiplier); + lineThickness = .6F; break; case BoxThick: - float lineThickness = 6; - cb.SetLineWidth(lineThickness); - cb.Rectangle(left+6, bottom + (lineThickness / 2), right - left - 6, (Height - lineThickness) * MyPageHelper.YMultiplier); + lineThickness = 6; break; default: // For other than OHLP/HLP. For those not matching the HLP Boxes throw new Exception("Missing vlnBox handler"); - break; } + const float llxOffset = 3; + cb.SetLineWidth(lineThickness); + cb.Rectangle(left + llxOffset, bottom + (lineThickness / 2), right - left - llxOffset, (Height - lineThickness) * MyPageHelper.YMultiplier); } cb.Stroke(); if (textLayer != null) cb.EndLayer(); diff --git a/PROMS/Volian.Print.Library/vlnParagraph.cs b/PROMS/Volian.Print.Library/vlnParagraph.cs index 7a7e2255..6969e4f2 100644 --- a/PROMS/Volian.Print.Library/vlnParagraph.cs +++ b/PROMS/Volian.Print.Library/vlnParagraph.cs @@ -132,6 +132,8 @@ namespace Volian.Print.Library private float DrawText(PdfContentByte cb, ref float yPageStart, float yTopMargin, float yBottomMargin, ref float yLocation) { float retval = yLocation; + if (MyItemInfo.FormatStepData.CenterOneLineOnly && MyItemInfo.MyPrevious == null && MyItemInfo.NextItem == null && Height<(1.01F*IParagraph.Leading)) + IParagraph.Alignment = Element.ALIGN_CENTER; retval = Rtf2Pdf.TextAt(cb, IParagraph, XOffset, yLocation, Width, 100, PdfDebugText, yBottomMargin); if (retval == 0) // problem occurred - paragraph was not able to be printed on page { // pagination logic needs to be fixed. diff --git a/PROMS/Volian.Svg.Library/iTextSharp.cs b/PROMS/Volian.Svg.Library/iTextSharp.cs index caefd661..d60d1590 100644 --- a/PROMS/Volian.Svg.Library/iTextSharp.cs +++ b/PROMS/Volian.Svg.Library/iTextSharp.cs @@ -523,7 +523,8 @@ namespace Volian.Svg.Library cb.SaveState(); bool fill = FillColor != System.Drawing.Color.Transparent; bool stroke = OutlineWidth.Value != 0F && OutlineColor != System.Drawing.Color.Empty; - iTextSharp.text.Font font = FontFactory.GetFont(Font.Name, scale.M(new SvgMeasurement(Font.SizeInPoints, E_MeasurementUnits.PT))); + int fontStyle = (Font.Bold ? iTextSharp.text.Font.BOLD : 0) + (Font.Italic ? iTextSharp.text.Font.ITALIC : 0); + iTextSharp.text.Font font = FontFactory.GetFont(Font.Name, scale.M(new SvgMeasurement(Font.SizeInPoints, E_MeasurementUnits.PT)), fontStyle); ColumnText ct = new ColumnText(cb); Chunk chk = new Chunk(text, font); float x = scale.X(X); @@ -647,7 +648,7 @@ namespace Volian.Svg.Library public string Watermark { get { return _Watermark; } - set { _Watermark = value.ToUpper()=="NONE"?"":value; } + set { _Watermark = value; } } private int _CurrentPageNumber = 0; public int CurrentPageNumber @@ -746,7 +747,7 @@ namespace Volian.Svg.Library } private void DrawWatermark(PdfContentByte cb) { - if (Watermark.ToLower() == "(none)" || Watermark == "") return; + if (Watermark.ToLower().Contains("none") || Watermark == "") return; cb.SaveState(); if (_WatermarkLayer != null) cb.BeginLayer(_WatermarkLayer); SvgWatermark myWatermark = new SvgWatermark(cb, Watermark, System.Drawing.Color.Blue, .15F);