From 518e3182b2e517d4fbcaf8accfc14f5bdbe26316 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 29 Aug 2013 13:16:59 +0000 Subject: [PATCH] Logic for putting a blank page in the PDF if the procedure prints duplex foldouts --- PROMS/Volian.Print.Library/PromsPrinter.cs | 47 +++++++++++++++++-- .../Volian.Print.Library/VlnSvgPageHelper.cs | 18 ++++++- PROMS/Volian.Print.Library/vlnParagraph.cs | 35 ++++++++++++-- 3 files changed, 93 insertions(+), 7 deletions(-) diff --git a/PROMS/Volian.Print.Library/PromsPrinter.cs b/PROMS/Volian.Print.Library/PromsPrinter.cs index 7469f245..d1b3675f 100644 --- a/PROMS/Volian.Print.Library/PromsPrinter.cs +++ b/PROMS/Volian.Print.Library/PromsPrinter.cs @@ -85,6 +85,7 @@ namespace Volian.Print.Library } public class PromsPrinter { + private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); public event PromsPrinterStatusEvent StatusChanged; private void OnStatusChanged(object sender, PromsPrintStatusArgs args) { @@ -148,7 +149,13 @@ namespace Volian.Print.Library get { return _OriginalPageBreak; } set { _OriginalPageBreak = value; } } - public PromsPrinter(ItemInfo myItem, string rev, string watermark, bool debugOutput, bool origPgBrk, string backgroundFolder, bool openPDF, bool overWrite, ChangeBarDefinition cbd, String pdfFile) + private bool _InsertBlankPages; + public bool InsertBlankPages + { + get { return _InsertBlankPages; } + set { _InsertBlankPages = value; } + } + public PromsPrinter(ItemInfo myItem, string rev, string watermark, bool debugOutput, bool origPgBrk, string backgroundFolder, bool openPDF, bool overWrite, ChangeBarDefinition cbd, String pdfFile, bool insertBlankPages) { _MyItem = myItem; _Rev = rev; @@ -160,6 +167,7 @@ namespace Volian.Print.Library _MyChangeBarDefinition = cbd; _PDFFile = pdfFile; _OriginalPageBreak = origPgBrk; + _InsertBlankPages = insertBlankPages; } public string Print(string pdfFolder) { @@ -280,6 +288,11 @@ namespace Volian.Print.Library //private static PdfReader _MyFoldoutReader = null; //private static SectionInfo _MyFoldoutSection = null; private static List _MyFoldoutReader = null; + public static List MyFoldoutReader + { + get { return PromsPrinter._MyFoldoutReader; } + set { PromsPrinter._MyFoldoutReader = value; } + } private static List _MyFoldoutSection = null; private string Print(ProcedureInfo myProcedure, string pdfFolder) { @@ -360,6 +373,7 @@ namespace Volian.Print.Library if (cb == null) return null; OnStatusChanged("Before NewPage", PromsPrinterStatusType.Before); cb.PdfDocument.NewPage(); // Start of print + //_MyLog.InfoFormat("NewPage 1 {0}", cb.PdfWriter.CurrentPageNumber); OnStatusChanged("After NewPage", PromsPrinterStatusType.NewPage); if (myProcedure.Sections == null) { @@ -461,6 +475,15 @@ namespace Volian.Print.Library ItemInfo firstStep = mySection.Steps[0]; if (firstStep.FoldoutIndex() > -1) DoFoldoutPage(cb, "Beginning of Step Section", _TextLayer, _MyHelper, firstStep.FoldoutIndex()); + else if (!_MyHelper.CreatingFoldoutPage && _MyFoldoutReader.Count > 0 && InsertBlankPages) + { + // only insert a blank page if this section does not have a foldout (but the procedure as a whole does) + // and the checkbox on the print dialog to add blank pages is checked + _MyHelper.OnBlankPage = true; + cb.PdfDocument.Add(new iTextSharp.text.Table(1)); + cb.PdfDocument.NewPage(); + //_MyLog.InfoFormat("NewPage Begin Step Sect blank {0}", cb.PdfWriter.CurrentPageNumber); + } } CreateStepPdf(mySection, cb); } @@ -475,6 +498,7 @@ namespace Volian.Print.Library { PrintTextMessage(cb, "No Proms Output", _TextLayer); cb.PdfDocument.NewPage(); // only have 16bit pages left (for DebugMode) + //_MyLog.InfoFormat("NewPage 2 {0}", cb.PdfWriter.CurrentPageNumber); DebugPagination.WriteLine("{0:D6},'{1}'", _MyHelper.MyPdfContentByte.PdfWriter.CurrentPageNumber, "No PROMS Output"); } @@ -547,6 +571,15 @@ namespace Volian.Print.Library OnStatusChanged("Read MSWord", PromsPrinterStatusType.ReadMSWord); if (doimport2) { + if (cb.PdfWriter.CurrentPageNumber > 1 && _MyFoldoutReader.Count > 0 && InsertBlankPages) + { + // only insert a blank page if this section does not have a foldout (but the procedure as a whole does) + // and the checkbox on the print dialog to add blank pages is checked + _MyHelper.OnBlankPage = true; + cb.PdfDocument.Add(new iTextSharp.text.Table(1)); + cb.PdfDocument.NewPage(); + //_MyLog.InfoFormat("NewPage 3 blank {0}", cb.PdfWriter.CurrentPageNumber); + } float yoff = 0; if (_MyHelper.DidFirstPageDocStyle) yoff = origYoff - (float)mySection.MyDocStyle.Layout.TopMargin; AddImportedPageToLayer(cb.PdfWriter.DirectContent, _MSWordLayer, fgPage, (float)(mySection.MyDocStyle.Layout.MSWordXAdj??0), (float)(mySection.MyDocStyle.Layout.MSWordYAdj??0)+yoff); @@ -578,6 +611,7 @@ namespace Volian.Print.Library else _MyHelper.IsLandscape = false; cb.PdfDocument.NewPage(); // Word Document + //_MyLog.InfoFormat("NewPage 3 {0}", cb.PdfWriter.CurrentPageNumber); // if this document style has another style that is for pages other than first, we need to // reset the document style off of this section AND reset docstyle values used. @@ -591,6 +625,7 @@ namespace Volian.Print.Library catch (Exception ex) { cb.PdfDocument.NewPage(); // can we put out 'error on page'? + _MyLog.InfoFormat("NewPage error on page {0}", cb.PdfWriter.CurrentPageNumber); } } private void GenerateTOC(SectionInfo tocSection, ProcedureInfo myProcedure, PdfContentByte cb, PdfLayer textLayer) @@ -606,6 +641,7 @@ namespace Volian.Print.Library AddSectionToTOC(tocSection, procItem, tOfC, cb, yTopMargin, 0); if (textLayer != null) cb.EndLayer(); cb.PdfDocument.NewPage(); + //_MyLog.InfoFormat("NewPage 4 {0}", cb.PdfWriter.CurrentPageNumber); _NoBreakYOffset = 0; } float lastyLocation = 0; @@ -677,6 +713,7 @@ namespace Volian.Print.Library if (retval == 0) // do a newpage, it couldn't fit on current page. { cb.PdfDocument.NewPage(); + //_MyLog.InfoFormat("NewPage 5 {0}", cb.PdfWriter.CurrentPageNumber); yLocation = 0; retval = Rtf2Pdf.TextAt(cb, myparagraphn, leftMargin + secNumPos + indentOffset, yPageStart - yLocation, width * 1.3F, height, "", yBottomMargin); } @@ -810,6 +847,7 @@ namespace Volian.Print.Library if (sp == SectionConfig.SectionPagination.Separate) { cb.PdfDocument.NewPage(); // end of step section + //_MyLog.InfoFormat("NewPage 6 {0}", cb.PdfWriter.CurrentPageNumber); _NoBreakYOffset = 0; yPageStart = yTopMargin; } @@ -836,6 +874,7 @@ namespace Volian.Print.Library cb.Circle(400, 100, 50); PrintTextMessage(cb, "Foldout for: " + str, textLayer); cb.PdfDocument.NewPage(); // Temporary for foldout/16bit-32bit page alignment + //_MyLog.InfoFormat("NewPage 7 {0}", cb.PdfWriter.CurrentPageNumber); } public static void DoFoldoutPage(PdfContentByte cb, string str, PdfLayer textLayer, VlnSvgPageHelper myPageHelper, int foldoutindx) { @@ -848,7 +887,7 @@ namespace Volian.Print.Library bool doimport2 = true; PdfImportedPage fgPage = null; try - { + { // read saved foldout page fgPage = cb.PdfWriter.GetImportedPage(_MyFoldoutReader[foldoutindx],1); } catch (Exception ex) @@ -857,14 +896,16 @@ namespace Volian.Print.Library doimport2 = false; } if (doimport2) - { + {// put the saved foldout page into the PDF AddImportedPageToLayer(cb.PdfWriter.DirectContent, textLayer, fgPage, 0, 0); DebugPagination.WriteLine("{0:D6},'{1}',{2}", myPageHelper.MyPdfContentByte.PdfWriter.CurrentPageNumber, "Foldout", 1); } } + //_MyLog.InfoFormat("DoFoldoutPage {0}", cb.PdfWriter.CurrentPageNumber); //PrintTextMessage(cb, "Foldout for: " + str, textLayer); cb.PdfDocument.NewPage(); // Temporary for foldout/16bit-32bit page alignment + //_MyLog.InfoFormat("NewPage 8 {0}", cb.PdfWriter.CurrentPageNumber); myPageHelper.MySection = saveSect; myPageHelper.OnFoldoutPage = false; } diff --git a/PROMS/Volian.Print.Library/VlnSvgPageHelper.cs b/PROMS/Volian.Print.Library/VlnSvgPageHelper.cs index ad7215e8..233c66e1 100644 --- a/PROMS/Volian.Print.Library/VlnSvgPageHelper.cs +++ b/PROMS/Volian.Print.Library/VlnSvgPageHelper.cs @@ -92,9 +92,25 @@ namespace Volian.Print.Library AddBookmarks(writer); MyPageCounts.DrawTemplates(); } + private bool _OnBlankPage = false; + public bool OnBlankPage // used while inserting a blank page when printing a procedure with duplex foldouts + { + get { return _OnBlankPage; } + set { _OnBlankPage = value; } + } + private bool _AddBlankPagesForDuplexPrinting = false; + public bool AddBlankPagesForDuplexPrinting // Tells us if a the option to add a blank page is turn on (for procedures with duplex foldouts) + { + get { return _AddBlankPagesForDuplexPrinting; } + set { _AddBlankPagesForDuplexPrinting = value; } + } public override void OnEndPage(PdfWriter writer, iTextSharp.text.Document document) { - if (!OnFoldoutPage) + if (OnBlankPage) + { + OnBlankPage = false; + } + else if (!OnFoldoutPage) { if (DidFirstPageDocStyle) ResetDocStyleAndValues(); AddBookmarks(writer); diff --git a/PROMS/Volian.Print.Library/vlnParagraph.cs b/PROMS/Volian.Print.Library/vlnParagraph.cs index c9080cda..2ce2e0d0 100644 --- a/PROMS/Volian.Print.Library/vlnParagraph.cs +++ b/PROMS/Volian.Print.Library/vlnParagraph.cs @@ -654,6 +654,7 @@ namespace Volian.Print.Library string tmpstr = null; SectionInfo si = SectionInfo.Get(MyItemInfo.ItemID); cb.PdfDocument.NewPage(); + //_MyLog.InfoFormat("NewPage 9 {0}", cb.PdfWriter.CurrentPageNumber); MyPageHelper.MyPromsPrinter.CreateWordDocPdf(cb, si, ref tmp, ref tmpstr); Processed = true; return yPageStart; @@ -678,7 +679,8 @@ namespace Volian.Print.Library case 1: // Break on High Level Step OutputOtherPageSteps(cb, YTopMost, yPageStart, yTopMargin, yBottomMargin); cb.PdfDocument.NewPage(); - if(MyItemInfo.IsSection || (MyItemInfo.IsHigh && MyItemInfo.MyPrevious != null)) //do not reset for 1st step + //_MyLog.InfoFormat("NewPage 10 {0}", cb.PdfWriter.CurrentPageNumber); + if (MyItemInfo.IsSection || (MyItemInfo.IsHigh && MyItemInfo.MyPrevious != null)) //do not reset for 1st step ResetDocStyleAndValues(ref yTopMargin, ref yBottomMargin); DebugText.WriteLine("Paginate1"); if (MyItemInfo.IsSection) @@ -687,8 +689,17 @@ namespace Volian.Print.Library MyPageHelper.PageBookmarks.Add(MyItemInfo, ((si.DisplayNumber ?? "") == "" ? "" : si.DisplayNumber + " - ") + si.DisplayText, null); } // Only do foldout page if not done for section break, i.e. check the there's a previous step. - if (MyItemInfo.MyPrevious != null && MyItemInfo.FoldoutIndex()>-1) + if (MyItemInfo.MyPrevious != null && MyItemInfo.FoldoutIndex() > -1) PromsPrinter.DoFoldoutPage(cb, "HLS", MyPageHelper.TextLayer, MyPageHelper, MyItemInfo.FoldoutIndex()); + else if (PromsPrinter.MyFoldoutReader.Count > 0 && MyPageHelper.MyPromsPrinter.InsertBlankPages) + { + // insert a blank page if this step section had a foldout associated and the checkbox + // on the print dialog, to add blank pages, is checked + MyPageHelper.OnBlankPage = true; + cb.PdfDocument.Add(new iTextSharp.text.Table(1)); + cb.PdfDocument.NewPage(); + //_MyLog.InfoFormat("NewPage 10 blank {0}", cb.PdfWriter.CurrentPageNumber); + } yPageStart = yTopMargin + YTopMost; DoCheckOffHeader(cb, MyItemInfo, yLocation, yTopMargin, yPageStart); @@ -737,10 +748,18 @@ namespace Volian.Print.Library MyPageHelper.BottomMessage = new vlnText(cb, this, myMsg, myMsg, docstyle.Layout.LeftMargin + XOffsetBox + docstyle.Continue.Bottom.Margin ?? 0, msg_yLocation, docstyle.Continue.Bottom.Font);// MyItemInfo.ActiveFormat.PlantFormat.FormatData.Font); } cb.PdfDocument.NewPage(); + //_MyLog.InfoFormat("NewPage 11 {0}", cb.PdfWriter.CurrentPageNumber); ResetDocStyleAndValues(ref yTopMargin, ref yBottomMargin); DebugText.WriteLine("Paginate2"); - if (MyItemInfo.MyHLS.FoldoutIndex()>-1) + if (MyItemInfo.MyHLS.FoldoutIndex() > -1) PromsPrinter.DoFoldoutPage(cb, "Break within Step", MyPageHelper.TextLayer, MyPageHelper, MyItemInfo.MyHLS.FoldoutIndex()); // temporary foldout + else if (PromsPrinter.MyFoldoutReader.Count > 0 && MyPageHelper.MyPromsPrinter.InsertBlankPages) + { + MyPageHelper.OnBlankPage = true; + cb.PdfDocument.Add(new iTextSharp.text.Table(1)); + cb.PdfDocument.NewPage(); + _MyLog.InfoFormat("NewPage Break within step blank {0}", cb.PdfWriter.CurrentPageNumber); + } // if there is a 'container vlnbox' around the HLS, flag that the drawn box must also break: if (MyHighLevelParagraph != null && MyHighLevelParagraph.PartsContainer != null && MyHighLevelParagraph.PartsContainer.Count > 0) @@ -793,6 +812,7 @@ namespace Volian.Print.Library { OutputOtherPageSteps(cb, YTopMost, yPageStart, yTopMargin, yBottomMargin); cb.PdfDocument.NewPage(); // HLS (7 lpi) breakif (MyItemInfo.IsSection) + //_MyLog.InfoFormat("NewPage 12 {0}", cb.PdfWriter.CurrentPageNumber); ResetDocStyleAndValues(ref yTopMargin, ref yBottomMargin); DebugText.WriteLine("Paginate3"); if (MyItemInfo.IsSection) @@ -802,6 +822,15 @@ namespace Volian.Print.Library } if (MyItemInfo.FoldoutIndex() > -1) PromsPrinter.DoFoldoutPage(cb, "HLS (7 lpi) break", MyPageHelper.TextLayer, MyPageHelper, MyItemInfo.FoldoutIndex()); + else if (PromsPrinter.MyFoldoutReader.Count > 0 && MyPageHelper.MyPromsPrinter.InsertBlankPages) + { + // insert a blank page if this step section had a foldout associated and the checkbox + // on the print dialog, to add blank pages, is checked + MyPageHelper.OnBlankPage = true; + cb.PdfDocument.Add(new iTextSharp.text.Table(1)); + cb.PdfDocument.NewPage(); + //_MyLog.InfoFormat("NewPage 12 lpi blank {0}", cb.PdfWriter.CurrentPageNumber); + } // If "ContinueSectionHeader" (format flag) is true then print the section title with "(Continued)" appended to it if (!MyItemInfo.IsSection && MyItemInfo.ActiveFormat.PlantFormat.FormatData.SectData.StepSectionData.ContinueSectionHeader)