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 }