PDFsharp & MigraDoc Foundation

PDFsharp - A .NET library for processing PDF & MigraDoc Foundation - Creating documents on the fly
It is currently Thu Mar 28, 2024 9:45 pm

All times are UTC


Forum rules


Please read this before posting on this forum: Forum Rules



Post new topic Reply to topic  [ 7 posts ] 
Author Message
PostPosted: Thu Jan 16, 2020 4:49 pm 
Offline

Joined: Thu Jan 16, 2020 4:37 pm
Posts: 4
Hi there,

I'm working on a Unity / C# project, using a plugin that's based on PDFsharp. I came upon a problem that I haven't been able to solve so far.

I create the pdf doc and try to add a text and image to it, the text works fine, but the image does not work.

Code:
PdfDocument document = new PdfDocument();
PdfPage page = document.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(page);

double textHeight = page.Height.Value / 8.0f;
XFont font = new XFont("Verdana", 20, XFontStyle.Bold);
gfx.DrawString("This is a sample exported image.", font, XBrushes.Black, new XRect(0, 0, page.Width, textHeight), XStringFormats.Center);


Up to here, everything works fine, but as soon as I add an image too...

I create an XImage using either one of these (tried both methods in case the problem was the XImage):

Code:
XImage tempImage = XImageFromStream(myDataStream);
XImage tempImage = XImage.FromFile("C:/MyImage.jpg");


And as soon as I call DrawImage, I get and error:

Code:
gfx.DrawImage(tempImage, new XRect(.....));


What's pretty weird is that while I'm working on the Unity Editor, everything works just fine, the problem only appears when I try to run this code on a Windows Build.

The error is the following:

Quote:
NullReferenceException: Object reference not set to an instance of an object
at System.Drawing.ComIStreamMarshaler+ManagedToNativeWrapper..cctor () [0x00049] in <ab9e008c8c264c02bf011ee5162d1a92>:0
Rethrow as TypeInitializationException: The type initializer for 'ManagedToNativeWrapper' threw an exception.
at System.Drawing.ComIStreamMarshaler.MarshalManagedToNative (System.Object managedObj) [0x00000] in <ab9e008c8c264c02bf011ee5162d1a92>:0
at (wrapper managed-to-native) System.Drawing.GDIPlus.GdipLoadImageFromStream(System.Runtime.InteropServices.ComTypes.IStream,intptr&)
at System.Drawing.Image.InitFromStream (System.IO.Stream stream) [0x000c7] in <ab9e008c8c264c02bf011ee5162d1a92>:0
at System.Drawing.Image.LoadFromStream (System.IO.Stream stream, System.Boolean keepAlive) [0x00011] in <ab9e008c8c264c02bf011ee5162d1a92>:0
at System.Drawing.Image.FromStream (System.IO.Stream stream) [0x00000] in <ab9e008c8c264c02bf011ee5162d1a92>:0
at PdfSharp.Drawing.XImage..ctor (System.IO.Stream stream) [0x00034] in <166a6cb8bd8b4af8a1696a1823820029>:0
at PdfSharp.Drawing.XImage.FromStream (System.IO.Stream stream) [0x0001e] in <166a6cb8bd8b4af8a1696a1823820029>:0
at GeneralManager+<ExportPDF>d__27.MoveNext () [0x000d8] in <8bf44821173f4409bb33250b70b09848>:0
at UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) [0x00027] in <52d7b92b1d0e4868ac4c518247d361f7>:0

(Filename: <ab9e008c8c264c02bf011ee5162d1a92> Line: 0)


Hope someone might have an idea of what's going on.

Thank you.


Top
 Profile  
Reply with quote  
PostPosted: Thu Jan 16, 2020 4:57 pm 
Offline
PDFsharp Guru
User avatar

Joined: Mon Oct 16, 2006 8:16 am
Posts: 3095
Location: Cologne, Germany
CCabarcos wrote:
Hope someone might have an idea of what's going on.
Can you replicate the exception with the official library and the IssueSubmissionTemplate?
I have no idea which port you are using and which features might work differently with this port.

