1790 lines
78 KiB
C#
1790 lines
78 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using VEPROMS.CSLA.Library;
|
|
using Volian.Svg.Library;
|
|
using iTextSharp.text.factories;
|
|
using iTextSharp.text;
|
|
using iTextSharp.text.pdf;
|
|
using System.Text.RegularExpressions;
|
|
using System.IO;
|
|
using System.Xml;
|
|
using System.Windows.Forms;
|
|
using LBWordLibrary;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using Volian.Controls.Library;
|
|
using Volian.Base.Library;
|
|
|
|
namespace Volian.Print.Library
|
|
{
|
|
public delegate void PromsPrinterStatusEvent(object sender,PromsPrintStatusArgs args);
|
|
public class PromsPrintStatusArgs
|
|
{
|
|
private string _MyStatus;
|
|
public string MyStatus
|
|
{
|
|
get { return _MyStatus; }
|
|
}
|
|
private DateTime _When = DateTime.Now;
|
|
public DateTime When
|
|
{
|
|
get { return _When; }
|
|
}
|
|
private PromsPrinterStatusType _Type;
|
|
public PromsPrinterStatusType Type
|
|
{
|
|
get { return _Type; }
|
|
set { _Type = value; }
|
|
}
|
|
private int _Progress = 0;
|
|
|
|
public int Progress
|
|
{
|
|
get { return _Progress; }
|
|
set { _Progress = value; }
|
|
}
|
|
public PromsPrintStatusArgs(string myStatus, PromsPrinterStatusType type)
|
|
{
|
|
_MyStatus = myStatus;
|
|
_Type = type;
|
|
}
|
|
public PromsPrintStatusArgs(string myStatus, PromsPrinterStatusType type, int progress)
|
|
{
|
|
_MyStatus = myStatus;
|
|
_Type = type;
|
|
_Progress = progress;
|
|
}
|
|
}
|
|
public enum PromsPrinterStatusType
|
|
{
|
|
Start,
|
|
General,
|
|
MSWordToPDF,
|
|
PageList,
|
|
Watermark,
|
|
Read16,
|
|
Merge16,
|
|
Open16,
|
|
ReadMSWord,
|
|
MergeMSWord,
|
|
OpenMSWord,
|
|
OpenPDF,
|
|
Merge,
|
|
Total,
|
|
CloseDocument,
|
|
NewPage,
|
|
BuildSVG,
|
|
SetSVG,
|
|
SetPageEvent,
|
|
GetSection,
|
|
Before,
|
|
BuildStep,
|
|
Progress,
|
|
ProgressSetup,
|
|
LoadVlnParagraph
|
|
}
|
|
public class PromsPrinter
|
|
{
|
|
private bool _SaveLinks = false;
|
|
public bool SaveLinks
|
|
{
|
|
get { return _SaveLinks; }
|
|
set { _SaveLinks = value; }
|
|
}
|
|
private bool _RemoveTrailingHardReturnsAndManualPageBreaks = false;
|
|
public bool RemoveTrailingHardReturnsAndManualPageBreaks
|
|
{
|
|
get { return _RemoveTrailingHardReturnsAndManualPageBreaks; }
|
|
set { _RemoveTrailingHardReturnsAndManualPageBreaks = value; }
|
|
}
|
|
|
|
private string _Prefix = ""; // RHM20150506 Multiline ItemID TextBox
|
|
public string Prefix
|
|
{
|
|
get { return _Prefix; }
|
|
set { _Prefix = value; }
|
|
}
|
|
private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
|
public event PromsPrinterStatusEvent StatusChanged;
|
|
internal void OnStatusChanged(object sender, PromsPrintStatusArgs args)
|
|
{
|
|
if (StatusChanged != null)
|
|
StatusChanged(sender, args);
|
|
}
|
|
internal void OnStatusChanged(string myStatus, PromsPrinterStatusType type)
|
|
{
|
|
OnStatusChanged(this, new PromsPrintStatusArgs(myStatus, type));
|
|
}
|
|
public void OnStatusChanged(string msg)
|
|
{
|
|
OnStatusChanged(this, new PromsPrintStatusArgs(msg, PromsPrinterStatusType.General));
|
|
}
|
|
internal void OnStatusChanged(string myStatus, PromsPrinterStatusType type, int progress)
|
|
{
|
|
OnStatusChanged(this, new PromsPrintStatusArgs(myStatus, type, progress));
|
|
}
|
|
private string _Rev;
|
|
private ItemInfo _MyItem;
|
|
public ItemInfo MyItem
|
|
{
|
|
get { return _MyItem; }
|
|
set { _MyItem = value; }
|
|
}
|
|
private string _Watermark;
|
|
private string _PDFFile;
|
|
public string PDFFile
|
|
{
|
|
get { return _PDFFile; }
|
|
set { _PDFFile = value; }
|
|
}
|
|
private bool _DebugOutput;
|
|
public bool DebugOutput
|
|
{
|
|
get { return _DebugOutput; }
|
|
set { _DebugOutput = value; }
|
|
}
|
|
private string _BackgroundFolder;
|
|
public string BackgroundFolder
|
|
{
|
|
get { return _BackgroundFolder; }
|
|
set { _BackgroundFolder = value; }
|
|
}
|
|
private bool _OpenPDF;
|
|
|
|
public bool OpenPDF
|
|
{
|
|
get { return _OpenPDF; }
|
|
set { _OpenPDF = value; }
|
|
}
|
|
private bool _OverWrite;
|
|
|
|
public bool OverWrite
|
|
{
|
|
get { return _OverWrite; }
|
|
set { _OverWrite = value; }
|
|
}
|
|
private ChangeBarDefinition _MyChangeBarDefinition;
|
|
public ChangeBarDefinition MyChangeBarDefinition
|
|
{
|
|
get { return _MyChangeBarDefinition; }
|
|
set { _MyChangeBarDefinition = value; }
|
|
}
|
|
private bool _OriginalPageBreak; // use 16bit page breaks.
|
|
public bool OriginalPageBreak
|
|
{
|
|
get { return _OriginalPageBreak; }
|
|
set { _OriginalPageBreak = value; }
|
|
}
|
|
private bool _InsertBlankPages;
|
|
public bool InsertBlankPages
|
|
{
|
|
get { return _InsertBlankPages; }
|
|
set { _InsertBlankPages = value; }
|
|
}
|
|
private bool _BatchPrint = true; // flags that a batch-type print is occurring, i.e. AllProcedures or Automatic testing
|
|
public bool BatchPrint
|
|
{
|
|
get { return _BatchPrint; }
|
|
set { _BatchPrint = value; }
|
|
}
|
|
private static List<string> _TransPageNumProblems = null;
|
|
public static List<string> TransPageNumProblems
|
|
{
|
|
get { return PromsPrinter._TransPageNumProblems; }
|
|
set { PromsPrinter._TransPageNumProblems = value; }
|
|
}
|
|
public static void ClearTransPageNumProblems()
|
|
{
|
|
_TransPageNumProblems = null;
|
|
}
|
|
public static DialogResult ReportTransPageNumProblems()
|
|
{
|
|
if (TransPageNumProblems != null && TransPageNumProblems.Count > 0)
|
|
{
|
|
string pnProbl = null;
|
|
foreach (string pstr in TransPageNumProblems)
|
|
pnProbl = pnProbl + "\r\n" + pstr;
|
|
Clipboard.SetText(pnProbl);
|
|
return MessageBox.Show("Review the page numbers specified on transitions that transition to the following:\n" + pnProbl
|
|
+ "\r\n\r\nDo you want to review the PDF output prior to the page number update?"
|
|
+ "\r\n\r\nThis should help to determine the cause of the inconsistent page numbers."
|
|
+ "\r\n\r\nThis list will be placed in the Clipboard.",
|
|
"Inconsistent transition page numbers.", MessageBoxButtons.YesNo,MessageBoxIcon.Question);
|
|
}
|
|
return DialogResult.No;
|
|
}
|
|
private ReaderHelper _MyReaderHelper;
|
|
public ReaderHelper MyReaderHelper
|
|
{
|
|
get { return _MyReaderHelper; }
|
|
set { _MyReaderHelper = 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, bool batchPrint, string prefix, bool saveLinks, bool removeTrailngHardReturnsAndManualPageBreaks)
|
|
{
|
|
Prefix = prefix; // RHM20150506 Multiline ItemID TextBox
|
|
_MyItem = myItem;
|
|
_Rev = rev;
|
|
_Watermark = watermark;
|
|
_DebugOutput = debugOutput;
|
|
_BackgroundFolder = backgroundFolder;
|
|
_OpenPDF = openPDF;
|
|
_OverWrite = overWrite;
|
|
_MyChangeBarDefinition = cbd;
|
|
_PDFFile = pdfFile;
|
|
_OriginalPageBreak = origPgBrk;
|
|
_InsertBlankPages = insertBlankPages;
|
|
_BatchPrint = batchPrint;
|
|
_MyReaderHelper = new ReaderHelper(this);
|
|
_SaveLinks = saveLinks;
|
|
_RemoveTrailingHardReturnsAndManualPageBreaks = removeTrailngHardReturnsAndManualPageBreaks;
|
|
//_MyReaderHelper.LoadTree(myItem);
|
|
}
|
|
private string _BeforePageNumberPdf = null;
|
|
public string BeforePageNumberPdf
|
|
{
|
|
get { return _BeforePageNumberPdf; }
|
|
set { _BeforePageNumberPdf = value; }
|
|
}
|
|
public string Print(string pdfFolder, bool makePlacekeeper, bool makeContinuousActionSummary)
|
|
{
|
|
if (_MyItem is ProcedureInfo)
|
|
{
|
|
if (!(_MyItem.ActiveFormat.PlantFormat.FormatData.TransData.UseTransitionModifier ||
|
|
_MyItem.ActiveFormat.PlantFormat.FormatData.TransData.UseSpecificTransitionModifier))
|
|
return Print(_MyItem as ProcedureInfo, pdfFolder, makePlacekeeper, makeContinuousActionSummary);
|
|
else
|
|
{
|
|
// if the plant uses transition modifiers and/or page num in transition format,
|
|
// need to do two passes. First pass, sets the pagenumbers for each item,
|
|
// 2nd pass fills in the page numbers in transitions.
|
|
DirectoryInfo di = new DirectoryInfo(pdfFolder + @"\PageNumberPass1");
|
|
if (!di.Exists) di.Create();
|
|
string retstr = Print(_MyItem as ProcedureInfo, pdfFolder + @"\PageNumberPass1", false, false);
|
|
if (retstr == null) return null;
|
|
BeforePageNumberPdf = retstr;
|
|
ProcedureInfo.RefreshPageNumTransitions(_MyItem as ProcedureInfo);
|
|
_MyReaderHelper = new ReaderHelper(this);
|
|
retstr = Print(_MyItem as ProcedureInfo, pdfFolder, makePlacekeeper, makeContinuousActionSummary);
|
|
if (TransPageNumProblems.Count > 0)
|
|
{
|
|
if (BatchPrint || ( MessageBox.Show("Page Number Transitions may be fixed if a second pass is performed. Do you want to perform a second pass?", "Page Number Transition Errors", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes))
|
|
{
|
|
DirectoryInfo di1 = new DirectoryInfo(pdfFolder + @"\PageNumberPass2");
|
|
if (!di1.Exists) di1.Create();
|
|
FileInfo fi = new FileInfo(retstr);
|
|
FileInfo fidest = new FileInfo(di1.FullName + @"\" + fi.Name);
|
|
if (fidest.Exists) fidest.Delete();
|
|
try
|
|
{
|
|
fi.MoveTo(di1.FullName + @"\" + fi.Name);
|
|
}
|
|
catch(Exception ex)
|
|
{
|
|
_MyLog.ErrorFormat("{0} During Save {1}", ex.GetType().FullName, ex.Message);
|
|
}
|
|
ClearTransPageNumProblems();
|
|
RefreshPageNumber(_MyItem);
|
|
ProcedureInfo.RefreshPageNumTransitions(_MyItem as ProcedureInfo);
|
|
_MyReaderHelper = new ReaderHelper(this);
|
|
retstr = Print(_MyItem as ProcedureInfo, pdfFolder, makePlacekeeper, makeContinuousActionSummary);
|
|
}
|
|
}
|
|
return retstr;
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
|
|
private void RefreshPageNumber(ItemInfo _MyItem)
|
|
{
|
|
// set all page numbers for all items under the passed in procedure item
|
|
_MyItem.PageNumber = _MyItem.PageNumberNextPass;
|
|
if (_MyItem.MyContent.ContentPartCount > 0)
|
|
{
|
|
foreach (PartInfo pi in _MyItem.MyContent.ContentParts)
|
|
{
|
|
foreach (ItemInfo ii in pi.MyItems)
|
|
RefreshPageNumber(ii);
|
|
}
|
|
}
|
|
}
|
|
internal string BuildMSWordPDF(SectionInfo section)
|
|
{
|
|
DateTime tStart = DateTime.Now;
|
|
string MSWordFile = null;
|
|
if (section.MyContent.ContentEntryCount == 1)
|
|
{
|
|
MSWordFile = MSWordToPDF.GetDocPdf(section, PrintOverride.TextColor);
|
|
OnStatusChanged("MSWord converted to PDF " + MSWordFile, PromsPrinterStatusType.MSWordToPDF);
|
|
}
|
|
return MSWordFile;
|
|
}
|
|
private static void AddImportedPageToLayer(PdfContentByte cb, PdfLayer layer, PdfImportedPage page, float xOff, float yOff)
|
|
{
|
|
cb.BeginLayer(layer);
|
|
iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(page);
|
|
|
|
// the following checks if the content of page is landscape and rotates because we're printing on
|
|
// a portrait page. If, at some point, we print a total landscape page, not a mix, this will need
|
|
// re-evaluated.
|
|
if (page.Height < page.Width)
|
|
{
|
|
if (cb.PdfDocument.PageSize.Height > cb.PdfDocument.PageSize.Width)
|
|
image.RotationDegrees = 90F;
|
|
}
|
|
image.SetAbsolutePosition(xOff, yOff);
|
|
cb.AddImage(image);
|
|
cb.EndLayer();
|
|
}
|
|
private PdfLayer _TextLayer;
|
|
private PdfLayer _BackgroundLayer;
|
|
private PdfLayer _MSWordLayer;
|
|
private PdfLayer _PagelistLayer;
|
|
private PdfLayer _DebugLayer;
|
|
private PdfLayer _WatermarkLayer;
|
|
private void CreateLayers(PdfContentByte cb)
|
|
{
|
|
if (DebugOutput)
|
|
{
|
|
_BackgroundLayer = new PdfLayer("16-Bit", cb.PdfWriter);
|
|
_MSWordLayer = new PdfLayer("32-Bit MSWord", cb.PdfWriter);
|
|
_PagelistLayer = new PdfLayer("32-Bit Pagelist", cb.PdfWriter);
|
|
_TextLayer = new PdfLayer("32-Bit Text", cb.PdfWriter);
|
|
_DebugLayer = new PdfLayer("Debug", cb.PdfWriter);
|
|
_WatermarkLayer = new PdfLayer("Watermark", cb.PdfWriter);
|
|
_WatermarkLayer.SetPrint("Watermark", true);
|
|
}
|
|
}
|
|
private void CloseDocument(string fileName)
|
|
{
|
|
int profileDepth = ProfileTimer.Push(">>>> CloseDocument");
|
|
try
|
|
{
|
|
MyContentByte.PdfDocument.Close();
|
|
MyContentByte = null;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("{0} - {1}", ex.GetType().Name, ex.Message);
|
|
}
|
|
OnStatusChanged("CloseDocument", PromsPrinterStatusType.CloseDocument);
|
|
if (OpenPDF)
|
|
System.Diagnostics.Process.Start(fileName);
|
|
OnStatusChanged("OpenPDF", PromsPrinterStatusType.OpenPDF);
|
|
ProfileTimer.Pop(profileDepth);
|
|
}
|
|
private PdfContentByte _MyContentByte = null;
|
|
public PdfContentByte MyContentByte
|
|
{
|
|
get { return _MyContentByte; }
|
|
set
|
|
{
|
|
_MyContentByte = value;
|
|
if(value != null)MyReaderHelper.LoadTree(MyItem);
|
|
}
|
|
}
|
|
public void NewPage()
|
|
{
|
|
string path = Volian.Base.Library.vlnStackTrace.StackToStringLocal(2, 1);
|
|
NewPage(false);
|
|
}
|
|
public void NewPage(bool sectionChange)
|
|
{
|
|
// the first time we come in here we already printed the first page.
|
|
// we are now setting up the page size for the next page
|
|
iTextSharp.text.Rectangle rct = MyReaderHelper.MyPromsPrinter.MyContentByte.PdfDocument.PageSize;
|
|
if (_MyHelper != null)
|
|
{
|
|
SectionInfo currentSection = _MyHelper.MySection;
|
|
SectionInfo nextSection = GetNextSection(currentSection); // _MyHelper.MySection.NextItem as SectionInfo;
|
|
//SectionConfig sc = (nextSection ?? currentSection).MyConfig as SectionConfig;
|
|
// If we are changing to a different section, then get the config from the nextSection
|
|
// else we are still printing in the same section so get the config from the current section
|
|
SectionConfig sc = ((!sectionChange || nextSection == null)? currentSection.MyConfig : nextSection.MyConfig) as SectionConfig;
|
|
bool wordMargins = (sc != null && sc.Section_WordMargin == "Y");
|
|
if (wordMargins)
|
|
{
|
|
if (nextSection != null && (sectionChange) && !nextSection.IsStepSection) //change to a word section
|
|
{
|
|
LastWordSection = nextSection;
|
|
_PageCountOfWordSection = 1;
|
|
MyReaderHelper.MySectionInfo = LastWordSection;
|
|
//ShowNeedForPageSize();
|
|
rct = MyReaderHelper.GetSize(LastWordSection, 1);
|
|
}
|
|
else if (!currentSection.IsStepSection) //current section is a word section
|
|
{
|
|
if (currentSection != LastWordSection)
|
|
{
|
|
LastWordSection = currentSection;
|
|
_PageCountOfWordSection = 1;
|
|
}
|
|
else
|
|
_PageCountOfWordSection++;
|
|
MyReaderHelper.MySectionInfo = LastWordSection;
|
|
//ShowNeedForPageSize();
|
|
rct = MyReaderHelper.GetSize(LastWordSection, _PageCountOfWordSection);
|
|
}
|
|
}
|
|
else // don't use Word margins
|
|
{
|
|
rct = PageSize.LETTER;
|
|
}
|
|
//Console.WriteLine("\"{0}\"\t\"{1}\"\t\"{2}\"\t\"{3}\"\t{4}"
|
|
// , currentSection == null ? "" : currentSection.DisplayNumber + " " + currentSection.DisplayText
|
|
// , nextSection == null ? "" : nextSection.DisplayNumber + " " + nextSection.DisplayText
|
|
// , sectionChange, wordMargins,_PageCountOfWordSection);
|
|
}
|
|
MyContentByte.PdfDocument.SetPageSize(rct);
|
|
MyContentByte.PdfDocument.NewPage();
|
|
}
|
|
private SectionInfo GetNextSection(SectionInfo currentSection)
|
|
{
|
|
if (currentSection.Sections != null)
|
|
return currentSection.Sections[0] as SectionInfo;
|
|
if (currentSection.NextItem != null)
|
|
return currentSection.NextItem as SectionInfo;
|
|
SectionInfo parent = currentSection.ActiveParent as SectionInfo;
|
|
while (parent != null && parent.NextItem == null)
|
|
parent = parent.ActiveParent as SectionInfo;
|
|
if (parent == null) return null;
|
|
return parent.NextItem as SectionInfo;
|
|
}
|
|
private SectionInfo _PreviousWordSection = null;
|
|
public SectionInfo PreviousWordSection
|
|
{
|
|
get { return _PreviousWordSection; }
|
|
set { _PreviousWordSection = value; }
|
|
}
|
|
private SectionInfo _LastWordSection = null;
|
|
public SectionInfo LastWordSection
|
|
{
|
|
get { return _LastWordSection; }
|
|
set
|
|
{
|
|
PreviousWordSection = _LastWordSection;
|
|
_LastWordSection = value;
|
|
}
|
|
}
|
|
private int _PageCountOfWordSection = 0;
|
|
//private void ShowNeedForPageSize()
|
|
//{
|
|
// if(PreviousWordSection != null && PreviousWordSection != LastWordSection)
|
|
// Console.WriteLine("Switch From {0}.{1} ",PreviousWordSection.DisplayNumber,PreviousWordSection.DisplayText);
|
|
// Console.WriteLine("To {0}.{1} Page: {2}",LastWordSection.DisplayNumber,LastWordSection.DisplayText,_PageCountOfWordSection);
|
|
// PreviousWordSection = LastWordSection;
|
|
//}
|
|
private PdfContentByte OpenDoc(string outputFileName, iTextSharp.text.Rectangle rect)
|
|
{
|
|
PdfWriter writer=null;
|
|
iTextSharp.text.Document document = new iTextSharp.text.Document(rect);
|
|
try
|
|
{
|
|
writer = PdfWriter.GetInstance(document, new FileStream(outputFileName, FileMode.Create));
|
|
// PDFA1B does not allow layers, so this is disabled for now
|
|
// If enabled, CreateLayers will need to be skipped.
|
|
//writer.PDFXConformance = PdfWriter.PDFA1B;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.AppendLine("Could not create");
|
|
sb.AppendLine();
|
|
sb.AppendLine(outputFileName + ".");
|
|
sb.AppendLine();
|
|
sb.AppendLine("If it is open, close and retry.");
|
|
MessageBox.Show(sb.ToString(), "Error on CreatePdf", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
//MessageBox.Show("Could not create " + outputFileName + ". If it is open, close and retry.", "Error on CreatePdf");
|
|
return MyContentByte = null;
|
|
}
|
|
document.Open();
|
|
// Create Layers
|
|
CreateLayers(writer.DirectContent);
|
|
MSWordToPDF.DebugStatus = DebugOutput ? 1 : 0;
|
|
PrintOverride.Reset();
|
|
if (DebugOutput)
|
|
{
|
|
PrintOverride.TextColor = System.Drawing.Color.Red;
|
|
PrintOverride.SvgColor = System.Drawing.Color.LawnGreen;
|
|
PrintOverride.BoxColor = System.Drawing.Color.Red;
|
|
PrintOverride.ChangeBarColor = System.Drawing.Color.Red;
|
|
PrintOverride.DebugColor = System.Drawing.Color.CadetBlue;
|
|
}
|
|
MyContentByte = writer.DirectContent;
|
|
return MyContentByte;
|
|
}
|
|
//private string CreateFileName(string procNumber, string sectNumber, string sectTitle)
|
|
//{
|
|
// return FixFileName(procNumber + "_" + ((sectNumber ?? "") != "" ? sectNumber : sectTitle));
|
|
//}
|
|
//private string CreateFileName(string procNumber)
|
|
//{
|
|
// return FixFileName(procNumber);
|
|
//}
|
|
//private string FixFileName(string name)
|
|
//{
|
|
// return Regex.Replace(name, "[ .,/]", "_") + ".pdf";
|
|
//}
|
|
int _StepPageNumber = 0;
|
|
private VlnSvgPageHelper _MyHelper = null;
|
|
//private static PdfReader _MyFoldoutReader = null;
|
|
//private static SectionInfo _MyFoldoutSection = null;
|
|
private static List<PdfReader> _MyFoldoutReader = null;
|
|
public static List<PdfReader> MyFoldoutReader
|
|
{
|
|
get { return PromsPrinter._MyFoldoutReader; }
|
|
set { PromsPrinter._MyFoldoutReader = value; }
|
|
}
|
|
private static List<SectionInfo> _MyFoldoutSection = null;
|
|
private string Print(ProcedureInfo myProcedure, string pdfFolder, bool makePlacekeeper, bool makeContinuousActionSummary)
|
|
{
|
|
int profileDepth = ProfileTimer.Push(">>>> PromsPrinter.Print");
|
|
if (_TransPageNumProblems == null) _TransPageNumProblems = new List<string>();
|
|
|
|
if (_MyFoldoutReader != null) _MyFoldoutReader.Clear();
|
|
else _MyFoldoutReader = new List<PdfReader>();
|
|
|
|
if (_MyFoldoutSection != null) _MyFoldoutSection.Clear();
|
|
else _MyFoldoutSection = new List<SectionInfo>();
|
|
|
|
if (myProcedure.Sections != null)
|
|
{
|
|
int cnt = 0;
|
|
foreach (SectionInfo mySection in myProcedure.Sections)
|
|
{
|
|
if ((myProcedure.ActiveFormat.PlantFormat.FormatData.PrintData.SectionLevelFoldouts && mySection.MyContent.Number.ToUpper() == "FOLDOUT")
|
|
|| (myProcedure.ActiveFormat.PlantFormat.FormatData.PrintData.AlternateFloatingFoldout && mySection.MyContent.Text.ToUpper().Contains("FOLDOUT")))
|
|
{
|
|
// if floating foldouts, need a list of sections & foldoutreaders. Just do first for now.
|
|
|
|
_MyFoldoutSection.Add(mySection);
|
|
string foldoutPdf = PrintProcedureOrFoldout(myProcedure, mySection, Volian.Base.Library.VlnSettings.TemporaryFolder + @"\Foldout" + cnt.ToString() + @".pdf", false, false);
|
|
_MyFoldoutReader.Add(foldoutPdf != null ? new PdfReader(foldoutPdf) : null);
|
|
cnt++;
|
|
}
|
|
}
|
|
}
|
|
OnStatusChanged("Print " + myProcedure.DisplayNumber, PromsPrinterStatusType.Start);
|
|
string outputFileName = pdfFolder + "\\" + Prefix + PDFFile; // RHM20150506 Multiline ItemID TextBox
|
|
|
|
if (!OverWrite && File.Exists(outputFileName))
|
|
{
|
|
if (MessageBox.Show(outputFileName + " exists. Overwrite file?", "File Exists", MessageBoxButtons.YesNo) == DialogResult.No)
|
|
{
|
|
ProfileTimer.Pop(profileDepth);
|
|
return null;
|
|
}
|
|
}
|
|
string retval = PrintProcedureOrFoldout(myProcedure, null, outputFileName, makePlacekeeper, makeContinuousActionSummary);
|
|
ProfileTimer.Pop(profileDepth);
|
|
return retval;
|
|
}
|
|
|
|
// See if the last non Foldout Section has a Final Message.
|
|
private int GetFinalMessageSectionID(ProcedureInfo myProcedure, bool doingFoldout)
|
|
{
|
|
if (!doingFoldout)
|
|
{
|
|
// Work backwards because we don't want to include any foldouts. Find the last section that is not
|
|
// a foldout. If it has a final message, this is the 'last section' and should have a final message.
|
|
// If it doesn't have a final message, then none should be printed.
|
|
int cntSect = myProcedure.Sections.Count;
|
|
for (int i = cntSect - 1; i >= 0; i--)
|
|
{
|
|
SectionInfo mySection = myProcedure.Sections[i] as SectionInfo;
|
|
if (!mySection.DisplayText.ToUpper().Contains("FOLDOUT"))
|
|
{
|
|
if (mySection.MyDocStyle.Final != null && mySection.MyDocStyle.Final.Message != null && mySection.MyDocStyle.Final.Message.Length > 0)
|
|
return mySection.ItemID;
|
|
else
|
|
return -1;
|
|
}
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
private bool _AllowAllWatermarks = false;
|
|
public bool AllowAllWatermarks
|
|
{
|
|
get { return _AllowAllWatermarks; }
|
|
set { _AllowAllWatermarks = value; }
|
|
}
|
|
private PdfReader readerWord;
|
|
private string PrintProcedureOrFoldout(ProcedureInfo myProcedure, SectionInfo myFoldoutSection, string outputFileName, bool makePlacekeeper, bool makeContinuousActionSummary)
|
|
{
|
|
int profileDepth = ProfileTimer.Push(">>>> PrintProcedureOrFoldout");
|
|
Rtf2Pdf.TextAtCounter = 0;
|
|
bool doingFoldout = myFoldoutSection != null;
|
|
// The following line accounts for 16bit OverrideLeftMargin when the 'Absolute' attribute is used in the genmac.
|
|
// We don't want to use the OverrideLeftMargin when 'Absolute' is used in the genmac.
|
|
// It's set here because the Volian.Svg.Library cannot call back to Volian.Print.Library to get this value.
|
|
Svg.Library.Svg.AbsoluteOffset = new PointF(2 * 72F / (float)myProcedure.ActiveFormat.PlantFormat.FormatData.Font.CPI, -9.5F);
|
|
// Create an MSWord Pdf
|
|
// Setup a pdf Document for printing
|
|
OnStatusChanged("Before OpenDoc", PromsPrinterStatusType.Before);
|
|
iTextSharp.text.Rectangle rct = PageSize.LETTER;
|
|
if (myProcedure.Sections != null && !myProcedure.Sections[0].IsStepSection)
|
|
{
|
|
SectionInfo si = myProcedure.Sections[0] as SectionInfo;
|
|
SectionConfig sc = si.MyConfig as SectionConfig;
|
|
bool wordMargins = (sc != null && sc.Section_WordMargin == "Y");
|
|
if (wordMargins)
|
|
{
|
|
string pdfFile =BuildMSWordPDF(si);
|
|
try
|
|
{
|
|
PdfReader reader = new PdfReader(pdfFile);
|
|
rct = reader.GetPageSizeWithRotation(1);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, ex.GetType().FullName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
_MyLog.Warn(string.Format("Error of ReadPDf [{0}],{1}.{2}",si.ItemID,si.DisplayNumber,si.DisplayText),ex);
|
|
throw new Exception("Error in readPDF", ex);
|
|
}
|
|
}
|
|
}
|
|
PdfContentByte cb = OpenDoc(outputFileName, rct);
|
|
if (cb == null)
|
|
{
|
|
ProfileTimer.Pop(profileDepth);
|
|
return null;
|
|
}
|
|
SetupProperties(cb.PdfDocument, myProcedure);
|
|
OnStatusChanged("Before NewPage", PromsPrinterStatusType.Before);
|
|
NewPage(); // Start of print
|
|
//_MyLog.InfoFormat("NewPage 1 {0}", cb.PdfWriter.CurrentPageNumber);
|
|
OnStatusChanged("After NewPage", PromsPrinterStatusType.NewPage);
|
|
if (myProcedure.Sections == null)
|
|
{
|
|
MessageBox.Show("This procedure has no content and will not be printed.", "Empty Procedure", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
ProfileTimer.Pop(profileDepth);
|
|
return null;
|
|
}
|
|
OnStatusChanged(myProcedure.DisplayNumber, PromsPrinterStatusType.ProgressSetup, myProcedure.Sections.Count);
|
|
int progress = 0;
|
|
int finalMessageSectionID = GetFinalMessageSectionID(myProcedure, doingFoldout);
|
|
string LastFmtName = null;
|
|
int lastDocStyle = -1;
|
|
foreach (SectionInfo mySection in myProcedure.Sections)
|
|
{
|
|
if (((mySection.MyContent.Number.ToUpper() == "FOLDOUT" && myProcedure.ActiveFormat.PlantFormat.FormatData.PrintData.SectionLevelFoldouts)
|
|
|| (myProcedure.ActiveFormat.PlantFormat.FormatData.PrintData.AlternateFloatingFoldout && mySection.MyContent.Text.ToUpper().Contains("FOLDOUT")))
|
|
!= doingFoldout) continue;
|
|
if (myFoldoutSection != null && myFoldoutSection.ItemID != mySection.ItemID) continue;
|
|
PrintOverride.CompressSuper = mySection.ActiveFormat.PlantFormat.FormatData.SectData.StepSectionData.CompressHPSuper;
|
|
PrintOverride.CompressSub = mySection.ActiveFormat.PlantFormat.FormatData.SectData.StepSectionData.CompressHPSub;
|
|
PrintOverride.CompressPropSubSup = mySection.ActiveFormat.PlantFormat.FormatData.SectData.StepSectionData.CompressPropSubSup;
|
|
|
|
OnStatusChanged((mySection.DisplayNumber ?? "") == "" ? mySection.DisplayText : mySection.DisplayNumber, PromsPrinterStatusType.Progress, progress++);
|
|
// Set up Helper for the particular Section
|
|
if (_MyHelper == null)
|
|
{
|
|
LastFmtName = mySection.ActiveFormat.Name;
|
|
lastDocStyle = (int)mySection.MyDocStyle.Index;
|
|
string hlsText = "";
|
|
int hlsItemId = 0;
|
|
if (mySection.IsStepSection && mySection.Steps != null && mySection.Steps.Count > 0)
|
|
{
|
|
hlsItemId = mySection.Steps[0].ItemID;
|
|
hlsText = mySection.Steps[0].DisplayText; // save the High level step text for use in the page list
|
|
}
|
|
cb.PdfWriter.PageEvent = _MyHelper = new VlnSvgPageHelper(mySection, this, hlsText, hlsItemId);
|
|
_MyHelper.AllowAllWatermarks = AllowAllWatermarks;
|
|
_MyHelper.MyPdfWriter = cb.PdfWriter;
|
|
_MyHelper.CreatingFoldoutPage = doingFoldout;
|
|
_MyHelper.MyPdfContentByte = cb;
|
|
|
|
if (!mySection.IsStepSection) _MyHelper.PageBookmarks.Add((ItemInfo)mySection, ((mySection.DisplayNumber ?? "") == "" ? "" : mySection.DisplayNumber + " - ") + mySection.DisplayText, null);
|
|
if (DebugOutput)
|
|
{
|
|
// 16-bit background
|
|
string procedureFileName = BackgroundFolder + "\\" + PDFFile.Trim();//CreateFileName(myProcedure.DisplayNumber);
|
|
FileInfo VEPromsFile = new FileInfo(procedureFileName);
|
|
if (VEPromsFile.Exists && !doingFoldout)
|
|
{
|
|
_MyHelper.BackgroundFile = procedureFileName;
|
|
float x = 0;
|
|
float y = 0;
|
|
if (!(mySection.ActiveFormat.Name.ToUpper().StartsWith("WST") || _MyHelper.Back32BitPROMS)) // compare folder contains PROMS generated PDF
|
|
{
|
|
// X value below = 16-bit pdf OverrideLeftMargin = -2 characters at the plant format's default Font's
|
|
// characters per inch.
|
|
// 16bit OverrideLeftMargin, defined as -2 in driver\drvin.rtf, - override took 2 characters out, so we're adding it back in:
|
|
// These values adjust if overlay is 16bit versus 32bit. This is
|
|
// used so that the comparison is an exact match. Use 0,0 if comparing to another 32bit
|
|
// pdf, i.e. won't process the following 2 lines of code.
|
|
x = 2 * 72F / (float)myProcedure.ActiveFormat.PlantFormat.FormatData.Font.CPI;
|
|
y = -9.5F;
|
|
}
|
|
x += 72F * VlnSettings.GetCommandFloat("X", 0);
|
|
y -= 72F * VlnSettings.GetCommandFloat("Y", 0);
|
|
_MyHelper.BackgroundOffset = new PointF(x,y);
|
|
_MyHelper.BackgroundPageOffset = 0;
|
|
}
|
|
_MyHelper.WatermarkLayer = _WatermarkLayer;
|
|
_MyHelper.PageListLayer = _PagelistLayer;
|
|
_MyHelper.TextLayer = _TextLayer;
|
|
_MyHelper.BackgroundLayer = _BackgroundLayer;
|
|
_MyHelper.DebugLayer = _DebugLayer;
|
|
}
|
|
_MyHelper.Rev = _Rev;
|
|
_MyHelper.Watermark = _Watermark;
|
|
_MyHelper.DoZoomOMatic = DebugOutput;
|
|
_MyHelper.OriginalPageBreak = OriginalPageBreak;
|
|
OnStatusChanged("After Set PageEvent", PromsPrinterStatusType.SetPageEvent);
|
|
}
|
|
else
|
|
{
|
|
//added by jcb to reset mygaps when changing a section. found old section gaps were carrying over to new section
|
|
_MyHelper.MyGaps.Clear();
|
|
//Console.WriteLine("'{0}' PromsPrinter", mySection.DisplayText);
|
|
// if pagination is separate or we've changed the format, we have not done the first page
|
|
// (if this format has the useonfirst page docstyle flag)
|
|
if (LastFmtName != mySection.ActiveFormat.Name || lastDocStyle != (int)mySection.MyDocStyle.Index || mySection.SectionConfig.Section_Pagination == SectionConfig.SectionPagination.Separate)
|
|
{
|
|
_MyHelper.DidFirstPageDocStyle = false;
|
|
lastDocStyle = (int)mySection.MyDocStyle.Index;
|
|
LastFmtName = mySection.ActiveFormat.Name;
|
|
}
|
|
if (!mySection.IsStepSection) _MyHelper.PageBookmarks.Add((ItemInfo)mySection, ((mySection.DisplayNumber ?? "") == "" ? "" : mySection.DisplayNumber + " - ") + mySection.DisplayText, null);
|
|
_MyHelper.MySection = mySection;
|
|
//OnStatusChanged("After Set Svg", PromsPrinterStatusType.SetSVG);
|
|
}
|
|
// if this format uses phonelists, see if this section has one. We need to know the number
|
|
//of lines to adjust the pagelength for pagination and printing.
|
|
_MyHelper.PhoneListHeight = 0;
|
|
if (mySection.ActiveFormat.PlantFormat.FormatData.SectData.PrintPhoneList)
|
|
{
|
|
// get config for section
|
|
SectionConfig sc = mySection.MyConfig as SectionConfig;
|
|
if (sc.Section_PhoneList != null && sc.Section_PhoneList == "Y")
|
|
{
|
|
DocVersionConfig dvc = mySection.MyDocVersion.MyConfig as DocVersionConfig;
|
|
if (dvc != null)
|
|
{
|
|
string phlist = dvc.Print_PhoneList;
|
|
if (phlist != null && phlist != "")
|
|
{
|
|
// count lines:
|
|
int cl = 0;
|
|
int indx = phlist.IndexOf("\n");
|
|
while (indx > 0)
|
|
{
|
|
cl++;
|
|
if (indx + 1 > phlist.Length)
|
|
indx = -1;
|
|
else
|
|
indx = phlist.IndexOf("\n", indx + 1);
|
|
}
|
|
if (cl == 0) cl = 1; // phone list is a single line without an ending newline
|
|
_MyHelper.PhoneListHeight = cl * vlnPrintObject.SixLinesPerInch;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_MyHelper.FinalMessageSectionID = finalMessageSectionID; // set VlnSvgPageHelper with the finalMessageSectionID
|
|
|
|
if (mySection.IsAutoTOCSection)
|
|
GenerateTOC(mySection, myProcedure, cb, _TextLayer);
|
|
// is this the right place for PlaceKeeper?
|
|
// I think we need to check if the actual PlaceKeeper section has the PlaceKeeper flag set (for auto generation)
|
|
// users can turn this off and edit the section manaully in 16-bit.
|
|
//else if (mySection.IsPlacekeeperSection)
|
|
// GeneratePlaceKeeper(mySection, myProcedure, cb, _TextLayer);
|
|
else
|
|
{
|
|
if (mySection.IsStepSection)
|
|
{
|
|
if (mySection.Steps != null && mySection.Steps.Count > 0)
|
|
{
|
|
// get first step to send to floating foldout indx.&& MyItemInfo.FoldoutIndex>-1)
|
|
ItemInfo firstStep = mySection.Steps[0];
|
|
if (firstStep.FoldoutIndex() > -1)
|
|
DoFoldoutPage(cb, "Beginning of Step Section", _TextLayer, _MyHelper, firstStep.FoldoutIndex(), InsertBlankPages);
|
|
else if (!_MyHelper.CreatingFoldoutPage && _MyFoldoutReader.Count > 0 && InsertBlankPages)
|
|
{
|
|
// if it is continuous pagination, don't do blank page - not sure if this is correct place for this:
|
|
if (mySection.SectionConfig.Section_Pagination == SectionConfig.SectionPagination.Separate)
|
|
{
|
|
// 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));
|
|
NewPage();
|
|
//_MyLog.InfoFormat("NewPage Begin Step Sect blank {0}", cb.PdfWriter.CurrentPageNumber);
|
|
}
|
|
}
|
|
}
|
|
CreateStepPdf(mySection, cb);
|
|
}
|
|
else
|
|
{
|
|
CreateWordDocPdf(cb, mySection);
|
|
}
|
|
}
|
|
_MyHelper.PrintedSectionPage = 0;
|
|
}
|
|
if (_MyHelper != null && _MyHelper.BackgroundFile != null)
|
|
{
|
|
_MyHelper.MySvg = null;
|
|
while (cb.PdfWriter.CurrentPageNumber <= _MyHelper.BackgroundPageCount)
|
|
{
|
|
PrintTextMessage(cb, "No Proms Output", _TextLayer);
|
|
NewPage();
|
|
//_MyLog.InfoFormat("NewPage 2 {0}", cb.PdfWriter.CurrentPageNumber);
|
|
if (DebugPagination.IsOpen) DebugPagination.WriteLine("{0:D6},'{1}'",
|
|
_MyHelper.MyPdfContentByte.PdfWriter.CurrentPageNumber, "No PROMS Output");
|
|
}
|
|
}
|
|
OnStatusChanged(myProcedure.DisplayNumber + " PDF Creation Completed", PromsPrinterStatusType.Progress, progress);
|
|
if (DebugPagination.IsOpen) DebugPagination.TotalPages += cb.PdfWriter.CurrentPageNumber;
|
|
CloseDocument(outputFileName);
|
|
if (_MyHelper != null && makePlacekeeper)
|
|
{
|
|
// Setting the default font to Arial since that is what Calvert is currently using for their Placekeeper pages
|
|
VE_Font pkFont = new VE_Font("Arial", 11, E_Style.None, 12); // default font info.
|
|
// Ideally, we should grab the font from the DocStyle used for the Placekeeper.
|
|
// Note that Calvert has two Placekeeper docSyles (EOPs and AOPs) in the same format.
|
|
// Both Placekeeper DocStyles use Arial 11 pt font, so there is no need to grab it from the format file.
|
|
//foreach (DocStyle ds in _MyHelper.MySection.ActiveFormat.PlantFormat.DocStyles.DocStyleList)
|
|
//{ // note that this will get the last Placekeeper font setting
|
|
// if (ds.StructureStyle.Style == E_DocStructStyle.Placekeeper)
|
|
// pkFont = ds.Font;
|
|
//}
|
|
if (_MyHelper.MyPlacekeepers.Count > 0)
|
|
MyPlacekeeper = new Placekeeper(_MyHelper.MyPlacekeepers, pkFont);
|
|
}
|
|
// Generate the Continuous Action Summary
|
|
if (_MyHelper != null && makeContinuousActionSummary)
|
|
{
|
|
// Set the font for the Continue Action Summary
|
|
VE_Font pkFont = myProcedure.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.ContinuousActionSummaryData.Font; // uses font defined in the format or uses what is definced in BaseAll format
|
|
if (_MyHelper.MyContActSteps.Count > 0)
|
|
MyContActSummary = new ContinuousActionSummary(_MyHelper.MyContActSteps, pkFont);
|
|
}
|
|
_MyHelper = null;
|
|
ProfileTimer.Pop(profileDepth);
|
|
return outputFileName;
|
|
}
|
|
|
|
private void SetupProperties(PdfDocument document, ProcedureInfo myProcedure)
|
|
{
|
|
document.AddTitle(string.Format("{0} {1}",myProcedure.DisplayNumber,myProcedure.DisplayText));
|
|
document.AddSubject(myProcedure.SearchDVPath);
|
|
document.AddCreator(string.Format("{0} {1}",Application.ProductName, Application.ProductVersion));
|
|
document.AddAuthor(Volian.Base.Library.VlnSettings.UserID);
|
|
}
|
|
private Placekeeper _MyPlacekeeper = null;
|
|
|
|
public Placekeeper MyPlacekeeper
|
|
{
|
|
get { return _MyPlacekeeper; }
|
|
set { _MyPlacekeeper = value; }
|
|
}
|
|
|
|
private ContinuousActionSummary _MyContActSummary = null;
|
|
|
|
public ContinuousActionSummary MyContActSummary
|
|
{
|
|
get { return _MyContActSummary; }
|
|
set { _MyContActSummary = value; }
|
|
}
|
|
|
|
public void CreateWordDocPdf(PdfContentByte cb, SectionInfo mySection)
|
|
{
|
|
if (mySection.PageNumber == -1) // If page num transition goes to a section, need the pagenumber of section.
|
|
mySection.PageNumber = _MyHelper.CurrentPageNumber;
|
|
else
|
|
mySection.PageNumberNextPass = _MyHelper.CurrentPageNumber;
|
|
int profileDepth = ProfileTimer.Push(">>>> CreateWordDocPdf");
|
|
_MyHelper.MySection = mySection;
|
|
try
|
|
{
|
|
OnStatusChanged("Get Section", PromsPrinterStatusType.GetSection);
|
|
int sectPageCount = 0;
|
|
float locEndOfWordDoc = 0;
|
|
float pdfSize = 0;
|
|
using (PdfInfo myPdf = PdfInfo.Get(mySection))
|
|
{
|
|
sectPageCount = (int)(Math.Ceiling(myPdf.PageCount));
|
|
locEndOfWordDoc = (float)(myPdf.PageCount - (sectPageCount - 1)) * 100;
|
|
pdfSize = (float)myPdf.PageCount;
|
|
}
|
|
string tocKey = string.Format("TOC{0}", mySection.ItemID);
|
|
if (_MyHelper.MyTOCPageCounts.ContainsKey(tocKey))
|
|
{
|
|
PageCount pc = _MyHelper.MyTOCPageCounts[tocKey];
|
|
// add 1 because have not hit end page yet.
|
|
pc.Total = _MyHelper.CurrentTOCPageNumber + 1;
|
|
pc.DrawTemplates();
|
|
}
|
|
else
|
|
{
|
|
// see if this section will be added to the table of content. This is for sections that
|
|
// precede tha actual Automated TOC section.
|
|
SectionConfig sc = mySection.MyConfig as SectionConfig;
|
|
if (sc != null && sc.Section_TOC == "Y")
|
|
{
|
|
string tockey = "TOC" + mySection.ItemID.ToString();
|
|
if (!_MyHelper.MyTOCPageNums.ContainsKey(tockey))
|
|
// increment the CurrentTOCPageNumber by 1 since we haven't hit an
|
|
// endpage yet, and that's what increments it to the current page number.
|
|
_MyHelper.MyTOCPageNums.Add(tockey, _MyHelper.CurrentTOCPageNumber + 1);
|
|
}
|
|
}
|
|
float origYoff = (float)mySection.MyDocStyle.Layout.TopMargin;
|
|
bool resetSvgForCont = true;
|
|
for (int ii = 0; ii < sectPageCount; ii++)
|
|
{
|
|
int pageNumber = 1 + ii;
|
|
bool didFoldout = false;
|
|
if (((mySection.MyDocStyle.StructureStyle.Style ?? 0) & E_DocStructStyle.UseSectionFoldout) != 0)
|
|
{
|
|
didFoldout = true;
|
|
DoFoldoutPage(cb, "Word Document", _TextLayer, _MyHelper, 0, false);
|
|
}
|
|
if (this.MyReaderHelper != null)
|
|
{
|
|
bool doimport2 = true;
|
|
PdfImportedPage fgPage = null;
|
|
try
|
|
{
|
|
fgPage = this.MyReaderHelper.GetPage(mySection, ii + 1);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(ex);
|
|
doimport2 = false;
|
|
}
|
|
OnStatusChanged("Read MSWord", PromsPrinterStatusType.ReadMSWord);
|
|
if (doimport2)
|
|
{
|
|
if (!didFoldout && 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));
|
|
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);
|
|
if(DebugPagination.IsOpen) DebugPagination.WriteLine("{0:D6},'{1}',{2}",
|
|
_MyHelper.MyPdfContentByte.PdfWriter.CurrentPageNumber, mySection.ShortPath,pageNumber);
|
|
|
|
}
|
|
if (ii == sectPageCount - 1)
|
|
{
|
|
// if there's and end message, add it to the appropriate location on the last page of
|
|
// the word document:
|
|
if ((mySection.MyDocStyle.End.Message ?? "") != "")
|
|
{
|
|
float ylocation = cb.PdfDocument.PageSize.Height - ((float)mySection.MyDocStyle.Layout.TopMargin + locEndOfWordDoc * 72); // 72 - pts per inch.
|
|
iTextSharp.text.Font fnt = VolianPdf.GetFont(mySection.MyDocStyle.End.Font.WindowsFont);
|
|
fnt.Color = new iTextSharp.text.Color(PrintOverride.OverrideTextColor(System.Drawing.Color.Black));
|
|
iTextSharp.text.Paragraph para = new Paragraph(mySection.MyDocStyle.End.FixedMessage, fnt);
|
|
float wtpm = (float)mySection.MyDocStyle.Layout.PageWidth - (float)mySection.MyDocStyle.Layout.LeftMargin;
|
|
float centerpos = (float)mySection.MyDocStyle.Layout.LeftMargin + (wtpm - (mySection.MyDocStyle.End.Message.Length * mySection.MyDocStyle.End.Font.CharsToTwips)) / 2;
|
|
float yBottomMargin = Math.Max(0, (float)mySection.MyDocStyle.Layout.TopMargin - (float)mySection.MyDocStyle.Layout.PageLength - 2 * vlnPrintObject.SixLinesPerInch);
|
|
float adjMsgY = 0;
|
|
if ((float)mySection.MyDocStyle.End.Flag < 0) // Adjust this many lines down the page.
|
|
{
|
|
adjMsgY = (float)(-(float)mySection.MyDocStyle.End.Flag * vlnPrintObject.SixLinesPerInch);
|
|
if (ylocation - adjMsgY > mySection.MyDocStyle.Layout.FooterLength) ylocation = ylocation - adjMsgY;
|
|
}
|
|
bool landscape = (mySection.MyDocStyle.StructureStyle.Style & E_DocStructStyle.DSS_WordContentLandscaped) == E_DocStructStyle.DSS_WordContentLandscaped;
|
|
if (landscape)
|
|
{
|
|
cb.SaveState();
|
|
System.Drawing.Drawing2D.Matrix myMatrix = new System.Drawing.Drawing2D.Matrix(0, 1, -1, 0, cb.PdfDocument.PageSize.Height, 0);
|
|
cb.Transform(myMatrix);
|
|
}
|
|
Rtf2Pdf.TextAt(cb, para, centerpos, ylocation + 6, 200, 12, "", yBottomMargin);
|
|
if (landscape) cb.RestoreState();
|
|
}
|
|
}
|
|
OnStatusChanged("Merge MSWord", PromsPrinterStatusType.MergeMSWord);
|
|
}
|
|
OnStatusChanged("Before NewPage", PromsPrinterStatusType.Before);
|
|
if (mySection.MyDocStyle.LandscapePageList)// && mySection.MyDocStyle.Layout.PageWidth > mySection.MyDocStyle.Layout.PageLength)
|
|
_MyHelper.IsLandscape = true;
|
|
else
|
|
_MyHelper.IsLandscape = false;
|
|
NewPage(ii == sectPageCount-1); // 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.
|
|
_MyHelper.DidFirstPageDocStyle = true;
|
|
|
|
// Calvert has a case in their stp landscape word docs where a ' (Continued)' message
|
|
// appears in their pagelist item for printing the section title, {ATTACHTITLECONT} pagelist
|
|
// However, other sections use this token, but do NOT have the continue message - so
|
|
// the docstyle was added to flag the difference between them (STP-Landscape Attachments has it,
|
|
// STP-Attachments do not)
|
|
if (resetSvgForCont && (mySection.MyDocStyle.StructureStyle.Style & E_DocStructStyle.DSS_PageListAddSectCont) == E_DocStructStyle.DSS_PageListAddSectCont)
|
|
{
|
|
_MyHelper.ResetSvg();
|
|
resetSvgForCont = false; // only need to reset it once (for all pages after 1st page)
|
|
}
|
|
|
|
//DebugPagination.WriteLine("CreateWordDocPdf");
|
|
if ((mySection.MyDocStyle.StructureStyle.Where & E_DocStyleUse.UseOnFirstPage) > 0)
|
|
_MyHelper.MySection = mySection; // this resets the docstyle/pagestyle in pagehelper
|
|
OnStatusChanged("After NewPage", PromsPrinterStatusType.NewPage);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
NewPage(); // can we put out 'error on page'?
|
|
_MyLog.InfoFormat("NewPage error on page {0}", cb.PdfWriter.CurrentPageNumber);
|
|
}
|
|
finally
|
|
{
|
|
_MyHelper.IsLandscape = false; // reset landscape mode to false
|
|
}
|
|
ProfileTimer.Pop(profileDepth);
|
|
}
|
|
private void GenerateTOC(SectionInfo tocSection, ProcedureInfo myProcedure, PdfContentByte cb, PdfLayer textLayer)
|
|
{
|
|
iTextSharp.text.pdf.PdfWriter writer = cb.PdfWriter;
|
|
float _PointsPerPage = 792;
|
|
float yTopMargin = _PointsPerPage - (float)tocSection.MyDocStyle.Layout.TopMargin;
|
|
float yBottomMargin = Math.Max(0, yTopMargin - (float)tocSection.MyDocStyle.Layout.PageLength); // - 2 * vlnPrintObject.SixLinesPerInch);
|
|
if (textLayer != null) cb.BeginLayer(textLayer);
|
|
TableOfContentsData tOfC = tocSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.TableOfContentsData;
|
|
//ItemInfo procItem = ItemInfo.Get(myProcedure.ItemID);
|
|
ItemInfo procItem = myProcedure;
|
|
lastyLocation = 0;
|
|
AddSectionToTOC(tocSection, procItem, tOfC, cb, yTopMargin, 0);
|
|
if (textLayer != null) cb.EndLayer();
|
|
NewPage();
|
|
//_MyLog.InfoFormat("NewPage 4 {0}", cb.PdfWriter.CurrentPageNumber);
|
|
_NoBreakYOffset = 0;
|
|
}
|
|
//private void GeneratePlaceKeeper(SectionInfo pkSection, ProcedureInfo myProcedure, PdfContentByte cb, PdfLayer textLayer)
|
|
//{
|
|
// iTextSharp.text.pdf.PdfWriter writer = cb.PdfWriter;
|
|
// float _PointsPerPage = 792;
|
|
// float yTopMargin = _PointsPerPage - (float)pkSection.MyDocStyle.Layout.TopMargin;
|
|
// float yBottomMargin = Math.Max(0, yTopMargin - (float)pkSection.MyDocStyle.Layout.PageLength); // - 2 * vlnPrintObject.SixLinesPerInch);
|
|
// if (textLayer != null) cb.BeginLayer(textLayer);
|
|
// PlacekeeperData pkdata = pkSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.PlacekeeperData;
|
|
// ItemInfo procItem = ItemInfo.Get(myProcedure.ItemID);
|
|
// lastyLocation = 0;
|
|
// AddSectionToPK(pkSection, procItem, pkdata, cb, yTopMargin, 0);
|
|
// if (textLayer != null) cb.EndLayer();
|
|
// cb.PdfDocument.NewPage();
|
|
// //_MyLog.InfoFormat("NewPage 4 {0}", cb.PdfWriter.CurrentPageNumber);
|
|
// _NoBreakYOffset = 0;
|
|
//}
|
|
float lastyLocation = 0;
|
|
private string GetRtfToC(string txt, TableOfContentsData tOfCData)
|
|
{
|
|
return GetRtfToC(txt, tOfCData, null);
|
|
}
|
|
private string GetRtfToC(string txt, TableOfContentsData tOfCData, VE_Font overrideFont)
|
|
{
|
|
StringBuilder _RtfSB = new StringBuilder();
|
|
VEPROMS.CSLA.Library.DisplayText toctxt = new VEPROMS.CSLA.Library.DisplayText(txt, tOfCData.Font, false);
|
|
System.Drawing.Font myFont = toctxt.TextFont.WindowsFont;
|
|
if (overrideFont != null)
|
|
{
|
|
toctxt = new VEPROMS.CSLA.Library.DisplayText(txt, overrideFont, false);
|
|
myFont = overrideFont.WindowsFont;//toctxt.TextFont.WindowsFont;
|
|
}
|
|
_RtfSB.Append(vlnPrintObject.AddFontTable(myFont));
|
|
_RtfSB.Append(toctxt.StartText);
|
|
_RtfSB.Append("}");
|
|
return _RtfSB.ToString();
|
|
}
|
|
private float AddSectionToTOC(SectionInfo tocSection, ItemInfo ii, TableOfContentsData tOfC, PdfContentByte cb, float yPageStart, float yLocation)
|
|
{
|
|
// The following adjustments are for WCN1:
|
|
// for xAdjNumber: 6 is for 1 char less in 16bit (\promsnt\exe\print\tabocont.c, method 'howMany'.
|
|
// 1.2 is a tweak to get output to match between 16 & 32 bit.
|
|
// for xAdjTitle: .8 & 1.2 are both tweaks to get output to match.
|
|
// for xAdjTitleIndent: 6 is for 1 char less. 2.4 is a tweak
|
|
float xAdjNumber = -6 + 1.2F;
|
|
float xAdjTitle = .8F + 1.2F;
|
|
float xAdjTitleIndent = -6 + 2.4F;
|
|
float yadj = 0.5F; // tweak to get 16 & 32 bit output to match.
|
|
|
|
float yPageStartAdj = yPageStart - yadj;
|
|
float leftMargin = (float)tocSection.MyDocStyle.Layout.LeftMargin;
|
|
float secNumPos = (float)tOfC.TofCSecNumPos + xAdjNumber;
|
|
float secTitlePos = (float)tOfC.TofCSecTitlePos + xAdjTitle;
|
|
float secPagePos = (float)tOfC.TofCPageNumPos + xAdjNumber;
|
|
float height = tOfC.Font.WindowsFont.Size * 1.5F;
|
|
if (ii.Sections != null)
|
|
{
|
|
foreach (SectionInfo mySection in ii.Sections)
|
|
{
|
|
SectionConfig sc = mySection.MyConfig as SectionConfig;
|
|
if ((mySection.MyDocStyle != null && mySection.MyDocStyle.IncludeInTOC && (sc == null || sc.Section_TOC != "Y"))
|
|
|| ((mySection.MyDocStyle == null || !mySection.MyDocStyle.IncludeInTOC) && (sc != null && sc.Section_TOC == "Y")))
|
|
{
|
|
// need to do the section number, section title & page number. Page number
|
|
// has to be put on at end after number of page is known, so use a Template.
|
|
string tmptxt = mySection.MyContent.Number == null || mySection.MyContent.Number == "" ? " " : mySection.MyContent.Number;
|
|
string rtfText = GetRtfToC(tmptxt, tOfC);
|
|
Paragraph myparagraphn = vlnPrintObject.RtfToParagraph(rtfText);
|
|
float width = 0;
|
|
foreach (Chunk chkt in myparagraphn.Chunks)
|
|
width += chkt.GetWidthPoint();
|
|
float numwidth = width;
|
|
float yBottomMargin = yPageStart - (float)tocSection.MyDocStyle.Layout.PageLength + (2 * vlnPrintObject.SixLinesPerInch);
|
|
Rtf2Pdf.Offset = new PointF(0, 2.5F);
|
|
|
|
// for indenting of subsections, count up tree. Only start indenting
|
|
// at third level, i.e. not indent on 1.0 and 1.1, but indent on 1.1.1:
|
|
int level = 0;
|
|
ItemInfo iilvl = mySection as ItemInfo;
|
|
while (!iilvl.IsProcedure)
|
|
{
|
|
level++;
|
|
iilvl = iilvl.MyParent;
|
|
}
|
|
// check what level the plant wants the auto ToC indented:
|
|
int tofCNumLevels = tocSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.TableOfContentsData.TofCNumLevels ?? 0;
|
|
if (tofCNumLevels > 0 && level > tofCNumLevels) return yLocation;
|
|
|
|
int startIndentAfterLevel = tocSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.TableOfContentsData.TofCStartIndentAfterLevel ?? 2; //
|
|
//level = level <= 2 ? 0 : level - 2; // no indenting until third level
|
|
level = level <= startIndentAfterLevel ? 0 : level - startIndentAfterLevel;
|
|
float indentOffset = (level * (secTitlePos - secNumPos));
|
|
|
|
// if the starting column of text would be in 'middle of' the number, just put it
|
|
// a few spaces after the number. The '18' below represents 3 chars.
|
|
float adjSecTitlePos = secTitlePos + indentOffset + (level * 6);
|
|
if (secNumPos + numwidth + indentOffset > secTitlePos + indentOffset)
|
|
adjSecTitlePos = secNumPos + numwidth + 18 - xAdjTitleIndent + indentOffset;
|
|
|
|
// Do the title first since it may wrap to 2nd line and this is an issue for
|
|
// doing a pagebreak, i.e. may cause a page break when the number on a single line
|
|
// would not.
|
|
//if (tocSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.TableOfContentsData
|
|
if (level == 0 && tocSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.TableOfContentsData.TofCUnderlineFirstLevelTitle)
|
|
{
|
|
VE_Font ovrFont = new VE_Font(tOfC.Font.Family, (int)tOfC.Font.Size,(E_Style)tOfC.Font.Style | E_Style.Underline, (float)tOfC.Font.CPI);
|
|
rtfText = GetRtfToC(mySection.MyContent.Text, tOfC, ovrFont);
|
|
}
|
|
else
|
|
rtfText = GetRtfToC(mySection.MyContent.Text, tOfC);
|
|
Paragraph myparagrapht = vlnPrintObject.RtfToParagraph(rtfText);
|
|
width = secPagePos - adjSecTitlePos - 6;
|
|
float savTitleWid = width;
|
|
// for South Texas Table of Contents
|
|
// if there is no section number (we put a blank in tmptxt) then move the section title over to the section number position
|
|
float retval = Rtf2Pdf.TextAt(cb, myparagrapht, leftMargin + ((tOfC.TofCSecNumPos == tOfC.TofCSecTitlePos && tmptxt.Equals(" "))? secNumPos : adjSecTitlePos), yPageStart - yLocation, width, height, "", yBottomMargin);
|
|
if (retval == 0) // couldn't fit, flags need for a page break.
|
|
{
|
|
NewPage();
|
|
_MyHelper.ResetSvg(); // needed to reset so that PSNotFirst pagelist justify flag gets used for BGE
|
|
yLocation = lastyLocation = 0;
|
|
retval = Rtf2Pdf.TextAt(cb, myparagrapht, leftMargin + adjSecTitlePos, yPageStart - yLocation, width, height, "", yBottomMargin);
|
|
}
|
|
float ttlRetval = retval;
|
|
float savTitleFillWidth = Rtf2Pdf.FillWidth;
|
|
|
|
// Now do the section number. Retval is the ylocation on page after the text
|
|
// is put out.
|
|
retval = Rtf2Pdf.TextAt(cb, myparagraphn, leftMargin + secNumPos + indentOffset, yPageStart - yLocation, numwidth * 1.3F, height, "", yBottomMargin);
|
|
|
|
float lSpace = (float)(tOfC.TofCLineSpacing ?? 1) * vlnPrintObject.SixLinesPerInch;
|
|
|
|
// adjust ylocation for pagenumber - the ylocation will get reset if the
|
|
// section title split on 2 lines and the page number needs to be on the 2nd line.
|
|
// Only do this if the title is not empty (the code was meant for if title spans more than a line)
|
|
if (retval != ttlRetval && mySection.MyContent.Text != null && mySection.MyContent.Text != "") yLocation += (retval - ttlRetval);
|
|
|
|
// retval = the minimum (further down the page) between section number and
|
|
// title - this accounts for multi line title.
|
|
retval = Math.Min(retval, ttlRetval);
|
|
lastyLocation = retval;
|
|
|
|
// check that the page number should be in the TOC (some BGE sections do not have the page number)
|
|
if (!((mySection.MyDocStyle.StructureStyle.Style & E_DocStructStyle.DontNumberInTOC) == E_DocStructStyle.DontNumberInTOC))
|
|
{
|
|
// add a template for the page number:
|
|
// if the space character is not null & is not a space, the we've got to put out
|
|
// these between the section title & the page number
|
|
if (tOfC.TofCSpaceChar != null && tOfC.TofCSpaceChar != "" && tOfC.TofCSpaceChar != " ")
|
|
{
|
|
width = 0;
|
|
foreach (Chunk chkt in myparagrapht.Chunks)
|
|
width += chkt.GetWidthPoint();
|
|
|
|
// get height - if two lines high, need width of 2nd line for adding
|
|
// space characters
|
|
float heightTtl = vlnPrintObject.GetHeight(cb, myparagrapht, string.Empty, savTitleWid, false);
|
|
string spaceStr = "";
|
|
float startSpace = 0;
|
|
// the '6's in the next few code lines & in the 'while' loop below allows the placement of the dots (or other space character)
|
|
// to be not too close to section title & page number.
|
|
if (heightTtl > vlnPrintObject.SixLinesPerInch)
|
|
{
|
|
// this title is 2 or more lines, find start of leader dots by determining length of text
|
|
// on 2nd line (the savTitleFillWidth is the widest line of the split title)
|
|
float secondLineWidth = width - savTitleFillWidth;
|
|
startSpace = leftMargin + adjSecTitlePos + secondLineWidth + 6;
|
|
}
|
|
else
|
|
startSpace = leftMargin + adjSecTitlePos + width + 6;
|
|
// If the page number is Right justified, need less space characters ('.') so that page number
|
|
// doesn't have the last space character overwriting the 1st digit:
|
|
int endJust = (tOfC.TofCPageNumAlign.ToUpper() == "RIGHT") ? 18 : 6;
|
|
|
|
float endSpace = leftMargin + secPagePos - endJust;
|
|
float numSpace = endSpace - startSpace;
|
|
rtfText = GetRtfToC(tOfC.TofCSpaceChar, tOfC);
|
|
Paragraph tmpmyparagraph = vlnPrintObject.RtfToParagraph(rtfText);
|
|
float spacchrwid = 0;
|
|
foreach (Chunk chkt in tmpmyparagraph.Chunks)
|
|
spacchrwid += chkt.GetWidthPoint();
|
|
while (numSpace > 6)
|
|
{
|
|
spaceStr = spaceStr + tOfC.TofCSpaceChar;
|
|
numSpace -= spacchrwid;
|
|
}
|
|
|
|
rtfText = GetRtfToC(spaceStr, tOfC);
|
|
Paragraph myparagraphs = vlnPrintObject.RtfToParagraph(rtfText);
|
|
retval = Rtf2Pdf.TextAt(cb, myparagraphs, startSpace, yPageStart - yLocation, endSpace - startSpace, height, "", yBottomMargin);
|
|
|
|
}
|
|
// if in the pre-table of content list, just put the page number out as text.
|
|
// otherwise, add a template _MyHelper.MyTOCPageCounts
|
|
string key = "TOC" + mySection.ItemID.ToString();
|
|
if (mySection.IsAutoTOCSection || _MyHelper.MyTOCPageNums.ContainsKey(key))
|
|
{
|
|
string pnum = _MyHelper.MyTOCPageNums.ContainsKey(key) ? _MyHelper.MyTOCPageNums[key].ToString() : (_MyHelper.CurrentTOCPageNumber + 1).ToString();
|
|
rtfText = GetRtfToC(pnum, tOfC);
|
|
Paragraph myparagraphp = vlnPrintObject.RtfToParagraph(rtfText);
|
|
width = pnum.Length * 6;
|
|
retval = Rtf2Pdf.TextAt(cb, myparagraphp, leftMargin + secPagePos, yPageStart - yLocation, width, height, "", yBottomMargin);
|
|
}
|
|
else
|
|
AddTemplateTOCPageCounts(tOfC, yLocation, yPageStartAdj, leftMargin, secPagePos, height, mySection);
|
|
}
|
|
|
|
yLocation += (float)(tOfC.TofCLineSpacing ?? 1) * vlnPrintObject.SixLinesPerInch;
|
|
}
|
|
yLocation = AddSectionToTOC(tocSection, mySection, tOfC, cb, yPageStart, yLocation);
|
|
}
|
|
}
|
|
return yLocation;
|
|
}
|
|
|
|
private void AddTemplateTOCPageCounts(TableOfContentsData tOfC, float yLocation, float yPageStartAdj, float leftMargin, float secPagePos, float height, SectionInfo mySection)
|
|
{
|
|
string key = "TOC" + mySection.ItemID.ToString();
|
|
PdfTemplate tmp = _MyHelper.MyTOCPageCounts.AddToTemplateList(key, _MyHelper.MyPdfWriter, "{TOCPAGE}", tOfC.Font.WindowsFont, (tOfC.TofCPageNumAlign.ToUpper() == "RIGHT") ? Element.ALIGN_RIGHT : Element.ALIGN_LEFT, PrintOverride.TextColor);
|
|
_MyHelper.MyPdfContentByte.AddTemplate(tmp, leftMargin + secPagePos, (yPageStartAdj - yLocation) - height / 2);
|
|
}
|
|
|
|
//private string GetRtfPlacekeeper(string txt, PlacekeeperData pkCData)
|
|
//{
|
|
// StringBuilder _RtfSB = new StringBuilder();
|
|
// Volian.Controls.Library.DisplayText pktxt = new Volian.Controls.Library.DisplayText(txt, pkCData.Font, false);
|
|
// System.Drawing.Font myFont = pktxt.TextFont.WindowsFont;
|
|
// _RtfSB.Append(vlnPrintObject.AddFontTable(myFont));
|
|
// _RtfSB.Append(pktxt.StartText);
|
|
// _RtfSB.Append("}");
|
|
// return _RtfSB.ToString();
|
|
//}
|
|
//private float AddSectionToPK(SectionInfo pkSection, ItemInfo ii, PlacekeeperData pkData, PdfContentByte cb, float yPageStart, float yLocation)
|
|
//{
|
|
// SectionConfig pkSC = pkSection.MyConfig as SectionConfig;
|
|
// if (pkSC.Section_Placekeeper != "Y") return yLocation; // automatic generation of Placekeeper turned off
|
|
// float xAdjNumber = -6 + 1.2F;
|
|
// float xAdjTitle = .8F + 1.2F;
|
|
// float xAdjTitleIndent = -6 + 2.4F;
|
|
// float yadj = 0.5F; // tweak to get 16 & 32 bit output to match.
|
|
|
|
// float yPageStartAdj = yPageStart - yadj;
|
|
// float leftMargin = (float)pkSection.MyDocStyle.Layout.LeftMargin;
|
|
// //float secNumPos = (float)tOfC.TofCSecNumPos + xAdjNumber;
|
|
// //float secTitlePos = (float)tOfC.TofCSecTitlePos + xAdjTitle;
|
|
// //float secPagePos = (float)tOfC.TofCPageNumPos + xAdjNumber;
|
|
// //float height = tOfC.Font.WindowsFont.Size * 1.5F;
|
|
// if (ii.Sections != null)
|
|
// {
|
|
// foreach (SectionInfo mySection in ii.Sections)
|
|
// {
|
|
// SectionConfig sc = mySection.MyConfig as SectionConfig;
|
|
// if (mySection.ItemID != pkSection.ItemID && sc != null && sc.Section_Placekeeper == "Y")
|
|
// {
|
|
// // Look at each step in the section and build a Placekeeper for those steps that are marked
|
|
|
|
// // need to do the section number, section title & page number. Page number
|
|
// // has to be put on at end after number of page is known, so use a Template.
|
|
// //string tmptxt = mySection.MyContent.Number == null || mySection.MyContent.Number == "" ? " " : mySection.MyContent.Number;
|
|
// //string rtfText = GetRtfPlacekeeper(tmptxt, pkData);//GetRtfToC(tmptxt, tOfC);
|
|
// //Paragraph myparagraphn = vlnPrintObject.RtfToParagraph(rtfText);
|
|
// float width = 0;
|
|
// //foreach (Chunk chkt in myparagraphn.Chunks)
|
|
// // width += chkt.GetWidthPoint();
|
|
// float numwidth = width;
|
|
// float yBottomMargin = yPageStart - (float)pkSection.MyDocStyle.Layout.PageLength + (2 * vlnPrintObject.SixLinesPerInch);
|
|
// Rtf2Pdf.Offset = new PointF(0, 2.5F);
|
|
|
|
// //// for indenting of subsections, count up tree. Only start indenting
|
|
// //// at third level, i.e. not indent on 1.0 and 1.1, but indent on 1.1.1:
|
|
// //int level = 0;
|
|
// //ItemInfo iilvl = mySection as ItemInfo;
|
|
// //while (!iilvl.IsProcedure)
|
|
// //{
|
|
// // level++;
|
|
// // iilvl = iilvl.MyParent;
|
|
// //}
|
|
// //// check what level the plant wants the auto ToC indented:
|
|
// //int tofCNumLevels = pkSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.TableOfContentsData.TofCNumLevels ?? 0;
|
|
// //if (tofCNumLevels > 0 && level > tofCNumLevels) return yLocation;
|
|
|
|
// //level = level <= 2 ? 0 : level - 2; // no indenting until third level
|
|
// //float indentOffset = (level * (secTitlePos - secNumPos));
|
|
|
|
// // if the starting column of text would be in 'middle of' the number, just put it
|
|
// // a few spaces after the number. The '18' below represents 3 chars.
|
|
// //float adjSecTitlePos = secTitlePos + indentOffset + (level * 6);
|
|
// //if (secNumPos + numwidth + indentOffset > secTitlePos + indentOffset)
|
|
// // adjSecTitlePos = secNumPos + numwidth + 18 - xAdjTitleIndent + indentOffset;
|
|
// //rtfText = GetRtfToC(mySection.MyContent.Text, tOfC);
|
|
// //Paragraph myparagrapht = vlnPrintObject.RtfToParagraph(rtfText);
|
|
// //width = secPagePos - adjSecTitlePos - 6;
|
|
// //float retval = Rtf2Pdf.TextAt(cb, myparagrapht, leftMargin + adjSecTitlePos, yPageStart - yLocation, width, height, "", yBottomMargin);
|
|
// //float ttlRetval = retval;
|
|
// //if (retval == 0)
|
|
// //{
|
|
// // cb.PdfDocument.NewPage();
|
|
// // //_MyLog.InfoFormat("NewPage 5 {0}", cb.PdfWriter.CurrentPageNumber);
|
|
// // yLocation = lastyLocation = 0;
|
|
// // retval = Rtf2Pdf.TextAt(cb, myparagrapht, leftMargin + adjSecTitlePos, yPageStart - yLocation, width, height, "", yBottomMargin);
|
|
// // ttlRetval = retval;
|
|
// //}
|
|
// //retval = Rtf2Pdf.TextAt(cb, myparagraphn, leftMargin + secNumPos + indentOffset, yPageStart - yLocation, width * 1.3F, height, "", yBottomMargin);
|
|
// //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 = lastyLocation = 0;
|
|
// // retval = Rtf2Pdf.TextAt(cb, myparagraphn, leftMargin + secNumPos + indentOffset, yPageStart - yLocation, width * 1.3F, height, "", yBottomMargin);
|
|
// //}
|
|
// //retval = Math.Min(retval, ttlRetval);
|
|
// //float lSpace = (tOfC.TofCLineSpacing == 2) ? 2 * vlnPrintObject.SixLinesPerInch : vlnPrintObject.SixLinesPerInch;
|
|
// //if (lastyLocation != 0 && ((lastyLocation - retval) > lSpace))
|
|
// // yLocation += (lastyLocation - retval - lSpace);
|
|
// //lastyLocation = retval;
|
|
|
|
// //// check that the page number should be in the TOC (some BGE sections do not have the page number)
|
|
// //if (!((mySection.MyDocStyle.StructureStyle.Style & E_DocStructStyle.DontNumberInTOC) == E_DocStructStyle.DontNumberInTOC))
|
|
// //{
|
|
// // // add a template for the page number:
|
|
// // // if the space character is not null & is not a space, the we've got to put out
|
|
// // // these between the section title & the page number
|
|
// // if (tOfC.TofCSpaceChar != null && tOfC.TofCSpaceChar != "" && tOfC.TofCSpaceChar != " ")
|
|
// // {
|
|
// // width = 0;
|
|
// // foreach (Chunk chkt in myparagrapht.Chunks)
|
|
// // width += chkt.GetWidthPoint();
|
|
// // float startSpace = leftMargin + adjSecTitlePos + width;
|
|
// // float endSpace = leftMargin + secPagePos;
|
|
// // float numSpace = endSpace - startSpace;
|
|
// // string spaceStr = "";
|
|
// // rtfText = GetRtfToC(tOfC.TofCSpaceChar, tOfC);
|
|
// // Paragraph tmpmyparagraph = vlnPrintObject.RtfToParagraph(rtfText);
|
|
// // float spacchrwid = 0;
|
|
// // foreach (Chunk chkt in tmpmyparagraph.Chunks)
|
|
// // spacchrwid += chkt.GetWidthPoint();
|
|
// // while (numSpace > 0)
|
|
// // {
|
|
// // spaceStr = spaceStr + tOfC.TofCSpaceChar;
|
|
// // numSpace -= spacchrwid;
|
|
// // }
|
|
// // rtfText = GetRtfToC(spaceStr, tOfC);
|
|
// // Paragraph myparagraphs = vlnPrintObject.RtfToParagraph(rtfText);
|
|
// // retval = Rtf2Pdf.TextAt(cb, myparagraphs, startSpace, yPageStart - yLocation, endSpace - startSpace, height, "", yBottomMargin);
|
|
// // }
|
|
// // // if in the pre-table of content list, just put the page number out as text.
|
|
// // // otherwise, add a template _MyHelper.MyTOCPageCounts
|
|
// // string key = "TOC" + mySection.ItemID.ToString();
|
|
// // if (mySection.IsAutoTOCSection || _MyHelper.MyTOCPageNums.ContainsKey(key))
|
|
// // {
|
|
// // string pnum = _MyHelper.MyTOCPageNums.ContainsKey(key) ? _MyHelper.MyTOCPageNums[key].ToString() : (_MyHelper.CurrentTOCPageNumber + 1).ToString();
|
|
// // rtfText = GetRtfToC(pnum, tOfC);
|
|
// // Paragraph myparagraphp = vlnPrintObject.RtfToParagraph(rtfText);
|
|
// // width = pnum.Length * 6;
|
|
// // retval = Rtf2Pdf.TextAt(cb, myparagraphp, leftMargin + secPagePos, yPageStart - yLocation, width, height, "", yBottomMargin);
|
|
// // }
|
|
// // else
|
|
// // AddTemplateTOCPageCounts(tOfC, yLocation, yPageStartAdj, leftMargin, secPagePos, height, mySection);
|
|
// //}
|
|
|
|
// yLocation += vlnPrintObject.SixLinesPerInch;
|
|
// }
|
|
// //yLocation = AddSectionToTOC(tocSection, mySection, tOfC, cb, yPageStart, yLocation);
|
|
// }
|
|
// }
|
|
// return yLocation;
|
|
//}
|
|
|
|
//private void AddTemplatePKPageCounts(TableOfContentsData tOfC, float yLocation, float yPageStartAdj, float leftMargin, float secPagePos, float height, SectionInfo mySection)
|
|
//{
|
|
// string key = "PK" + mySection.ItemID.ToString();
|
|
// PdfTemplate tmp = _MyHelper.MyTOCPageCounts.AddToTemplateList(key, _MyHelper.MyPdfWriter, "{TOCPAGE}", tOfC.Font.WindowsFont, Element.ALIGN_LEFT, PrintOverride.TextColor);
|
|
// _MyHelper.MyPdfContentByte.AddTemplate(tmp, leftMargin + secPagePos, (yPageStartAdj - yLocation) - height / 2);
|
|
//}
|
|
private static void PrintTextMessage(PdfContentByte cb, string message, PdfLayer textLayer)
|
|
{
|
|
if (textLayer != null) cb.BeginLayer(textLayer);
|
|
float fontSize = 30;
|
|
ColumnText ct = new ColumnText(cb);
|
|
iTextSharp.text.Font font = FontFactory.GetFont("Arial", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, fontSize,iTextSharp.text.Font.NORMAL, new iTextSharp.text.Color(PrintOverride.TextColor));
|
|
Chunk chk = new Chunk(message, font);
|
|
float xCenter = cb.PdfDocument.PageSize.Width / 2;
|
|
float yCenter = cb.PdfDocument.PageSize.Height / 2;
|
|
float width = chk.GetWidthPoint() * 1.01F;
|
|
float height = fontSize * 1.5F;
|
|
ct.SetSimpleColumn(xCenter - width / 2, yCenter - height / 2, xCenter + width / 2, yCenter + height / 2);
|
|
Phrase ph = new Phrase(chk);
|
|
ct.AddElement(ph);
|
|
cb.SetColorFill(new iTextSharp.text.Color(PrintOverride.TextColor));
|
|
ct.Go();
|
|
if (textLayer != null) cb.EndLayer();
|
|
}
|
|
private float _NoBreakYOffset = 0;
|
|
private float _NoBreakYPageStart = 0;
|
|
private void CreateStepPdf(SectionInfo section, PdfContentByte cb)
|
|
{
|
|
int profileDepth = ProfileTimer.Push(">>>> CreateStepPdf");
|
|
//PrintTimer pt = new PrintTimer();
|
|
iTextSharp.text.pdf.PdfWriter writer = cb.PdfWriter;
|
|
ItemInfo myItemInfo = section as ItemInfo;
|
|
// 792: 72 * 11 inches - TopRow - Top is high value
|
|
float _PointsPerPage = 792;
|
|
float yTopMargin = _PointsPerPage - (float)myItemInfo.MyDocStyle.Layout.TopMargin;
|
|
yTopMargin -= _MyHelper.AdjustTopMarginForMultiLinePageListItems;
|
|
// the following line was modified to comment out the - 2 * SixLinesPerInch. this fixed a pagination problem with WCN EMG E-3.
|
|
float yBottomMargin = Math.Max(0, yTopMargin - (float)myItemInfo.MyDocStyle.Layout.PageLength); // - 2 * vlnPrintObject.SixLinesPerInch);
|
|
vlnParagraph.PathPrefix = myItemInfo.Path;
|
|
//Rtf2Pdf.PdfDebug = true;
|
|
Rtf2Pdf.Offset = new PointF(0, 2.5F);
|
|
if (section.MyDocStyle.LandscapePageList)
|
|
{
|
|
if ((section.MyConfig as SectionConfig).Section_Pagination == SectionConfig.SectionPagination.Separate)
|
|
{
|
|
System.Drawing.Drawing2D.Matrix myMatrix = new System.Drawing.Drawing2D.Matrix(0, 1, -1, 0, cb.PdfDocument.PageSize.Height, 0);
|
|
cb.Transform(myMatrix);
|
|
}
|
|
}
|
|
else
|
|
_MyHelper.IsLandscape = false;
|
|
_MyHelper.ChangeBarDefinition = MyChangeBarDefinition;
|
|
//pt.Description = "vlnParagrph";
|
|
vlnParagraph myParagraph = new vlnParagraph(null, cb, myItemInfo, (float)myItemInfo.MyDocStyle.Layout.LeftMargin, _NoBreakYOffset, 0, myItemInfo.ColumnMode, myItemInfo.ActiveFormat, null, null, 0,true,this);
|
|
//pt.Description = "After vlnParagrph";
|
|
float localYPageStart = 0;
|
|
float yPageStart = yTopMargin;
|
|
if (myItemInfo.HasChildren || myItemInfo.MyDocVersion.DocVersionConfig.SelectedSlave > 0 || (myItemInfo.ActiveFormat.PlantFormat.FormatData.Express && myItemInfo.MyDocStyle.OptionalSectionContent))
|
|
{
|
|
localYPageStart = myParagraph.ToPdf(cb, yPageStart, ref yTopMargin, ref yBottomMargin);
|
|
if (myParagraph.MyPlaceKeeper != null)
|
|
_MyHelper.MyPlacekeepers.Add(myParagraph.MyPlaceKeeper); // add this step text to the PlaceKeeper (Calvert Cliffs)
|
|
if (myParagraph.MyContAct != null)
|
|
_MyHelper.MyContActSteps.Add(myParagraph.MyContAct); // add this step to the Continuous Action Summary
|
|
}
|
|
else if (!myItemInfo.MyDocStyle.OptionalSectionContent)
|
|
PrintTextMessage(cb, "No Section Content", _TextLayer);
|
|
SectionConfig.SectionPagination sp = SectionConfig.SectionPagination.Separate; // always the default
|
|
ItemInfo nxtItem = section.NextItem;
|
|
if (nxtItem != null)
|
|
{
|
|
// if this section & the next section are not accessory pages, see if there is continuous pagination,
|
|
// i.e. no page break between them.
|
|
if (section.IsStepSection && nxtItem.IsStepSection)
|
|
{
|
|
SectionInfo si = nxtItem as SectionInfo;
|
|
SectionConfig sc = si.SectionConfig;
|
|
try
|
|
{
|
|
if (sc != null) sp = sc.Section_Pagination;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
sp = SectionConfig.SectionPagination.Separate;
|
|
}
|
|
}
|
|
}
|
|
if (sp == SectionConfig.SectionPagination.Separate)
|
|
{
|
|
if (section.MyDocStyle.LandscapePageList)
|
|
{
|
|
_MyHelper.IsLandscape = false;
|
|
}
|
|
NewPage(true); // end of step section
|
|
//_MyLog.InfoFormat("NewPage 6 {0}", cb.PdfWriter.CurrentPageNumber);
|
|
_NoBreakYOffset = 0;
|
|
yPageStart = yTopMargin;
|
|
}
|
|
else
|
|
{
|
|
if (nxtItem != null && nxtItem.MyPrevious != null && nxtItem.ActiveFormat.PlantFormat.FormatData.SectData.SectionHeader.Level0Big)
|
|
localYPageStart -= 12;
|
|
if (_MyHelper.BottomMessage != null)
|
|
{
|
|
_MyHelper.DrawBottomMessage(cb);
|
|
localYPageStart += 12;
|
|
myParagraph.YBottomMost += 24; // two lines.
|
|
}
|
|
float tmplocal = localYPageStart;
|
|
_NoBreakYOffset = myParagraph.YBottomMost;
|
|
float yOffset = localYPageStart - yTopMargin;
|
|
_NoBreakYOffset -= yOffset;
|
|
yPageStart = localYPageStart;
|
|
Volian.Base.Library.DebugText.WriteLine("NOBREAK:{0},'{1}','{2}','{3}','{4}','{5}'", section.ItemID, tmplocal, yTopMargin, localYPageStart, _NoBreakYOffset, myParagraph.YBottomMost);
|
|
}
|
|
OnStatusChanged("StepSection converted to PDF " + section.ShortPath, PromsPrinterStatusType.BuildStep);
|
|
//pt.Description = "End";
|
|
ProfileTimer.Pop(profileDepth);
|
|
}
|
|
public void DoFoldoutPage(PdfContentByte cb, string str, PdfLayer textLayer, VlnSvgPageHelper myPageHelper, int foldoutindx, bool insertBlankPages)
|
|
{
|
|
if (_MyFoldoutSection == null || _MyFoldoutSection.Count==0) return;
|
|
|
|
// if the very first page to be output is a 'foldout', treat this as a special case, since
|
|
// if duplex printing is on, the foldout should always be on the left side, i.e. or behind
|
|
// the document text. The option PROMS provides is to either:
|
|
// 1) Skip doing the foldout before the first page, if the 'InsertBlankPages' isn't set, by not checking
|
|
// the checkbox on the print dialog.
|
|
// 2) Insert a blank page as the first page, if the 'InsertBlankPages' is set.
|
|
if (!myPageHelper.PrintedAPage && !insertBlankPages) return;
|
|
if (!myPageHelper.PrintedAPage)
|
|
{
|
|
// only insert a blank page if this is the very first page printed & section has a foldout
|
|
// and the checkbox on the print dialog to add blank pages is checked. This will put out a blank page as
|
|
// as the first page so that duplex printing is correct for this condition.
|
|
myPageHelper.OnBlankPage = true;
|
|
cb.PdfDocument.Add(new iTextSharp.text.Table(1));
|
|
NewPage();
|
|
}
|
|
|
|
SectionInfo saveSect = myPageHelper.MySection;
|
|
myPageHelper.MySection = _MyFoldoutSection[foldoutindx];
|
|
myPageHelper.OnFoldoutPage = true;
|
|
if (_MyFoldoutReader != null)
|
|
{
|
|
bool doimport2 = true;
|
|
PdfImportedPage fgPage = null;
|
|
try
|
|
{ // read saved foldout page
|
|
fgPage = cb.PdfWriter.GetImportedPage(_MyFoldoutReader[foldoutindx],1);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(ex);
|
|
doimport2 = false;
|
|
}
|
|
if (doimport2)
|
|
{// put the saved foldout page into the PDF
|
|
AddImportedPageToLayer(cb.PdfWriter.DirectContent, textLayer, fgPage, 0, 0);
|
|
if (DebugPagination.IsOpen) 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);
|
|
NewPage();// Temporary for foldout/16bit-32bit page alignment
|
|
//_MyLog.InfoFormat("NewPage 8 {0}", cb.PdfWriter.CurrentPageNumber);
|
|
myPageHelper.MySection = saveSect;
|
|
myPageHelper.OnFoldoutPage = false;
|
|
}
|
|
public static byte[] WatermarkPDF(byte[] buffer, string watermark)
|
|
{
|
|
PdfReader reader = new PdfReader(buffer);
|
|
MemoryStream ms = new MemoryStream();
|
|
PdfStamper stamper = new PdfStamper(reader, ms);
|
|
PdfLayer layer = new PdfLayer("Watermark", stamper.Writer);
|
|
layer.SetPrint("Print", true);
|
|
for (int i = 1; i <= reader.NumberOfPages; i++)
|
|
{
|
|
PdfContentByte cb = stamper.GetUnderContent(i);
|
|
cb.SaveState();
|
|
cb.BeginLayer(layer);
|
|
SvgWatermark wm = new SvgWatermark(cb, watermark, System.Drawing.Color.Blue, .15F);
|
|
//wm.SetSquareDotPattern(.7F);
|
|
//wm.SetTextPattern(8, 3);
|
|
//wm.SetTextPattern2(8);
|
|
//wm.SetHashPattern(1, 6);
|
|
//wm.SetDotPattern(5, 2);
|
|
wm.Draw();
|
|
cb.EndLayer();
|
|
cb.RestoreState();
|
|
}
|
|
stamper.Close();
|
|
/*
|
|
cb.SaveState();
|
|
if (_WatermarkLayer != null) cb.BeginLayer(_WatermarkLayer);
|
|
SvgWatermark myWatermark = new SvgWatermark(cb, Watermark, System.Drawing.Color.Blue, .15F);
|
|
myWatermark.SetSquareDotPattern(.7F);
|
|
myWatermark.Draw();
|
|
if (_WatermarkLayer != null) cb.EndLayer();
|
|
cb.RestoreState();
|
|
*/
|
|
return ms.ToArray();
|
|
}
|
|
}
|
|
public class ReaderHelper
|
|
{
|
|
private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
|
private Dictionary<string, PdfImportedPage> dicPage = new Dictionary<string, PdfImportedPage>();
|
|
private Dictionary<string, iTextSharp.text.Rectangle> dicSize = new Dictionary<string, iTextSharp.text.Rectangle>();
|
|
private PromsPrinter _MyPromsPrinter;
|
|
public PromsPrinter MyPromsPrinter
|
|
{
|
|
get { return _MyPromsPrinter; }
|
|
set { _MyPromsPrinter = value; }
|
|
}
|
|
private SectionInfo _MySectionInfo;
|
|
public SectionInfo MySectionInfo
|
|
{
|
|
get { return _MySectionInfo; }
|
|
set
|
|
{
|
|
if (_MySectionInfo == null || value.ItemID != _MySectionInfo.ItemID)
|
|
{
|
|
_MySectionInfo = value;
|
|
//MyPdfFile = _MyPromsPrinter.BuildMSWordPDF(MySectionInfo);
|
|
//try
|
|
//{
|
|
// MyReader = MyPdfFile != null ? new PdfReader(MyPdfFile) : null;
|
|
// string key = string.Empty;
|
|
// for (int i = 1; i <= MyReader.NumberOfPages; i++)
|
|
// {
|
|
// key = string.Format("{0}.{1}", MySectionInfo.ItemID, i);
|
|
// dicPage.Add(key, MyPromsPrinter.MyContentByte.PdfWriter.GetImportedPage(MyReader, i));
|
|
// dicSize.Add(key, MyReader.GetPageSizeWithRotation(i));
|
|
// }
|
|
//}
|
|
//catch (Exception ex)
|
|
//{
|
|
// MyReader = null;
|
|
//}
|
|
}
|
|
}
|
|
}
|
|
private string _MyPdfFile;
|
|
public string MyPdfFile
|
|
{
|
|
get { return _MyPdfFile; }
|
|
set { _MyPdfFile = value; }
|
|
}
|
|
private int _DocID;
|
|
public int DocID
|
|
{
|
|
get { return _DocID; }
|
|
set { _DocID = value; }
|
|
}
|
|
private PdfReader _MyReader;
|
|
public PdfReader MyReader
|
|
{
|
|
get { return _MyReader; }
|
|
set { _MyReader = value; }
|
|
}
|
|
public ReaderHelper(PromsPrinter pp)
|
|
{
|
|
MyPromsPrinter = pp;
|
|
//this.LoadTree(pp.MyItem);
|
|
}
|
|
public PdfImportedPage GetPage(SectionInfo sectInfo, int pageNumber)
|
|
{
|
|
string key = string.Format("{0}.{1}", sectInfo.ItemID, pageNumber);
|
|
return dicPage[key];
|
|
}
|
|
public iTextSharp.text.Rectangle GetSize(SectionInfo sectInfo, int pageNumber)
|
|
{
|
|
string key = string.Format("{0}.{1}", sectInfo.ItemID, pageNumber);
|
|
if(dicSize.ContainsKey(key))
|
|
return dicSize[key];
|
|
return PageSize.LETTER;
|
|
}
|
|
public void LoadTree(ItemInfo ii)
|
|
{
|
|
dicPage = new Dictionary<string, PdfImportedPage>();
|
|
dicSize = new Dictionary<string, iTextSharp.text.Rectangle>();
|
|
LoadSectionTree(ii);
|
|
}
|
|
private void LoadSectionTree(ItemInfo ii)
|
|
{
|
|
foreach (SectionInfo si in ii.Sections)
|
|
{
|
|
if (si.IsStepSection)
|
|
{
|
|
if(si.Sections != null)LoadSectionTree(si);
|
|
}
|
|
else
|
|
{
|
|
MyPdfFile = _MyPromsPrinter.BuildMSWordPDF(si);
|
|
if (MyPdfFile != null)
|
|
{
|
|
try
|
|
{
|
|
MyReader = MyPdfFile != null ? new PdfReader(MyPdfFile) : null;
|
|
string key = string.Empty;
|
|
for (int i = 1; i <= MyReader.NumberOfPages; i++)
|
|
{
|
|
key = string.Format("{0}.{1}", si.ItemID, i);
|
|
dicPage.Add(key, MyPromsPrinter.MyContentByte.PdfWriter.GetImportedPage(MyReader, i));
|
|
iTextSharp.text.Rectangle rectgl = MyReader.GetPageSizeWithRotation(i);
|
|
// If the word page is set to landscape, but the the document sytle is not landscape, then flip the height and width (put back to portrait)
|
|
if (!((si.MyDocStyle.StructureStyle.Style & E_DocStructStyle.DSS_WordContentLandscaped) == E_DocStructStyle.DSS_WordContentLandscaped) && rectgl.Height < rectgl.Width)
|
|
rectgl = new iTextSharp.text.Rectangle(rectgl.Height, rectgl.Width);
|
|
dicSize.Add(key, rectgl);
|
|
//dicSize.Add(key, MyReader.GetPageSizeWithRotation(i));
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, ex.GetType().FullName, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
_MyLog.Warn(string.Format("Error in LoadSectionTree [{0}],{1}.{2}", si.ItemID, si.DisplayNumber, si.DisplayText), ex);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//public class PrintTimer
|
|
//{
|
|
// private DateTime _StartTime = DateTime.Now;
|
|
|
|
// public DateTime StartTime
|
|
// {
|
|
// get { return _StartTime; }
|
|
// set { _StartTime = value; }
|
|
// }
|
|
// private string _Description = "Start";
|
|
// public string Description
|
|
// {
|
|
// get { return _Description; }
|
|
// set
|
|
// {
|
|
// DateTime dtNext = DateTime.Now;
|
|
// //Console.WriteLine("{0},'{1}'", TimeSpan.FromTicks(dtNext.Ticks - LastTime.Ticks).TotalSeconds, Description);
|
|
// _Description = value;
|
|
// _LastTime = dtNext;
|
|
// }
|
|
// }
|
|
// private DateTime _LastTime = DateTime.Now;
|
|
// public DateTime LastTime
|
|
// {
|
|
// get { return _LastTime; }
|
|
// set { _LastTime = value; }
|
|
// }
|
|
//}
|
|
}
|