public static HwpV3DocumentSignature Create(BinaryReader reader) { byte[] signature = reader.ReadBytes(30); bool result = ( signature != null && signature.Length == 30 && signature[0x00] == 0x48 && signature[0x01] == 0x57 && signature[0x02] == 0x50 && signature[0x03] == 0x20 && signature[0x04] == 0x44 && signature[0x05] == 0x6F && signature[0x06] == 0x63 && signature[0x07] == 0x75 && signature[0x08] == 0x6D && signature[0x09] == 0x65 && signature[0x0A] == 0x6E && signature[0x0B] == 0x74 && signature[0x0C] == 0x20 && signature[0x0D] == 0x46 && signature[0x0E] == 0x69 && signature[0x0F] == 0x6C && signature[0x10] == 0x65 && signature[0x11] == 0x20 && signature[0x12] == 0x56 && signature[0x13] == 0x33 && signature[0x14] == 0x2E && signature[0x15] == 0x30 && signature[0x16] == 0x30 && signature[0x17] == 0x20 && signature[0x18] == 0x1A && signature[0x19] == 0x01 && signature[0x1A] == 0x02 && signature[0x1B] == 0x03 && signature[0x1C] == 0x04 && signature[0x1D] == 0x05 ); if (!result) { return(null); } HwpV3DocumentSignature item = new HwpV3DocumentSignature(); item.Signature = signature; return(item); }
public static HwpV3Document Load(string filePath) { HwpV3Document doc = new HwpV3Document(); using (Stream file = File.OpenRead(filePath)) using (BinaryReader reader = new BinaryReader(file)) { doc.Signature = HwpV3DocumentSignature.Create(reader); doc.Information = HwpV3DocumentInformation.Create(reader); doc.Summary = HwpV3DocumentSummary.Create(reader); doc.InformationBlocks = HwpV3DocumentInformationBlockCollection.Create(reader, doc.Information); bool requireDecompress = ((int)doc.Information.Compressed != 0); MemoryStream extractedFile = new MemoryStream(); byte[] buffer = new byte[64000]; int read = 0; if (requireDecompress) { using (DeflateStream deflateStream = new DeflateStream(file, CompressionMode.Decompress, true)) { while ((read = deflateStream.Read(buffer, 0, buffer.Length)) > 0) { extractedFile.Write(buffer, 0, read); } } } else { while ((read = file.Read(buffer, 0, buffer.Length)) > 0) { extractedFile.Write(buffer, 0, read); } } extractedFile.Seek(0L, SeekOrigin.Begin); using (extractedFile) using (BinaryReader subReader = new BinaryReader(extractedFile)) { doc.FontNames = HwpV3FontNames.Create(subReader); doc.Styles = HwpV3DocumentStyleCollection.Create(subReader); doc.Paragraph = HwpV3Paragraph.Create(subReader); doc.AdditionalBlock1 = HwpV3AdditionalBlock.Create(subReader); uint additionalBlock2Size = 0u; bool hasAdditionalBlock2 = false; BinaryReader target = (requireDecompress ? reader : subReader); target.BaseStream.Seek(-8, SeekOrigin.End); uint id = target.ReadDWord(); if (id == 0u) { additionalBlock2Size = target.ReadDWord(); if (additionalBlock2Size != 0u) { hasAdditionalBlock2 = true; } } if (hasAdditionalBlock2) { target.BaseStream.Position = target.BaseStream.Length - additionalBlock2Size; doc.AdditionalBlock2 = HwpV3AdditionalBlock.Create(reader); } } return(doc); } }