_________________
Regards
Thomas Hoevel
PDFsharp Team


Top
 Profile  
Reply with quote  
PostPosted: Thu Jan 16, 2020 5:53 pm 
Offline

Joined: Thu Jan 16, 2020 4:37 pm
Posts: 4
Thomas Hoevel wrote:
CCabarcos wrote:
Hope someone might have an idea of what's going on.
Can you replicate the exception with the official library and the IssueSubmissionTemplate?
I have no idea which port you are using and which features might work differently with this port.


Is there a .dll version I could download from somewhere? I need to integrate it into Unity, so I'm not really sure what to do with what I found available for download (the whole solution).

In case you heard about them, I've tried 2 different plugins:

- UPDF -> https://assetstore.unity.com/packages/t ... pdf-135573
- ZetPDF -> https://zetpdf.com/

Both fail in apparently the same way, the error using ZetPDF, was the following:

Quote:
NullReferenceException: Object reference not set to an instance of an object
at System.Drawing.ComIStreamMarshaler+ManagedToNativeWrapper..cctor () [0x00049] in <ab9e008c8c264c02bf011ee5162d1a92>:0
Rethrow as TypeInitializationException: The type initializer for 'ManagedToNativeWrapper' threw an exception.
at System.Drawing.ComIStreamMarshaler.MarshalManagedToNative (System.Object managedObj) [0x00000] in <ab9e008c8c264c02bf011ee5162d1a92>:0
at (wrapper managed-to-native) System.Drawing.GDIPlus.GdipSaveImageToStream(System.Runtime.InteropServices.HandleRef,System.Runtime.InteropServices.ComTypes.IStream,System.Guid&,System.Runtime.InteropServices.HandleRef)
at System.Drawing.Image.Save (System.IO.Stream stream, System.Drawing.Imaging.ImageCodecInfo encoder, System.Drawing.Imaging.EncoderParameters encoderParams) [0x0007e] in <ab9e008c8c264c02bf011ee5162d1a92>:0
at System.Drawing.Image.Save (System.IO.Stream stream, System.Drawing.Imaging.ImageFormat format) [0x00029] in <ab9e008c8c264c02bf011ee5162d1a92>:0
at (wrapper remoting-invoke-with-check) System.Drawing.Image.Save(System.IO.Stream,System.Drawing.Imaging.ImageFormat)
at ZetPDF.Pdf.Advanced.PdfImage.InitializeJpeg () [0x0001b] in <4062b2ef83e042d387f35ff3cb9b2074>:0
at ZetPDF.Pdf.Advanced.PdfImage..ctor (ZetPDF.Pdf.PdfDocument document, ZetPDF.Drawing.XImage image) [0x000a9] in <4062b2ef83e042d387f35ff3cb9b2074>:0
at ZetPDF.Pdf.Advanced.PdfImageTable.GetImage (ZetPDF.Drawing.XImage image) [0x00028] in <4062b2ef83e042d387f35ff3cb9b2074>:0
at ZetPDF.Pdf.PdfPage.GetImageName (ZetPDF.Drawing.XImage image) [0x0000b] in <4062b2ef83e042d387f35ff3cb9b2074>:0
at ZetPDF.Drawing.Pdf.XGraphicsPdfRenderer.GetImageName (ZetPDF.Drawing.XImage image) [0x00008] in <4062b2ef83e042d387f35ff3cb9b2074>:0
at ZetPDF.Drawing.Pdf.XGraphicsPdfRenderer.Realize (ZetPDF.Drawing.XImage image) [0x00029] in <4062b2ef83e042d387f35ff3cb9b2074>:0
at ZetPDF.Drawing.Pdf.XGraphicsPdfRenderer.DrawImage (ZetPDF.Drawing.XImage image, System.Double x, System.Double y, System.Double width, System.Double height) [0x00000] in <4062b2ef83e042d387f35ff3cb9b2074>:0
at ZetPDF.Drawing.XGraphics.DrawImage (ZetPDF.Drawing.XImage image, System.Double x, System.Double y, System.Double width, System.Double height) [0x000e0] in <4062b2ef83e042d387f35ff3cb9b2074>:0
at ZetPDF.Drawing.XGraphics.DrawImage (ZetPDF.Drawing.XImage image, ZetPDF.Drawing.XRect rect) [0x0001e] in <4062b2ef83e042d387f35ff3cb9b2074>:0
at Test+<TestFn>d__4.MoveNext () [0x00168] in <cb1e7d17c38f40ae89435e4508118a7f>:0
at UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) [0x00027] in <52d7b92b1d0e4868ac4c518247d361f7>:0

