1 module aurorafw.metadata.pdf;
2 
3 import aurorafw.core.semver : Version;
4 import std.stdio : File;
5 
6 enum PDFVersion : Version
7 {
8 	PDF_1_0 = Version(1, 0),
9 	PDF_1_1 = Version(1, 1),
10 	PDF_1_2 = Version(1, 2),
11 	PDF_1_3 = Version(1, 3),
12 	PDF_1_4 = Version(1, 4),
13 	PDF_1_5 = Version(1, 5),
14 	PDF_1_6 = Version(1, 6),
15 	PDF_1_7 = Version(1, 7),
16 	PDF_2_0 = Version(2, 0),
17 	Unknown = Version(0, 0)
18 }
19 
20 @safe
21 PDFVersion getPDFVersion(File file)
22 {
23 	//TODO: Do a better implementation to detect pdf version (using traits?)
24 	char[4] buf = file.rawRead(new char[8])[4 .. 8];
25 	if (buf == "-1.0")
26 		return PDFVersion.PDF_1_0;
27 	else if (buf == "-1.1")
28 		return PDFVersion.PDF_1_1;
29 	else if (buf == "-1.2")
30 		return PDFVersion.PDF_1_2;
31 	else if (buf == "-1.3")
32 		return PDFVersion.PDF_1_3;
33 	else if (buf == "-1.4")
34 		return PDFVersion.PDF_1_4;
35 	else if (buf == "-1.5")
36 		return PDFVersion.PDF_1_5;
37 	else if (buf == "-1.6")
38 		return PDFVersion.PDF_1_6;
39 	else if (buf == "-1.7")
40 		return PDFVersion.PDF_1_7;
41 	else if (buf == "-2.0")
42 		return PDFVersion.PDF_2_0;
43 
44 	return PDFVersion.Unknown;
45 }
46 
47 @safe
48 @("PDF: Versioning")
49 unittest
50 {
51 	import std.file;
52 
53 	version (unittest) import aurorafw.unit.assertion;
54 	import std.conv : to;
55 	import std.traits;
56 
57 	scope (exit)
58 	{
59 		assert(exists(deleteme));
60 		remove(deleteme);
61 	}
62 
63 	PDFVersion version_;
64 	string signature = "%PDF-";
65 
66 	static foreach (ver; EnumMembers!PDFVersion)
67 	{
68 		write(deleteme, signature ~ (cast(Version) ver).to!string);
69 		version_ = getPDFVersion(File(deleteme));
70 		assertEquals(ver, version_);
71 	}
72 }