XPS IDocumentPaginator


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

maendler53

Grünschnabel
Moin Freaks

BeimDrucken über FixedDocument erhalte ich diese Fehlermeldung:

InnerException {"Das Stammelement ist nicht vorhanden."}

StackTrace

bei System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)

bei System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, Boolean skipJournaledProperties, Uri baseUri)

bei System.Windows.Markup.XamlReader.Load(XamlReader xamlReader, ParserContext parserContext)

bei System.Windows.Markup.XamlReader.Load(XmlReader reader, ParserContext parserContext, XamlParseMode parseMode, Boolean useRestrictiveXamlReader, List`1 safeTypes)

bei System.Windows.Markup.XamlReader.Load(Stream stream, ParserContext parserContext, Boolean useRestrictiveXamlReader)\r\n bei MS.Internal.ReachFramework.Markup.XamlReaderProxy.Load(Stream stream, ParserContext parserContext, Boolean useRestrictiveXamlReader)

bei System.Windows.Xps.Packaging.XpsDocument.GetFixedDocumentSequence()

bei js.RentAdministration.PrintFactory.PrintFactories.get_Paginator() in E:\\RENT_ADMINISTRATION_FRONT_END\\js.RentAdministration.PrintFactory\\PrintFactories.cs:Zeile 74."

Code:
    public class XpsDoc : jsPrintBase
    {
        private const double _LEFT_MARGIN = 60;
        private const double _TOP_MARGIN = 80;

        private static readonly string docPath = $"{Path.GetTempPath()}tmpXPS.xps";

        protected XpsDocument doc = null;
        private IXpsFixedDocumentSequenceWriter sequeceWriter;
        private IXpsFixedDocumentWriter docWriter;

        private IXpsFixedPageWriter pageWriter;
        private XmlWriter xmlWriter;
        //private Package packageName;

        protected string DocPaht { get => docPath; }

        protected void OpenDoc()
        {
            doc = new XpsDocument(docPath, FileAccess.ReadWrite);
            sequeceWriter = doc.AddFixedDocumentSequence();
            docWriter = sequeceWriter.AddFixedDocument();

        }

        protected void AddPage()
        {
            pageWriter = docWriter.AddFixedPage();

            xmlWriter = pageWriter.XmlWriter;

            xmlWriter.WriteStartElement("FixedPage");

            xmlWriter.WriteAttributeString("xmlns", "http://schemas.microsoft.com/xps/2005/06");

            xmlWriter.WriteStartElement("StackPanel");

            xmlWriter.WriteAttributeString("Margin", $"{_LEFT_MARGIN},{_TOP_MARGIN},{ _LEFT_MARGIN / 2},{_TOP_MARGIN}");
            xmlWriter.WriteAttributeString("StackPanel.Width", $"{GetDocumentSize.Width + _LEFT_MARGIN }");

        }

        protected void AddElement(UIElement element)
        {
            XamlWriter.Save(element, xmlWriter);
        }

        protected void ClosePage()
        {
            docWriter.Commit();
            sequeceWriter.Commit();
        }

        protected void CloseDocument()
        {
            docWriter.Commit();
            sequeceWriter.Commit();

            doc.Close();
        }

    }

Die Klasse PrintFactories erbt von XpsDocument

Der Code von E:\\RENT_ADMINISTRATION_FRONT_END\\js.RentAdministration.PrintFactory\\PrintFactories.cs:Zeile 74.", der die Exception wirft

Code:
 public IDocumentPaginatorSource Paginator
        {
            get
            {
                OpenDoc();

                foreach (var cva in canvasContainer)
                {
                    AddPage();
                    AddElement(cva);
                    ClosePage();
                }

                FixedDocumentSequence seq = doc.GetFixedDocumentSequence();
                CloseDocument();

                return seq as IDocumentPaginatorSource; // Zeile 74
            }
        }


Ich denke der Fehler entsteht in der Funktion von XpsDocument AdsPage()

Wie müsste dieser void ausehen?

Gruss Mändler
 

Spyke

Premium-User
Es kommt eine fehlerhafte XML raus.
(Es fehlen zum Beispiel die WriteEndElement Aufrufe)


Probier mal nur das FixedDocument mit den UIElementen zu erstellen und zum schluss das FixedDocument als ganzes zur XpsDocument Erstellung verwenden

C#:
using (XpsDocument xps = new XpsDocument(fileName, FileAccess.Write))
    XpsDocument.CreateXpsDocumentWriter(xps).Write(fixedDocument);
 

maendler53

Grünschnabel
Es kommt eine fehlerhafte XML raus.
(Es fehlen zum Beispiel die WriteEndElement Aufrufe)


Probier mal nur das FixedDocument mit den UIElementen zu erstellen und zum schluss das FixedDocument als ganzes zur XpsDocument Erstellung verwenden

C#:
using (XpsDocument xps = new XpsDocument(fileName, FileAccess.Write))
    XpsDocument.CreateXpsDocumentWriter(xps).Write(fixedDocument);

Moin Spyke

Entschuldige dass ich erst heute antworte!

Ich habe dein Vorschlag eingefügt, aber leider wird beim erstellen des XpsDocument wieder ein Fehler ausgelöst:
new XpsDocument(docPath, FileAccess.Write)' löste eine Ausnahme des Typs 'System.UnauthorizedAccessException' aus

Auch mit dem Versuch auf verschidenen Speicherorten (Ordner) hat keine Lösung gezeigt.

Also wollte ich über die FileSecurity schreibrechet für Datei und Ordner erteilen.

C#:
 var dirPaht = getDirectories(DirectoryPaths.SystemTemp); // c:\temp
                FileSecurity fSecurity = File.GetAccessControl(DocPaht); // c:\temp\tmpXPS.xps
                fSecurity.AddAccessRule(new FileSystemAccessRule(dirPaht, FileSystemRights.FullControl, AccessControlType.Allow)); // wirfft Exception

Fehlermeldung:

System.Security.Principal.IdentityNotMappedException
HResult=0x80131501
Nachricht = Manche oder alle Identitätsverweise konnten nicht übersetzt werden.
Quelle = mscorlib

Kannst du mir nochmals helfen?

Gruss Mändler
 

Spyke

Premium-User
hast du immer noch so den Pfad zusammengestellt?
C#:
string docPath = $"{Path.GetTempPath()}tmpXPS.xps";
da Feld der \ zwischen Ordner und Dateinamen
am besten so dateinamen verketten
C#:
string docPath = Path.Combine(Path.GetTempPath(), "tmpXPS.xps");

Nachtrag:
ok, hab nochmal nachgeschaut GetTempPath() hängt wohl hinten ein \ dran, aber am besten immer mit Path.Combine Pfadangaben verketten.

Mal probiert über deinen Quellcode einfach eine Textdatei zu erzeugen (im besagten Ordner) ob dort auch UnauthorizedAccessException kommt (ansonsten ev. gibts irgendwelche Berechtigungen zwecks XPS Erstellung die Berücksichtigt werden müssen)?


Ev. muss doch auch ReadWrite Access gesetzt werden.
 
Zuletzt bearbeitet:

maendler53

Grünschnabel
hast du immer noch so den Pfad zusammengestellt?
C#:
string docPath = $"{Path.GetTempPath()}tmpXPS.xps";
da Feld der \ zwischen Ordner und Dateinamen
am besten so dateinamen verketten
C#:
string docPath = Path.Combine(Path.GetTempPath(), "tmpXPS.xps");

Nachtrag:
ok, hab nochmal nachgeschaut GetTempPath() hängt wohl hinten ein \ dran, aber am besten immer mit Path.Combine Pfadangaben verketten.

Mal probiert über deinen Quellcode einfach eine Textdatei zu erzeugen (im besagten Ordner) ob dort auch UnauthorizedAccessException kommt (ansonsten ev. gibts irgendwelche Berechtigungen zwecks XPS Erstellung die Berücksichtigt werden müssen)?


Ev. muss doch auch ReadWrite Access gesetzt werden.
hast du immer noch so den Pfad zusammengestellt?
C#:
string docPath = $"{Path.GetTempPath()}tmpXPS.xps";
da Feld der \ zwischen Ordner und Dateinamen
am besten so dateinamen verketten
C#:
string docPath = Path.Combine(Path.GetTempPath(), "tmpXPS.xps");

Nachtrag:
ok, hab nochmal nachgeschaut GetTempPath() hängt wohl hinten ein \ dran, aber am besten immer mit Path.Combine Pfadangaben verketten.

Mal probiert über deinen Quellcode einfach eine Textdatei zu erzeugen (im besagten Ordner) ob dort auch UnauthorizedAccessException kommt (ansonsten ev. gibts irgendwelche Berechtigungen zwecks XPS Erstellung die Berücksichtigt werden müssen)?


Ev. muss doch auch ReadWrite Access gesetzt werden.

Vielen Dank Spyke

Mit Access ReadWrite läufts nun!

Gruss Mändler
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…