VAR.PdfTools.Workbench: Crude rendering of the parsed PDF.

This commit is contained in:
2017-06-24 14:52:29 +02:00
parent ebff0c2028
commit 3469593a2a
3 changed files with 122 additions and 1 deletions

View File

@@ -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;
}
}

View File

@@ -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<string> lines = new List<string>();
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));
}
}
}