XPS improvements

This commit is contained in:
Michael Becker 2022-10-14 09:42:55 -04:00
parent ba26043c81
commit 55b5878a79
No known key found for this signature in database
GPG Key ID: DA394832305DA332
4 changed files with 84 additions and 1 deletions

View File

@ -59,5 +59,30 @@ namespace UniversalEditor.DataFormats.Text.Formatted.XPS.FixedDocumentSequence
fdseq.DocumentReferences.Add(docref);
}
}
public XPSSchemaVersion SchemaVersion { get; set; } = XPSSchemaVersion.OpenXPS;
protected override void BeforeSaveInternal(Stack<ObjectModel> objectModels)
{
base.BeforeSaveInternal(objectModels);
FixedDocumentSequenceObjectModel fdseq = (objectModels.Pop() as FixedDocumentSequenceObjectModel);
MarkupObjectModel mom = new MarkupObjectModel();
mom.Elements.Add(new MarkupPreprocessorElement("xml", "version=\"1.0\" encoding=\"UTF-8\""));
MarkupTagElement tagFixedDocumentSequence = new MarkupTagElement() { Name = "FixedDocumentSequence" };
tagFixedDocumentSequence.XMLSchema = XPSSchemas.GetSchema(SchemaVersion, XPSSchemaType.FixedDocumentSequence);
foreach (DocumentReference docref in fdseq.DocumentReferences)
{
MarkupTagElement tagDocumentReference = new MarkupTagElement() { Name = "DocumentReference" };
tagDocumentReference.Attributes.Add("Source", docref.Source);
tagFixedDocumentSequence.Elements.Add(tagDocumentReference);
}
mom.Elements.Add(tagFixedDocumentSequence);
objectModels.Push(mom);
}
}
}

View File

@ -20,16 +20,19 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using MBS.Framework.Settings;
using UniversalEditor.DataFormats.Package.OpenPackagingConvention;
using UniversalEditor.DataFormats.Text.Formatted.XPS.FixedDocument;
using UniversalEditor.DataFormats.Text.Formatted.XPS.FixedDocumentSequence;
using UniversalEditor.DataFormats.Text.Formatted.XPS.FixedPage;
using UniversalEditor.DataFormats.Text.Formatted.XPS.PrintTicket;
using UniversalEditor.ObjectModels.FileSystem;
using UniversalEditor.ObjectModels.FileSystem.FileSources;
using UniversalEditor.ObjectModels.Package;
using UniversalEditor.ObjectModels.Text.Formatted;
using UniversalEditor.ObjectModels.Text.Formatted.XPS.FixedDocument;
using UniversalEditor.ObjectModels.Text.Formatted.XPS.FixedDocumentSequence;
using UniversalEditor.ObjectModels.Text.Formatted.XPS.FixedPage;
using UniversalEditor.ObjectModels.Text.Formatted.XPS.PrintTicket;
namespace UniversalEditor.DataFormats.Text.Formatted.XPS
@ -45,6 +48,11 @@ namespace UniversalEditor.DataFormats.Text.Formatted.XPS
if (_dfr == null)
{
_dfr = new DataFormatReference(GetType());
_dfr.ExportOptions.SettingsGroups[0].Settings.Add(new ChoiceSetting("SchemaVersion", "_Schema version", XPSSchemaVersion.OpenXPS, new ChoiceSetting.ChoiceSettingValue[]
{
new ChoiceSetting.ChoiceSettingValue("XPS", "XPS", XPSSchemaVersion.XPS),
new ChoiceSetting.ChoiceSettingValue("OpenXPS", "OpenXPS", XPSSchemaVersion.OpenXPS)
}));
_dfr.Capabilities.Add(typeof(FormattedTextObjectModel), DataFormatCapabilities.All);
}
return _dfr;
@ -85,6 +93,30 @@ namespace UniversalEditor.DataFormats.Text.Formatted.XPS
}
/// <summary>
/// Attempts to deobfuscate Obfuscated OpenType (ODTTF) font data.
/// FIXME: This has not been tested!
/// </summary>
/// <returns>The deobfuscated font data.</returns>
/// <param name="filename">The file name of the Obfuscated OpenType font, consisting solely of a GUID.</param>
/// <param name="fontData">The obfuscated data to decode.</param>
protected byte[] DeobfuscateFont(string filename, byte[] fontData)
{
// from github:KDE/okular@master/generators/xps/generator_xps.cpp (GPLv2.0 or later)
// XpsFile::loadFontByName
Guid guid = new Guid(filename);
byte[] guidData = guid.ToByteArray();
// Obfuscation - xor bytes in font binary with bytes from guid (font's filename)
int[] mapping = new int[] { 15, 14, 13, 12, 11, 10, 9, 8, 6, 7, 4, 5, 0, 1, 2, 3 };
for (int i = 0; i < 16; i++)
{
fontData[i] = (byte) (fontData[i] ^ guidData[mapping[i]]);
fontData[i + 16] = (byte) (fontData[i + 16] ^ guidData[mapping[i]]);
}
return fontData;
}
protected override void BeforeSaveInternal(System.Collections.Generic.Stack<ObjectModel> objectModels)
{
FormattedTextObjectModel text = (objectModels.Pop() as FormattedTextObjectModel);
@ -110,17 +142,40 @@ namespace UniversalEditor.DataFormats.Text.Formatted.XPS
fldDocument1MetadataPage1PT.Name = "Page" + (i + 1).ToString() + "_PT.xml";
PrintTicketObjectModel pt = new PrintTicketObjectModel();
fldDocument1MetadataPage1PT.SetObjectModel<PrintTicketObjectModel>(new PrintTicketXMLDataFormat(), pt);
fldDocument1MetadataPage1PT.Source = new ObjectModelFileSource(pt, new PrintTicketXMLDataFormat());
fldDocument1Metadata.Files.Add(fldDocument1MetadataPage1PT);
File fldDocument1MetadataPage1Thumbnail = new File();
fldDocument1MetadataPage1Thumbnail.Name = "Page" + (i + 1).ToString() + "_Thumbnail.JPG";
fldDocument1Metadata.Files.Add(fldDocument1MetadataPage1Thumbnail);
}
FPAGEDataFormat fpageDF = new FPAGEDataFormat();
fpageDF.Generator = new XPSGenerator("Universal Editor", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version);
fpageDF.SchemaVersion = SchemaVersion;
Folder fldDocument1Pages = new Folder() { Name = "Pages" };
FixedPageObjectModel fp = new FixedPageObjectModel();
File fDocument1Page1 = new File() { Name = "1.fpage" };
fDocument1Page1.Source = new ObjectModelFileSource(fp, fpageDF);
fldDocument1Pages.Files.Add(fDocument1Page1);
fldDocument1.Folders.Add(fldDocument1Pages);
FDSEQDataFormat fdseq = new FDSEQDataFormat();
fdseq.SchemaVersion = SchemaVersion;
FixedDocumentSequenceObjectModel omFixedDocumentSequence = new FixedDocumentSequenceObjectModel();
omFixedDocumentSequence.DocumentReferences.Add(new DocumentReference() { Source = "Documents/1/FixedDocument.fdoc" });
File fFixedDocumentSequence = new File() { Name = "FixedDocumentSequence.fdseq", Source = new ObjectModelFileSource(omFixedDocumentSequence, fdseq) };
package.FileSystem.Files.Add(fFixedDocumentSequence);
objectModels.Push(package);
base.BeforeSaveInternal(objectModels);
}
}
}