(Filename: <ab9e008c8c264c02bf011ee5162d1a92> Line: 0)


Thanks for your fast reply.


Top
 Profile  
Reply with quote  
PostPosted: Thu Jan 16, 2020 6:43 pm 
Offline
PDFsharp Expert
User avatar

Joined: Sat Mar 14, 2015 10:15 am
Posts: 909
Location: CCAA
CCabarcos wrote:
Is there a .dll version I could download from somewhere?
See here:
https://www.nuget.org/profiles/PDFsharp-Team

NuGet packages are actually ZIP files with .DLLs inside.

_________________
Best regards
Thomas
(Freelance Software Developer with several years of MigraDoc/PDFsharp experience)


Top
 Profile  
Reply with quote  
PostPosted: Thu Jan 16, 2020 11:08 pm 
Offline

Joined: Thu Jan 16, 2020 4:37 pm
Posts: 4
TH-Soft wrote:
CCabarcos wrote:
Is there a .dll version I could download from somewhere?
See here:
https://www.nuget.org/profiles/PDFsharp-Team

NuGet packages are actually ZIP files with .DLLs inside.


Thank you very much for your fast reply once more. I now downloaded the .dlls from there, specifically, the lastest version: 1.51.5185-beta.

I'm not using the IssueSubmissionTemplates because I'm working on a Unity project, not a straight .net solution, so I don't think it would apply properly.

I created a simple Unity project just to test this problem with a single script, containing the following code:

Code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Diagnostics;
using System.IO;
using PdfSharp.Drawing;
using PdfSharp.Pdf;


public class Test : MonoBehaviour
{
    bool _bExportingPDF = false;

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.K))
        {
            _bExportingPDF = true;
        }
    }

    //Gets called when everything in the frame has been set, so the screenshot is captured properly
    private void LateUpdate()
    {
        if (_bExportingPDF)
        {
            StartCoroutine(ExportPDF());
        }
    }

    IEnumerator ExportPDF()
    {
        yield return new WaitForEndOfFrame();

        _bExportingPDF = false;

        //Capture screenshot
        Texture2D screenshotTexture = ScreenCapture.CaptureScreenshotAsTexture(2);
        MemoryStream dataStream = new MemoryStream(screenshotTexture.EncodeToJPG());

        //Create PDF
        PdfDocument document = new PdfDocument();
        PdfPage page = document.AddPage();
        XGraphics gfx = XGraphics.FromPdfPage(page);
        double textHeight = page.Height.Value / 8.0f;
        XFont font = new XFont("Verdana", 20, XFontStyle.Bold);
        gfx.DrawString("This is a sample exported image.", font, XBrushes.Black, new XRect(0, 0, page.Width, textHeight), XStringFormats.Center);

        XImage tempImage = XImage.FromStream(dataStream);

        //Mantain image proportions
        double margin = page.Width / 10.0;
        double originalWidth = screenshotTexture.width;
        double originalHeight = screenshotTexture.height;
        double newWidth = page.Width.Value - (margin * 2.0);
        double newHeight = (newWidth / originalWidth) * originalHeight;
        XUnit newHeightUnit = new XUnit(newHeight);

        gfx.DrawImage(tempImage, new XRect(margin, textHeight, newWidth, newHeightUnit));

        string year = System.DateTime.Now.Year.ToString();
        string month = System.DateTime.Now.Month.ToString();
        string day = System.DateTime.Now.Day.ToString();
        string hour = System.DateTime.Now.Hour.ToString();
        string minute = System.DateTime.Now.Minute.ToString();
        string second = System.DateTime.Now.Second.ToString();
        string fullDate = year + "_" + month + "_" + day + "_" + hour + "_" + minute + "_" + second;
        string filename = fullDate + "_Export.pdf";

        document.Save(filename);
        Process.Start(filename);

        Destroy(screenshotTexture);
    }
}


