Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
                }
        }