View File

@ -27,6 +27,7 @@ namespace UniversalEditor.DataFormats.Text.Formatted.XPS
public enum XPSSchemaType
{
FixedDocument,
FixedDocumentSequence,
FixedRepresentation,
FixedPage,
PrintTicket,

View File

@ -43,12 +43,14 @@ namespace UniversalEditor.DataFormats.Text.Formatted.XPS
_Schema[new XPSSchemaKey(XPSSchemaVersion.XPS, XPSSchemaType.PrintTicket)] = "http://schemas.microsoft.com/xps/2005/06/printticket";
_Schema[new XPSSchemaKey(XPSSchemaVersion.XPS, XPSSchemaType.Thumbnail)] = "http://schemas.microsoft.com/xps/2005/06/printticket";
_Schema[new XPSSchemaKey(XPSSchemaVersion.XPS, XPSSchemaType.FixedDocument)] = "http://schemas.microsoft.com/xps/2005/06";
_Schema[new XPSSchemaKey(XPSSchemaVersion.XPS, XPSSchemaType.FixedDocumentSequence)] = "http://schemas.microsoft.com/xps/2005/06";
_Schema[new XPSSchemaKey(XPSSchemaVersion.XPS, XPSSchemaType.FixedPage)] = "http://schemas.microsoft.com/xps/2005/06";
_Schema[new XPSSchemaKey(XPSSchemaVersion.OpenXPS, XPSSchemaType.FixedRepresentation)] = "http://schemas.openxps.org/oxps/v1.0/fixedrepresentation";
_Schema[new XPSSchemaKey(XPSSchemaVersion.OpenXPS, XPSSchemaType.PrintTicket)] = "http://schemas.openxps.org/oxps/v1.0/printticket";
_Schema[new XPSSchemaKey(XPSSchemaVersion.OpenXPS, XPSSchemaType.Thumbnail)] = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"; //yes this is the same as OpenXPS
_Schema[new XPSSchemaKey(XPSSchemaVersion.OpenXPS, XPSSchemaType.FixedDocument)] = "http://schemas.openxps.org/oxps/v1.0";
_Schema[new XPSSchemaKey(XPSSchemaVersion.OpenXPS, XPSSchemaType.FixedDocumentSequence)] = "http://schemas.openxps.org/oxps/v1.0";
_Schema[new XPSSchemaKey(XPSSchemaVersion.OpenXPS, XPSSchemaType.FixedPage)] = "http://schemas.openxps.org/oxps/v1.0";
}
}