And I'm getting this error:

Quote:
NullReferenceException: Object reference not set to an instance of an object
at System.Drawing.ComIStreamMarshaler+ManagedToNativeWrapper..cctor () [0x00049] in <ab9e008c8c264c02bf011ee5162d1a92>:0
Rethrow as TypeInitializationException: The type initializer for 'ManagedToNativeWrapper' threw an exception.
at System.Drawing.ComIStreamMarshaler.MarshalManagedToNative (System.Object managedObj) [0x00000] in <ab9e008c8c264c02bf011ee5162d1a92>:0
at (wrapper managed-to-native) System.Drawing.GDIPlus.GdipLoadImageFromStream(System.Runtime.InteropServices.ComTypes.IStream,intptr&)
at System.Drawing.Image.InitFromStream (System.IO.Stream stream) [0x000c7] in <ab9e008c8c264c02bf011ee5162d1a92>:0
at System.Drawing.Image.LoadFromStream (System.IO.Stream stream, System.Boolean keepAlive) [0x00011] in <ab9e008c8c264c02bf011ee5162d1a92>:0
at System.Drawing.Image.FromStream (System.IO.Stream stream) [0x00000] in <ab9e008c8c264c02bf011ee5162d1a92>:0
at PdfSharp.Drawing.XImage..ctor (System.IO.Stream stream) [0x00034] in <bd3f3af751f04f23ad39a8c42de34910>:0
at PdfSharp.Drawing.XImage.FromStream (System.IO.Stream stream) [0x0001e] in <bd3f3af751f04f23ad39a8c42de34910>:0
at Test+<ExportPDF>d__3.MoveNext () [0x000d8] in <998cadfa43ed424eb26496e775e099c0>:0
at UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) [0x00027] in <52d7b92b1d0e4868ac4c518247d361f7>:0

(Filename: <ab9e008c8c264c02bf011ee5162d1a92> Line: 0)


It still seems XGraphics.DrawImage is what doesn't work properly, and once more, while in the Unity editor, everything works fine, it's only once I compile a build that I get the error.

Hope this might shed some more light on it... I'm still as lost as I initially was :S.


Top
 Profile  
Reply with quote  
PostPosted: Fri Jan 17, 2020 7:15 am 
Offline
PDFsharp Expert
User avatar

Joined: Sat Mar 14, 2015 10:15 am
Posts: 909
Location: CCAA
CCabarcos wrote:
I'm not using the IssueSubmissionTemplates because I'm working on a Unity project, not a straight .net solution, so I don't think it would apply properly.
Your choice. We're working on a straight .NET library and will not investigate problems we cannot replicate.

_________________
Best regards
Thomas
(Freelance Software Developer with several years of MigraDoc/PDFsharp experience)


Top
 Profile  
Reply with quote  
PostPosted: Fri Jan 17, 2020 8:21 am 
Offline

Joined: Thu Jan 16, 2020 4:37 pm
Posts: 4
TH-Soft wrote:
CCabarcos wrote:
I'm not using the IssueSubmissionTemplates because I'm working on a Unity project, not a straight .net solution, so I don't think it would apply properly.
Your choice. We're working on a straight .NET library and will not investigate problems we cannot replicate.


I think you missunderstood me. I don't mind using the tools you kindly provide, of course, I'm just not sure about how I could provide a template that actually shows the problem.

Would a link to the project itself be ok? or what approach should I take?

Thank you.


Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 7 posts ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 134 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Privacy Policy, Data Protection Declaration, Impressum
Powered by phpBB® Forum Software © phpBB Group