VAR.PdfTools.Workbench: Crude rendering of the parsed PDF.
This commit is contained in:
14
VAR.PdfTools.Workbench/FrmPdfInfo.Designer.cs
generated
14
VAR.PdfTools.Workbench/FrmPdfInfo.Designer.cs
generated
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,4 +79,4 @@
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
</Project>
|
||||
Reference in New Issue
Block a user