unit frxExportPPMLDocument; interface {$I frx.inc} uses {$IFNDEF Linux} Windows, {$ELSE} LCLType, LCLIntf, LCLProc, {$ENDIF} Messages, frxExportBaseDialog, SysUtils, Classes, Graphics, frxClass, frxExportMatrix, Math, frxBarcod, frxBarcode, frxBarcode2D, frxBarcodeMaxiCode, frxTableObject, frxRes, frxImageConverter, frxExportPSDocument, frxExportPSHelper, frxXML; type PPMLDocument = class(PSDocument) protected doc: TfrxXMLDocument; root, internalData, mark, document: TfrxXMLItem; procedure CreateWindow(name: String; Width, Height: Double); override; public procedure AddPage(); override; procedure Save(stream: TStream); overload; override; procedure Save(fn: String); overload; override; procedure Finish(); override; Destructor Destroy; override; end; implementation uses frxUtils; procedure PPMLDocument.CreateWindow(name: String; Width, Height: Double); var PAGE_DESIGN, JOB: TfrxXMLItem; begin Inherited; doc := TfrxXMLDocument.Create(); doc.AutoIndent := True; root := doc.Root; root.Name := 'PPML'; root.Prop['xmlns'] := 'urn://www.podi.org/ppml/ppml3'; root.Prop['xmlns:xsi'] := 'http://www.w3.org/2001/XMLSchema-instance'; root.Prop['xsi:schemaLocation'] := 'urn://www.podi.org/ppml/ppml3 http://www.podi.org/ppml/ppml300.xsd'; root.Prop['Version'] := '3.0'; PAGE_DESIGN := root.Add('PAGE_DESIGN'); PAGE_DESIGN.Prop['TrimBox'] := '0 0 ' + FloatToString(windowWidth) + ' ' + FloatToString(windowHeight); JOB := root.Add('JOB'); document := JOB.Add('DOCUMENT'); end; procedure PPMLDocument.AddPage(); var PAGE, OBJ, SOURCE: TfrxXMLItem; begin PAGE := document.Add('PAGE'); mark := PAGE.Add('MARK'); mark.Prop['Position'] := '0 0'; OBJ := mark.Add('OBJECT'); OBJ.Prop['Position'] := '0 0'; SOURCE := OBJ.Add('SOURCE'); SOURCE.Prop['Format'] := 'application/postscript'; SOURCE.Prop['Dimensions'] := FloatToString(windowWidth) + ' ' + FloatToString(windowHeight); internalData := SOURCE.Add('INTERNAL_DATA'); end; procedure PPMLDocument.Save(stream: TStream); begin doc.SaveToStream(stream); end; procedure PPMLDocument.Save(fn: String); begin doc.SaveToFile(fn); end; procedure PPMLDocument.Finish(); begin internalData.Value := psData; psData := ''; end; Destructor PPMLDocument.Destroy; begin FreeAndNil(doc); end; end.