mirror of
https://github.com/UglyToad/PdfPig.git
synced 2026-03-10 00:23:29 +08:00
@@ -47,7 +47,7 @@
|
||||
{
|
||||
Assert.Equal(Text, letter.Value);
|
||||
Assert.Equal(FontName, letter.FontName);
|
||||
Assert.Equal(X, letter.Position.X, 1);
|
||||
Assert.Equal(X, letter.Origin.X, 1);
|
||||
Assert.Equal(Width, letter.Width, 1);
|
||||
if (includeHeight)
|
||||
{
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
namespace UglyToad.PdfPig.Tests.Integration
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Xunit;
|
||||
|
||||
public class PigProductionHandbookTests
|
||||
@@ -49,5 +51,197 @@
|
||||
Assert.Equal(86, document.NumberOfPages);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LettersHaveCorrectPosition()
|
||||
{
|
||||
using (var document = PdfDocument.Open(GetFilename()))
|
||||
{
|
||||
var page = document.GetPage(1);
|
||||
var letters = page.Letters;
|
||||
var positions = GetPdfBoxPositionData();
|
||||
|
||||
for (var i = 0; i < letters.Count; i++)
|
||||
{
|
||||
var letter = letters[i];
|
||||
var position = positions[i];
|
||||
|
||||
position.AssertWithinTolerance(letter, page, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static IReadOnlyList<AssertablePositionData> GetPdfBoxPositionData()
|
||||
{
|
||||
const string data = @"60.8189 495.7441 22.134 F 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
81.3149 495.7441 22.176 a 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
103.490906 495.7441 15.960 r 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
119.450905 495.7441 36.12 m 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
155.5709 495.7441 22.176 e 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
177.7469 495.7441 15.960 r 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
193.70691 495.7441 8.610 ' 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
202.31691 495.7441 18.228 s 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
220.5449 495.7441 8.484 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
229.0289 495.7441 28.938 H 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
257.9669 495.7441 22.176 a 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
280.14288 495.7441 24.612 n 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
304.75488 495.7441 25.032 d 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
329.7869 495.7441 8.484 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
338.2709 495.7441 25.368002 B 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
363.89093 495.7441 24.234 o 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
388.25095 495.7441 24.234 o 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
412.48495 495.7441 22.764002 k 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
435.24896 495.7441 8.484 42.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
57.1844 453.7441 27.626762 o 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
84.81116 453.7441 28.057682 n 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
112.868835 453.7441 9.671761 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
122.540596 453.7441 27.818281 P 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
149.92795 453.7441 13.119122 i 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
163.04707 453.7441 28.009802 g 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
191.05687 453.7441 9.671761 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
200.72864 453.7441 27.818281 P 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
228.116 453.7441 18.1944 r 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
245.92735 453.7441 27.626762 o 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
273.69775 453.7441 28.536482 d 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
302.23422 453.7441 27.914042 u 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
330.14825 453.7441 21.593882 c 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
352.5082 453.7441 17.57196 t 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
370.08017 453.7441 13.119122 i 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
383.19928 453.7441 27.626762 o 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
410.82605 453.7441 28.057682 n 47.88 LAZFKS+MyriadPro-Bold 0.0
|
||||
57.3618 418.1143 7.0886397 ( 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
64.45044 418.1143 12.15552 F 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
75.8322 418.1143 13.70304 o 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
89.53524 418.1143 8.161921 r 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
97.69716 418.1143 5.29152 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
102.98868 418.1143 8.261761 t 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
111.250435 418.1143 13.852799 h 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
125.10323 418.1143 12.504961 e 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
137.60818 418.1143 5.29152 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
142.8997 418.1143 9.88416 s 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
152.78386 418.1143 20.81664 m 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
173.6005 418.1143 12.03072 a 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
185.63121 418.1143 5.89056 l 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
191.52177 418.1143 5.89056 l 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
197.41234 418.1143 5.29152 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
202.70386 418.1143 13.852799 h 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
216.55666 418.1143 13.70304 o 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
230.25969 418.1143 5.89056 l 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
236.15025 418.1143 14.077439 d 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
250.22769 418.1143 12.504961 e 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
262.73267 418.1143 8.161921 r 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
270.8946 418.1143 9.88416 s 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
280.77875 418.1143 5.29152 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
286.07028 418.1143 12.03072 a 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
298.00116 418.1143 8.261761 t 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
306.2629 418.1143 5.29152 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
311.55444 418.1143 12.00576 v 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
323.5602 418.1143 5.84064 i 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
329.40085 418.1143 5.89056 l 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
335.2914 418.1143 5.89056 l 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
341.18198 418.1143 12.03072 a 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
353.2127 418.1143 13.95264 g 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
367.16534 418.1143 12.504961 e 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
379.6703 418.1143 5.29152 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
384.96182 418.1143 5.89056 l 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
390.8524 418.1143 12.504961 e 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
403.35736 418.1143 12.00576 v 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
415.11353 418.1143 12.504961 e 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
427.61847 418.1143 5.89056 l 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
433.50903 418.1143 7.0886397 ) 24.96 GDKBSC+MyriadPro-Regular 0.0
|
||||
212.6322 63.3661 6.46 G 10.0 GDKBSC+MyriadPro-Regular 0.0
|
||||
219.09221 63.3661 5.8 C 10.0 GDKBSC+MyriadPro-Regular 0.0
|
||||
224.89221 63.3661 5.32 P 10.0 GDKBSC+MyriadPro-Regular 0.0
|
||||
230.21222 63.3661 3.4300003 / 10.0 GDKBSC+MyriadPro-Regular 0.0
|
||||
233.64221 63.3661 6.5800004 N 10.0 GDKBSC+MyriadPro-Regular 0.0
|
||||
240.22221 63.3661 4.92 E 10.0 GDKBSC+MyriadPro-Regular 0.0
|
||||
245.14221 63.3661 5.32 P 10.0 GDKBSC+MyriadPro-Regular 0.0
|
||||
250.46222 63.3661 3.4300003 / 10.0 GDKBSC+MyriadPro-Regular 0.0
|
||||
253.89221 63.3661 5.13 0 10.0 GDKBSC+MyriadPro-Regular 0.0
|
||||
259.02222 63.3661 5.13 6 10.0 GDKBSC+MyriadPro-Regular 0.0
|
||||
264.15222 63.3661 5.13 5 10.0 GDKBSC+MyriadPro-Regular 0.0
|
||||
269.28223 63.3661 3.4300003 / 10.0 GDKBSC+MyriadPro-Regular 0.0
|
||||
272.71222 63.3661 4.92 E 10.0 GDKBSC+MyriadPro-Regular 0.0
|
||||
277.63223 63.3661 5.8 C 10.0 GDKBSC+MyriadPro-Regular 0.0
|
||||
71.9488 43.6968 7.3780003 F 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
78.9628 43.6968 8.078 o 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
87.0828 43.6968 8.078 o 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
95.202805 43.6968 8.344 d 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
103.54681 43.6968 2.828 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
106.37481 43.6968 7.392 a 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
113.76681 43.6968 8.204 n 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
121.97081 43.6968 8.344 d 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
130.3148 43.6968 2.828 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
133.1428 43.6968 9.184 A 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
142.13081 43.6968 8.190 g 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
150.32082 43.6968 5.32 r 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
155.64081 43.6968 3.8360002 i 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
159.4768 43.6968 6.3140006 c 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
165.7908 43.6968 8.162 u 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
173.9528 43.6968 3.8500 l 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
177.80281 43.6968 5.138 t 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
182.94081 43.6968 8.162 u 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
191.10281 43.6968 5.32 r 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
196.31082 43.6968 7.392 e 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
203.70282 43.6968 2.828 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
206.53082 43.6968 10.038 O 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
216.62482 43.6968 5.32 r 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
221.83282 43.6968 8.190 g 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
230.02283 43.6968 7.392 a 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
237.41483 43.6968 8.204 n 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
245.61882 43.6968 3.8360002 i 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
249.45482 43.6968 6.566 z 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
256.0208 43.6968 7.392 a 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
263.3008 43.6968 5.138 t 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
268.4388 43.6968 3.8360002 i 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
272.2748 43.6968 8.078 o 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
280.3528 43.6968 8.204 n 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
288.55682 43.6968 2.828 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
291.38483 43.6968 8.078 o 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
299.46283 43.6968 4.774 f 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
304.23682 43.6968 2.828 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
307.06482 43.6968 5.138 t 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
312.20282 43.6968 8.204 h 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
320.40683 43.6968 7.392 e 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
327.79883 43.6968 2.828 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
330.62683 43.6968 9.548 U 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
340.17484 43.6968 8.204 n 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
348.37885 43.6968 3.8360002 i 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
352.21484 43.6968 5.138 t 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
357.28284 43.6968 7.392 e 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
364.67484 43.6968 8.344 d 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
373.01883 43.6968 2.828 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
375.84683 43.6968 9.660 N 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
385.50684 43.6968 7.392 a 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
392.78683 43.6968 5.138 t 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
397.92484 43.6968 3.8360002 i 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
401.76083 43.6968 8.078 o 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
409.83884 43.6968 8.204 n 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
418.04285 43.6968 6.076 s 14.0 LAZFKS+MyriadPro-Bold 0.0
|
||||
375.2348 587.6642 3.6815999 E 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
378.7708 587.6642 4.1392 u 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
382.91 587.6642 2.5792 r 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
385.3436 587.6642 3.9832 o 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
389.32678 587.6642 4.1496 p 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
393.47638 587.6642 3.7752 e 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
397.2516 587.6642 3.7856002 a 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
401.0372 587.6642 4.2120004 n 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
405.2492 587.6642 1.6328 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
406.88202 587.6642 3.8792002 C 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
410.57404 587.6642 3.9832 o 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
414.55722 587.6642 6.448 m 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
421.00522 587.6642 1.9136 i 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
422.91882 587.6642 3.0056 s 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
425.92444 587.6642 3.0056 s 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
428.93005 587.6642 1.9136 i 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
430.84366 587.6642 3.9832 o 10.4 REXPQG+MyriadPro-Cond 0.0
|
||||
434.82684 587.6642 4.2120004 n 10.4 REXPQG+MyriadPro-Cond 0.0";
|
||||
|
||||
var result = data.Split(new[] { "\r", "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
|
||||
.Select(AssertablePositionData.Parse)
|
||||
.ToList();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -70,7 +70,7 @@
|
||||
break;
|
||||
}
|
||||
|
||||
var myX = pageLetter.Position.X;
|
||||
var myX = pageLetter.Origin.X;
|
||||
var theirX = pdfBoxData[index].X;
|
||||
|
||||
var myLetter = pageLetter.Value;
|
||||
@@ -113,7 +113,7 @@
|
||||
break;
|
||||
}
|
||||
|
||||
var myX = pageLetter.Position.X;
|
||||
var myX = pageLetter.Origin.X;
|
||||
var theirX = positions[index].X;
|
||||
|
||||
var myLetter = pageLetter.Value;
|
||||
|
||||
@@ -134,9 +134,9 @@ namespace UglyToad.PdfPig.Tests.Integration
|
||||
}
|
||||
|
||||
Assert.Equal(datum.Text, letter.Value);
|
||||
Assert.Equal(datum.X, letter.Position.X, 2);
|
||||
Assert.Equal(datum.X, letter.Origin.X, 2);
|
||||
|
||||
var transformed = page.Height - letter.Position.Y;
|
||||
var transformed = page.Height - letter.Origin.Y;
|
||||
Assert.Equal(datum.Y, transformed, 2);
|
||||
|
||||
Assert.Equal(datum.Width, letter.Width, 2);
|
||||
@@ -179,9 +179,9 @@ namespace UglyToad.PdfPig.Tests.Integration
|
||||
}
|
||||
|
||||
Assert.Equal(datum.Text, letter.Value);
|
||||
Assert.Equal(datum.X, letter.Position.X, 2);
|
||||
Assert.Equal(datum.X, letter.Origin.X, 2);
|
||||
|
||||
var transformed = page.Height - letter.Position.Y;
|
||||
var transformed = page.Height - letter.Origin.Y;
|
||||
Assert.Equal(datum.Y, transformed, 2);
|
||||
|
||||
// Until we get width from glyphs we're a bit out.
|
||||
|
||||
@@ -15,15 +15,17 @@
|
||||
/// <summary>
|
||||
/// The placement position of the character in PDF space.
|
||||
/// </summary>
|
||||
public PdfPoint Position { get; }
|
||||
public PdfPoint Origin { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The width to advance the renderer once this character is drawn.
|
||||
/// The width occupied by the character within the PDF content.
|
||||
/// </summary>
|
||||
public decimal Width { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Position of the bounding box for the glyph.
|
||||
/// Position of the bounding box for the glyph, this is the box surrounding the visible glyph as it appears on the page.
|
||||
/// For example letters with descenders, p, j, etc., will have a box extending below the <see cref="Origin"/> they are placed at.
|
||||
/// The width of the glyph may also be more or less than the <see cref="Width"/> allocated for the character in the PDF content.
|
||||
/// </summary>
|
||||
public PdfRectangle GlyphRectangle { get; }
|
||||
|
||||
@@ -45,14 +47,14 @@
|
||||
/// <summary>
|
||||
/// Create a new letter to represent some text drawn by the Tj operator.
|
||||
/// </summary>
|
||||
internal Letter(string value, PdfRectangle glyphRectangle, PdfPoint position, decimal width, decimal fontSize, string fontName, decimal pointSize)
|
||||
internal Letter(string value, PdfRectangle glyphRectangle, PdfPoint origin, decimal width, decimal fontSize, string fontName, decimal pointSize)
|
||||
{
|
||||
Value = value;
|
||||
GlyphRectangle = glyphRectangle;
|
||||
FontSize = fontSize;
|
||||
FontName = fontName;
|
||||
PointSize = pointSize;
|
||||
Position = position;
|
||||
Origin = origin;
|
||||
Width = width;
|
||||
}
|
||||
|
||||
@@ -61,7 +63,7 @@
|
||||
/// </summary>
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{Value} {GlyphRectangle} {FontName} {PointSize}";
|
||||
return $"{Value} {Origin} {FontName} {PointSize}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,13 +11,6 @@
|
||||
[Serializable]
|
||||
public class PdfDocumentFormatException : Exception
|
||||
{
|
||||
//
|
||||
// For guidelines regarding the creation of new exception types, see
|
||||
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconerrorraisinghandlingguidelines.asp
|
||||
// and
|
||||
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp07192001.asp
|
||||
//
|
||||
|
||||
/// <inheritdoc />
|
||||
/// <summary>
|
||||
/// Create a new <see cref="T:UglyToad.PdfPig.Exceptions.PdfDocumentFormatException" />.
|
||||
@@ -26,14 +19,17 @@
|
||||
{
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public PdfDocumentFormatException(string message) : base(message)
|
||||
{
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public PdfDocumentFormatException(string message, Exception inner) : base(message, inner)
|
||||
{
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected PdfDocumentFormatException(
|
||||
SerializationInfo info,
|
||||
StreamingContext context) : base(info, context)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Dictionaries;
|
||||
using Util;
|
||||
using Util.JetBrains.Annotations;
|
||||
|
||||
@@ -14,7 +15,7 @@
|
||||
internal class Type2CharStrings
|
||||
{
|
||||
private readonly object locker = new object();
|
||||
private readonly Dictionary<string, CharacterPath> glyphs = new Dictionary<string, CharacterPath>();
|
||||
private readonly Dictionary<string, Type2Glyph> glyphs = new Dictionary<string, Type2Glyph>();
|
||||
|
||||
/// <summary>
|
||||
/// The decoded charstrings in this font.
|
||||
@@ -46,9 +47,9 @@
|
||||
/// </summary>
|
||||
/// <param name="name">The name of the character to retrieve the CharString for.</param>
|
||||
/// <returns>A <see cref="CharacterPath"/> for the glyph.</returns>
|
||||
public CharacterPath Generate(string name)
|
||||
public Type2Glyph Generate(string name)
|
||||
{
|
||||
CharacterPath glyph;
|
||||
Type2Glyph glyph;
|
||||
lock (locker)
|
||||
{
|
||||
if (glyphs.TryGetValue(name, out var result))
|
||||
@@ -76,7 +77,7 @@
|
||||
return glyph;
|
||||
}
|
||||
|
||||
private static CharacterPath Run(CommandSequence sequence)
|
||||
private static Type2Glyph Run(CommandSequence sequence)
|
||||
{
|
||||
var context = new Type2BuildCharContext();
|
||||
|
||||
@@ -130,7 +131,7 @@
|
||||
});
|
||||
}
|
||||
|
||||
return context.Path;
|
||||
return new Type2Glyph(context.Path, context.Width);
|
||||
}
|
||||
|
||||
private static void SetWidthFromArgumentsIfPresent(Type2BuildCharContext context, int expectedArgumentLength)
|
||||
@@ -159,4 +160,46 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Since Type 2 CharStrings may define their width as the first argument (as a delta from the font's nominal width X)
|
||||
/// we can retrieve both details for the Type 2 glyph.
|
||||
/// </summary>
|
||||
internal class Type2Glyph
|
||||
{
|
||||
/// <summary>
|
||||
/// The path of the glyph.
|
||||
/// </summary>
|
||||
[NotNull]
|
||||
public CharacterPath Path { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The width of the glyph as a difference from the nominal width X for the font. Optional.
|
||||
/// </summary>
|
||||
public decimal? WidthDifferenceFromNominal { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a new <see cref="Type2Glyph"/>.
|
||||
/// </summary>
|
||||
public Type2Glyph(CharacterPath path, decimal? widthDifferenceFromNominal)
|
||||
{
|
||||
Path = path ?? throw new ArgumentNullException(nameof(path));
|
||||
WidthDifferenceFromNominal = widthDifferenceFromNominal;
|
||||
}
|
||||
|
||||
public decimal GetWidth(CompactFontFormatPrivateDictionary privateDictionary)
|
||||
{
|
||||
if (privateDictionary == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(privateDictionary));
|
||||
}
|
||||
|
||||
if (!WidthDifferenceFromNominal.HasValue)
|
||||
{
|
||||
return Path.GetBoundingRectangle().GetValueOrDefault().Width;
|
||||
}
|
||||
|
||||
return privateDictionary.NominalWidthX + WidthDifferenceFromNominal.Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
{
|
||||
var result = default(PdfRectangle?);
|
||||
CharStrings.Match(x => throw new NotImplementedException("Type 1 CharStrings in a CFF font are currently unsupported."),
|
||||
x => { result = x.Generate(characterName).GetBoundingRectangle(); });
|
||||
x => { result = x.Generate(characterName).Path.GetBoundingRectangle(); });
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
public CompactFontFormatCharStringType CharStringType { get; set; } = CompactFontFormatCharStringType.Type2;
|
||||
|
||||
public TransformationMatrix FontMatrix { get; set; } = TransformationMatrix.FromValues(0.001m, 0m, 0.001m, 0, 0, 0);
|
||||
public TransformationMatrix FontMatrix { get; set; } = TransformationMatrix.FromValues(0.001m, 0m, 0, 0.001m, 0, 0);
|
||||
|
||||
public decimal StrokeWidth { get; set; }
|
||||
|
||||
|
||||
@@ -11,18 +11,22 @@
|
||||
[Serializable]
|
||||
public class InvalidFontFormatException : Exception
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public InvalidFontFormatException()
|
||||
{
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public InvalidFontFormatException(string message) : base(message)
|
||||
{
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public InvalidFontFormatException(string message, Exception inner) : base(message, inner)
|
||||
{
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected InvalidFontFormatException(
|
||||
SerializationInfo info,
|
||||
StreamingContext context) : base(info, context)
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
public static PdfDocument Open(Stream stream, ParsingOptions options = null) => PdfDocumentFactory.Open(stream, options);
|
||||
|
||||
/// <summary>
|
||||
/// Get the page with the specified page number.
|
||||
/// Get the page with the specified page number (1 indexed).
|
||||
/// </summary>
|
||||
/// <param name="pageNumber">The number of the page to return, this starts from 1.</param>
|
||||
/// <returns>The page.</returns>
|
||||
|
||||
Reference in New Issue
Block a user