diff --git a/VAR.PdfTools.Workbench/FrmPdfInfo.Designer.cs b/VAR.PdfTools.Workbench/FrmPdfInfo.Designer.cs index cb53e9c..6cecb1b 100644 --- a/VAR.PdfTools.Workbench/FrmPdfInfo.Designer.cs +++ b/VAR.PdfTools.Workbench/FrmPdfInfo.Designer.cs @@ -40,6 +40,7 @@ this.btnGetField = new System.Windows.Forms.Button(); this.txtText = new System.Windows.Forms.TextBox(); this.btnHasText = new System.Windows.Forms.Button(); + this.btnRender = new System.Windows.Forms.Button(); this.SuspendLayout(); // // lblOutputs @@ -159,11 +160,23 @@ this.btnHasText.UseVisualStyleBackColor = true; this.btnHasText.Click += new System.EventHandler(this.btnHasText_Click); // + // btnRender + // + this.btnRender.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnRender.Location = new System.Drawing.Point(397, 52); + this.btnRender.Name = "btnRender"; + this.btnRender.Size = new System.Drawing.Size(75, 23); + this.btnRender.TabIndex = 18; + this.btnRender.Text = "Render"; + this.btnRender.UseVisualStyleBackColor = true; + this.btnRender.Click += new System.EventHandler(this.btnRender_Click); + // // FrmPdfInfo // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(484, 461); + this.Controls.Add(this.btnRender); this.Controls.Add(this.txtText); this.Controls.Add(this.btnHasText); this.Controls.Add(this.txtFieldName); @@ -199,5 +212,6 @@ private System.Windows.Forms.Button btnGetField; private System.Windows.Forms.TextBox txtText; private System.Windows.Forms.Button btnHasText; + private System.Windows.Forms.Button btnRender; } } \ No newline at end of file diff --git a/VAR.PdfTools.Workbench/FrmPdfInfo.cs b/VAR.PdfTools.Workbench/FrmPdfInfo.cs index f2064be..870f855 100644 --- a/VAR.PdfTools.Workbench/FrmPdfInfo.cs +++ b/VAR.PdfTools.Workbench/FrmPdfInfo.cs @@ -1,5 +1,8 @@ using System; using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; using System.Linq; using System.Windows.Forms; @@ -154,5 +157,109 @@ namespace VAR.PdfTools.Workbench } txtOutput.Lines = lines.ToArray(); } + + private void btnRender_Click(object sender, EventArgs e) + { + if (File.Exists(txtPdfPath.Text) == false) + { + MessageBox.Show("File does not exist"); + return; + } + + const int Scale = 10; + + PdfDocument doc = PdfDocument.Load(txtPdfPath.Text); + string baseDocumentPath = Path.GetDirectoryName(txtPdfPath.Text); + string baseDocumentFilename = Path.GetFileNameWithoutExtension(txtPdfPath.Text); + + List lines = new List(); + lines.Add(string.Format("Filename : {0}", baseDocumentFilename)); + lines.Add(string.Format("Number of Pages : {0}", doc.Pages.Count)); + + int pageNumber = 1; + foreach (PdfDocumentPage page in doc.Pages) + { + double pageXMin = double.MaxValue; + double pageYMin = double.MaxValue; + double pageXMax = double.MinValue; + double pageYMax = double.MinValue; + + // Preprocess page to get max size + PdfTextExtractor extractor = new PdfTextExtractor(page); + foreach (PdfTextElement textElement in extractor.Elements) + { + double textElementXMin = textElement.GetX(); + double textElementYMax = textElement.GetY(); + double textElementXMax = textElementXMin + textElement.VisibleWidth; + double textElementYMin = textElementYMax - textElement.VisibleHeight; + + if (textElementXMax > pageXMax) { pageXMax = textElementXMax; } + if (textElementYMax > pageYMax) { pageYMax = textElementYMax; } + if (textElementXMin < pageXMin) { pageXMin = textElementXMin; } + if (textElementYMin < pageYMin) { pageYMin = textElementYMin; } + } + lines.Add(string.Format("Page {0:0000} TextElements : {1}", pageNumber, extractor.Elements.Count)); + + // Prepare page image + int pageWidth = (int)Math.Ceiling(pageXMax - pageXMin); + int pageHeight = (int)Math.Ceiling(pageYMax - pageYMin); + Bitmap bmp = CreatePageBitmap(pageWidth, pageHeight, Scale); + Graphics gc = Graphics.FromImage(bmp); + gc.Clear(Color.White); + Pen penTextElem = new Pen(Color.Blue); + Pen penTextElem2 = new Pen(Color.Red); + + // Draw text elements + foreach (PdfTextElement textElement in extractor.Elements) + { + DrawTextElement(textElement, gc, penTextElem, penTextElem2, Scale, pageHeight, pageXMin, pageYMin); + } + + // Save image to disk + string fileName = Path.Combine(baseDocumentPath, string.Format("{0}_{1:0000}.png", baseDocumentFilename, pageNumber)); + bmp.Save(fileName, ImageFormat.Png); + + pageNumber++; + } + + txtOutput.Lines = lines.ToArray(); + } + + private static Bitmap CreatePageBitmap(int pageWidth, int pageHeight, int Scale) + { + return new Bitmap( + pageWidth * Scale, + pageHeight * Scale, + PixelFormat.Format32bppArgb); + } + + private static void DrawTextElement(PdfTextElement textElement, Graphics gc, Pen penTextElem, Pen penTextElem2, int Scale, int pageHeight, double pageXMin, double pageYMin) + { + double textElementX = textElement.GetX() - pageXMin; + double textElementY = textElement.GetY() - pageYMin; + double textElementWidth = textElement.VisibleWidth; + double textElementHeight = textElement.VisibleHeight; + string textElementText = textElement.VisibleText; + string textElementFontName = (textElement.Font == null ? string.Empty : textElement.Font.Name); + + double textElementPageX = textElementX; + double textElementPageY = pageHeight - textElementY; + gc.DrawRectangle(penTextElem, + (int)(textElementPageX * Scale), + (int)(textElementPageY * Scale), + (int)(textElementWidth * Scale), + (int)(textElementHeight * Scale)); + gc.DrawRectangle(penTextElem2, + (int)((textElementPageX - 1) * Scale), + (int)((textElementPageY - 1) * Scale), + (int)((textElementWidth + 2) * Scale), + (int)((textElementHeight + 2) * Scale)); + gc.DrawString(textElementText, + new Font("Tahoma", (int)textElementHeight * Scale, GraphicsUnit.Pixel), + Brushes.Black, + (int)(textElementPageX * Scale), + (int)(textElementPageY * Scale)); + } + } } diff --git a/VAR.PdfTools.Workbench/VAR.PdfTools.Workbench.csproj b/VAR.PdfTools.Workbench/VAR.PdfTools.Workbench.csproj index 8f12fc3..f539f5e 100644 --- a/VAR.PdfTools.Workbench/VAR.PdfTools.Workbench.csproj +++ b/VAR.PdfTools.Workbench/VAR.PdfTools.Workbench.csproj @@ -79,4 +79,4 @@ --> - + \ No newline at end of file