FrmPdfInfo: Improve rendering, making more accurate the location of the glyphs.

This commit is contained in:
2017-06-26 01:49:48 +02:00
parent 52841de51b
commit 15fbec2470

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@@ -92,7 +93,7 @@ namespace VAR.PdfTools.Workbench
{ {
lines.Add(string.Format("Text({0}, {1})({2}, {3})[{4}]: \"{5}\"", lines.Add(string.Format("Text({0}, {1})({2}, {3})[{4}]: \"{5}\"",
textElement.Matrix.Matrix[0, 2], textElement.Matrix.Matrix[1, 2], textElement.VisibleWidth, textElement.VisibleHeight, textElement.Matrix.Matrix[0, 2], textElement.Matrix.Matrix[1, 2], textElement.VisibleWidth, textElement.VisibleHeight,
textElement.Font == null ? string.Empty : textElement.Font.Name, textElement.Font == null ? "#NULL#" : textElement.Font.Name,
textElement.VisibleText)); textElement.VisibleText));
} }
} }
@@ -166,7 +167,7 @@ namespace VAR.PdfTools.Workbench
return; return;
} }
const int Scale = 10; const int Scale = 5;
PdfDocument doc = PdfDocument.Load(txtPdfPath.Text); PdfDocument doc = PdfDocument.Load(txtPdfPath.Text);
string baseDocumentPath = Path.GetDirectoryName(txtPdfPath.Text); string baseDocumentPath = Path.GetDirectoryName(txtPdfPath.Text);
@@ -203,37 +204,29 @@ namespace VAR.PdfTools.Workbench
// Prepare page image // Prepare page image
int pageWidth = (int)Math.Ceiling(pageXMax - pageXMin); int pageWidth = (int)Math.Ceiling(pageXMax - pageXMin);
int pageHeight = (int)Math.Ceiling(pageYMax - pageYMin); int pageHeight = (int)Math.Ceiling(pageYMax - pageYMin);
Bitmap bmp = CreatePageBitmap(pageWidth, pageHeight, Scale); using (Bitmap bmp = new Bitmap(pageWidth * Scale, pageHeight * Scale, PixelFormat.Format32bppArgb))
Graphics gc = Graphics.FromImage(bmp); using (Graphics gc = Graphics.FromImage(bmp))
gc.Clear(Color.White); using (Pen penTextElem = new Pen(Color.Blue))
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); gc.Clear(Color.White);
// Draw text elements
foreach (PdfTextElement textElement in extractor.Elements)
{
DrawTextElement(textElement, gc, penTextElem, 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);
} }
// Save image to disk
string fileName = Path.Combine(baseDocumentPath, string.Format("{0}_{1:0000}.png", baseDocumentFilename, pageNumber));
bmp.Save(fileName, ImageFormat.Png);
pageNumber++; pageNumber++;
} }
txtOutput.Lines = lines.ToArray(); txtOutput.Lines = lines.ToArray();
} }
private static Bitmap CreatePageBitmap(int pageWidth, int pageHeight, int Scale) private static void DrawTextElement(PdfTextElement textElement, Graphics gc, Pen penTextElem, int Scale, int pageHeight, double pageXMin, double pageYMin)
{
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 textElementX = textElement.GetX() - pageXMin;
double textElementY = textElement.GetY() - pageYMin; double textElementY = textElement.GetY() - pageYMin;
@@ -244,21 +237,71 @@ namespace VAR.PdfTools.Workbench
double textElementPageX = textElementX; double textElementPageX = textElementX;
double textElementPageY = pageHeight - textElementY; double textElementPageY = pageHeight - textElementY;
gc.DrawRectangle(penTextElem,
DrawRoundedRectangle(gc, penTextElem,
(int)(textElementPageX * Scale), (int)(textElementPageX * Scale),
(int)(textElementPageY * Scale), (int)(textElementPageY * Scale),
(int)(textElementWidth * Scale), (int)(textElementWidth * Scale),
(int)(textElementHeight * Scale)); (int)(textElementHeight * Scale),
gc.DrawRectangle(penTextElem2, Scale);
(int)((textElementPageX - 1) * Scale),
(int)((textElementPageY - 1) * Scale), if (textElementHeight > 0.000)
(int)((textElementWidth + 2) * Scale), {
(int)((textElementHeight + 2) * Scale)); using (Font font = new Font("Arial", (int)(textElementHeight * Scale), GraphicsUnit.Pixel))
gc.DrawString(textElementText, {
new Font("Tahoma", (int)textElementHeight * Scale, GraphicsUnit.Pixel), foreach (PdfCharElement c in textElement.Characters)
Brushes.Black, {
(int)(textElementPageX * Scale), gc.DrawString(c.Char,
(int)(textElementPageY * Scale)); font,
Brushes.Black,
(int)((textElementPageX + c.Displacement) * Scale),
(int)(textElementPageY * Scale));
gc.FillRectangle(Brushes.Red,
(int)((textElementPageX + c.Displacement) * Scale),
(int)(textElementPageY * Scale),
2, 2);
}
}
}
}
public static GraphicsPath RoundedRect(int x, int y, int width, int height, int radius)
{
int diameter = radius * 2;
Size size = new Size(diameter, diameter);
Rectangle arc = new Rectangle(x, y, diameter, diameter);
GraphicsPath path = new GraphicsPath();
// top left arc
path.AddArc(arc, 180, 90);
// top right arc
arc.X = (x + width) - diameter;
path.AddArc(arc, 270, 90);
// bottom right arc
arc.Y = (y + height) - diameter;
path.AddArc(arc, 0, 90);
// bottom left arc
arc.X = x;
path.AddArc(arc, 90, 90);
path.CloseFigure();
return path;
}
public static void DrawRoundedRectangle(Graphics graphics, Pen pen, int x, int y, int width, int height, int cornerRadius)
{
if (graphics == null)
throw new ArgumentNullException("graphics");
if (pen == null)
throw new ArgumentNullException("pen");
using (GraphicsPath path = RoundedRect(x, y, width, height, cornerRadius))
{
graphics.DrawPath(pen, path);
}
} }
} }