Jump to content
Unity Insider Forum

Bilder in ein PDF speichern


quieri19

Recommended Posts

Hallo zusammen,

ich möchte mit Unity on Runtime ein PDF erstellen. An sich funktioniert das schon so weit. Es lässt sich lokal, oder über ein PHP Skript im Web herunterladen. Leider lassen sich aber keine Bilder in das PDF einfügen. Habe schon diverse Ansätze versucht, leider komme ich hier nicht weiter, vielleicht kann mich hier jemand unterstützen. Bin auch schon auf den Betrag von @minuschki

https://forum.unity-community.de/profile/7222-minuschki/

gestoßen, aber leider komme ich mit diesem Beitrag auch nicht weiter: 

Hier mein Code V1: Lokaler Download:

public void CreatePDF(string Filename)
    {


        pdfDocument myDoc = new pdfDocument("Sample Application", "Me", false);
        pdfPage myFirstPage = myDoc.addPage();



        //		Debug.Log ( "Continue to create PDF");
        myFirstPage.addText("Ein PDF-Datenblatt erstellen...", 10, 730, predefinedFont.csHelveticaOblique, 30, new pdfColor(predefinedColor.csBlack));

        RawImage image1 = Schachtkonfigurator._schachtkonfigurator.Info.transform.Find("Bild_canBelastungsklasse").GetComponent<RawImage>();
        Texture2D _2D = (Texture2D)image1.texture;
        SetTextureImporterFormat(_2D, true);
        Texture2D decopmpresseTex = ExtensionMethod.DeCompress(_2D);
        byte[] _byte = decopmpresseTex.EncodeToJPG();


        //Texture2D _2D = TextureToTexture2D(image1.texture, 100, 100);
        //byte[] _byte = _2D.EncodeToJPG();

        //color1.a = 1f;
        myFirstPage.addImage(_byte, 10, 5, 300, 300);

        /*Table's creation*/
        pdfTable myTable = new pdfTable();
        //Set table's border
        myTable.borderSize = 1;
        myTable.borderColor = new pdfColor(predefinedColor.csDarkBlue);

        /*Add Columns to a grid*/
        myTable.tableHeader.addColumn(new pdfTableColumn("Model", predefinedAlignment.csRight, 120));
        myTable.tableHeader.addColumn(new pdfTableColumn("Speed", predefinedAlignment.csCenter, 120));
        myTable.tableHeader.addColumn(new pdfTableColumn("Weight", predefinedAlignment.csLeft, 150));
        myTable.tableHeader.addColumn(new pdfTableColumn("Color", predefinedAlignment.csLeft, 150));


        pdfTableRow myRow = myTable.createRow();
        myRow[0].columnValue = "A";
        myRow[1].columnValue = "100 km/h";
        myRow[2].columnValue = "180Kg";
        myRow[3].columnValue = "Orange";

        myTable.addRow(myRow);

        pdfTableRow myRow1 = myTable.createRow();
        myRow1[0].columnValue = "B";
        myRow1[1].columnValue = "130 km/h";
        myRow1[2].columnValue = "150Kg";
        myRow1[3].columnValue = "Yellow";

        myTable.addRow(myRow1);



        /*Set Header's Style*/
        myTable.tableHeaderStyle = new pdfTableRowStyle(predefinedFont.csCourierBoldOblique, 12, new pdfColor(predefinedColor.csBlack), new pdfColor(predefinedColor.csLightBlue));
        /*Set Row's Style*/
        myTable.rowStyle = new pdfTableRowStyle(predefinedFont.csCourier, 8, new pdfColor(predefinedColor.csBlack), new pdfColor(predefinedColor.csWhite));
        /*Set Alternate Row's Style*/
        myTable.alternateRowStyle = new pdfTableRowStyle(predefinedFont.csCourier, 8, new pdfColor(predefinedColor.csBlack), new pdfColor(predefinedColor.csWhite));
        /*Set Cellpadding*/
        myTable.cellpadding = 10;
        /*Put the table on the page object*/
        myFirstPage.addTable(myTable, 5, 495);

        myDoc.createPDF(Filename);
    }

    private Texture2D TextureToTexture2D(Texture texture, int wid, int heig)
    {
        Texture2D texture2D = new Texture2D(wid, heig, TextureFormat.RGBA32, false);
        RenderTexture currentRT = RenderTexture.active;
        RenderTexture renderTexture = RenderTexture.GetTemporary(wid, heig, 32);
        Graphics.Blit(texture, renderTexture);

        RenderTexture.active = renderTexture;
        texture2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
        texture2D.Apply();

        RenderTexture.active = currentRT;
        RenderTexture.ReleaseTemporary(renderTexture);
        return texture2D;
    }

public void createPDF(string outputFile)
		{	
			FileStream _myFileOut = null;;
			try {				
				_myFileOut = new FileStream(outputFile, FileMode.Create);
				createPDF(_myFileOut);				
			} catch (IOException exIO) {
				throw new pdfWritingErrorException("Errore nella scrittura del file",exIO);
			} catch (pdfWritingErrorException exPDF) {
				throw new pdfWritingErrorException("Errore nella scrittura del PDF",exPDF);
			} finally {
				if (_myFileOut != null) {
					_myFileOut.Close();
					_myFileOut = null;
				}
			}
		}
public void createPDF(Stream outStream)
		{
			BufferedStream _myBuffer = null;
			long _bufferLength = 0;

			initializeObjects();            
			try {
				//Bufferedstream's initialization 
				_myBuffer = new BufferedStream(outStream);
				
				//PDF's definition
				_bufferLength += writeToBuffer(_myBuffer , @"%PDF-1.4" + Convert.ToChar(13) + Convert.ToChar(10));	         
				
				//PDF's header object
				_trailer.addObject(_bufferLength.ToString());
				_bufferLength += writeToBuffer(_myBuffer, _header.getText());

				//PDF's info object
				_trailer.addObject(_bufferLength.ToString());
				_bufferLength += writeToBuffer(_myBuffer, _info.getText());

				//PDF's outlines object
				_trailer.addObject(_bufferLength.ToString());
				_bufferLength += writeToBuffer(_myBuffer, _outlines.getText());

				//PDF's bookmarks
				foreach(pdfBookmarkNode Node in _outlines.getBookmarks()) {
					_trailer.addObject(_bufferLength.ToString());
					_bufferLength += writeToBuffer(_myBuffer, Node.getText());
				}

				//Fonts's initialization
				foreach (pdfFont font in _fonts) {
					_trailer.addObject(_bufferLength.ToString());
					_bufferLength += writeToBuffer(_myBuffer, font.getText());				
				}
				//PDF's pagetree object
				_trailer.addObject(_bufferLength.ToString());
				_bufferLength += writeToBuffer(_myBuffer, _pageTree.getText());

				//Generation of PDF's pages
				foreach(pdfPage page in _pages) {
					_trailer.addObject(_bufferLength.ToString());
					_bufferLength += writeToBuffer(_myBuffer, page.getText());

					foreach (pdfElement element in page.elements) {
						//if (element.GetType().Name == "imageElement") {
						if (element is imageElement) {
							_trailer.addObject(_bufferLength.ToString());
							_bufferLength += writeToBuffer(_myBuffer, element.getText());
							_trailer.addObject(_bufferLength.ToString());
							_bufferLength += writeToBuffer(_myBuffer, ((imageElement)element).getXObjectText());
							_bufferLength += writeToBuffer(_myBuffer, "stream" + Convert.ToChar(13) + Convert.ToChar(10));
							_bufferLength += writeToBuffer(_myBuffer, ((imageElement)element).content);
							_bufferLength += writeToBuffer(_myBuffer, Convert.ToChar(13).ToString());
							_bufferLength += writeToBuffer(_myBuffer, Convert.ToChar(10).ToString());
							_bufferLength += writeToBuffer(_myBuffer, "endstream" + Convert.ToChar(13) + Convert.ToChar(10));
							_bufferLength += writeToBuffer(_myBuffer, "endobj" + Convert.ToChar(13) + Convert.ToChar(10));
						} else {
							_trailer.addObject(_bufferLength.ToString());
							_bufferLength += writeToBuffer(_myBuffer, element.getText());
						}
					}					

				}
				//PDF's trailer object
				_trailer.xrefOffset = _bufferLength;
				_bufferLength += writeToBuffer(_myBuffer, _trailer.getText());
				//Buffer's flush
				_myBuffer.Flush();					          
			} catch (IOException ex) {
				throw new pdfWritingErrorException("Errore nella scrittura del PDF",ex);			
			} finally {
				if (_myBuffer != null) {				
					_myBuffer.Close();
					_myBuffer = null;  
				}
			}
		}

Das Ergebnis ist hier zu sehen. 

Das Bild wird einfach nicht richtig angezeigt.

Vielen Dank für eure Unterstützung.

Beste Grüße

quieri19

test.pdf

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oben schreibst du, dass sich das Bild nicht einfügen lässt.
Unten schreibst du aber, dass das Bild "einfach" nicht richtig angezeigt wird. Und es ist auch ein Bild in der PDF drin...
Also geht's ja doch?!

Wie soll es denn angezeigt werden?
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo malzbie,

vielen Dank für deine Unterstützung, da hast du recht, ich war selber gerade erstaunt, wenn man das PDF direkt in diesem Forum wieder herunterlädt und im Chrome öffnet, wird das Bild (zwar nur ein Ausschnitt) richtig angezeigt. Macht man das heruntergeladene PDF aber zum Beispiel mit Adobe auf, ist das Bild total verzerrt und du kannst meinen Fehler erkennen. Wahrscheinlich werden hier nur Bytes verschoben, das ist aber doch schon mal ein guter Hinweis.

Wollte das PDF deshalb zunächst einmal lokal erstellen und wenn das funktioniert, einen PostRequest senden (Nutze hier WWWForm und UnityWebRequest). Generell wird sharpPDF verwendet. 

Im direkten Download verwende ich

BufferedStream 
so schafft man es, dass wenigstens was verzerrtes drauf ist^^. 

Das PDF soll aber später Online (WebGL) erzeugt werden 

Wenn ich das PDF aber per PostRequest an mein PHP schicke, dann wandelt er mir leider das Bild um und ich sehe (mit Notepad++), dass aus den Bytes des Bildes dann nur noch ??? eingesetzt werden. Der Text und die Tabellen des PDF´s funktionieren. Wenn das Bild mitgeschickt wird, ist dadurch die PDF ganz zerstört und das PDF kann nicht geöffnet werden. Liegt wahrscheinlich an UTF-8 / ASCII aber das hab ich auch noch nicht raus gefunden.

Deshalb wie gesagt zunächst einmal lokal erstellen, wenn das funktioniert dann Web.

Vielleicht weiß hier jemand weiter, oder kennt einen anderen Weg um ein PDF in Unity zu erzeugen.

Ich hoffe das hilft Dir, vielleicht hast du aber auch den Code den du für minuschki

gelöst hast, er hatte ja ein Ähnliches Problem.

DAS WÄRE WAHNSINN, vielen DANK.

Bytestream des funktionierenden PDF beim PostRequest::

20 0 obj
<<
/Type /XObject
/Subtype /Image
/Name /I20
/Filter /DCTDecode
/Width 300
/Height 300
/BitsPerComponent 8
/ColorSpace /DeviceRGB
/Length 49548
>>
stream
ÿØÿà JFIF    ÿÛ C         
$.' ",#(7),01444'9=82<.342ÿÛ C             2!!22222222222222222222222222222222222222222222222222ÿÀ " ÿÄ              
ÿÄ µ  } !1AQa"q2‘¡#B±ÁRÑð$3br‚    
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ          
ÿÄ µ w !1AQaq"2B‘¡±Á    #3RðbrÑ
$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ ? ùþŠ( Š( Š( Š(  etc.

Bytestream des NICHT-funktionierenden PDF beim PostRequest:

24 0 obj
<<
/Type /XObject
/Subtype /Image
/Name /I24
/Filter /DCTDecode
/Width 300
/Height 300
/BitsPerComponent 8
/ColorSpace /DeviceRGB
/Length 49548
>>
stream
???? JFIF    ?? C         
$.' ",#(7),01444'9=82<.342?? C             2!!22222222222222222222222222222222222222222222222222?? " ??              
?? ?  } !1AQa"q2???#B??R??$3br?    
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz???????????????????????????????????????????????????????????????????????????          
?? ? w !1AQaq"2?B????    #3R?br?
$4?%?&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?????????????????????????????????????????????????????????????????????????? ? ???(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??*X????c?G.@P?M EEt??)=4? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&??A|S? @? ??h????A|S? @? ??h? ?????? ?&?9?+?? ?????? ?&???S_?m^??H????I P=?????/?b?@Q@Q@Q@Q@Q@T????QF?\????? {?O???(?\?# ?|?s???N;u??l?*??+k{u?!???h??h?l???????XaXWlk?r2RkF?
(??
(??
(??

etc..

Link zu diesem Kommentar
Auf anderen Seiten teilen

So richtig kann ich dir leider nicht helfen, weil ich in der PDF Materie nicht drin bin.
Ich weiß aber, dass PDF ja eigentlich ein Format für den Drucker ist. Das bedeutet, dass das Layout, was du siehts genau so auf dem Drucker erscheint.
Damit das funktioniert, müssen aber auch alle Steuerungs-Tags drin sein. Das ist so ähnlich wie beim HTML. Wenn du da in einem Bereich eine End-Befehl vergisst, zeigt der Browser dir trotzdem noch etwas an, aber eben falsch weil er von oben nach unten durchfährt und dann erst der Fehlende Befehl auffällt.
PDF ist außerdem schwierig zu handhaben, weil es sehr viele Versionen gibt und die nicht immer kompatibel sind.
Deine PDF ist irgendwo schadhaft. Ich habe die Datei mal mit 2 Browsern angeschaut und diesen Unterschied festgestellt:


2browser.thumb.png.b9258e46ad06625df45cebf195183e55.png
Links ist der Edge, Rechts ist der FireFox am Werk.

Der Edge hat komplette Skalierungsprobleme, der Firefox kann es eigentlich. Wenn ich die Datei in irgendeine Adobe SW einlade, wie z.B. Photoshop dann ist die Grafik als solches nicht zu erkennen, die ist da komplet im Arsch.

Du musst dich da wohl noch ein wenig schlau machen, was für Daten in die PDF rein müssen, damit alles passt. Momentan ist die Sache noch nicht vollständig bzw. falsch konfiguriert.

Du brauchst außerdem auf jeden Fall einen Einen Editor, der die die Hex-Werte anzeigt, damit du genau erkennst was da ist. So wie hier im Bild.

hex.png.72e3a41afa55f1721ae8ef80833466a5.png

Zu sehen, dass in der defekten Datei Fragezeichen drin sind, reicht nicht aus.

Mehr kann ich leider nicht sagen. Aber ich glaube es fehlt nicht mehr viel. Du kriegst das hin! :)

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

 

 

Hallo malzbie,

vielen Dank dass du Dir so viel Arbeit machst, aber irgendwie komme ich mit SharpPDF, oder generell PDF in Unity erzeugen nicht weiter. 

->Deshalb neue Vorgehensweise: Ich hole mir die Bilder und Daten die ich brauche und sende Sie per Post an ein Python-Programm, dort gibt es eine gute Library mit der ich mir dann das PDF mit den zuvor geschickten Daten sauber erstellen kann und als Download zur Verfügung stellen kann.

Hier die funktionierende Testumgebung falls jemand so etwas mal braucht. 

StartCoroutine(postRequest("http://127.0.0.1:5000/sendfile"));

IEnumerator postRequest(string url)
    {
        WWWForm form = new WWWForm();

        form.AddField("Datenblatt ",  X.transform.GetChild(0).GetComponent<ElementDaten>
          
        RawImage image1 = Schachtkonfigurator._schachtkonfigurator.Info.transform.Find("Bild_canBelastungsklasse").GetComponent<RawImage>();
        Texture2D _2D = (Texture2D)image1.texture;
        SetTextureImporterFormat(_2D, true);
        Texture2D decopmpresseTex = ExtensionMethod.DeCompress(_2D);
        byte[] _byte = decopmpresseTex.EncodeToPNG();
        form.AddBinaryData("profilePictureImage", _byte, "Pic.png", "image/png");

        UnityWebRequest uwr = UnityWebRequest.Post(url, form);
        yield return uwr.SendWebRequest();

        if (uwr.isNetworkError)
        {
            Debug.Log("Error While Sending: " + uwr.error);
        }
        else
        {
            Debug.Log("Received: " + uwr.downloadHandler.text);
        }
    }

 

Test:

from flask import Flask, request
import json
import os

app = Flask(__name__)


@app.route('/sendfile', methods=['GET', 'POST'])
def hello_world():
    if request.method == 'POST':
        print(request.form)
        imagefile = request.files.get('profilePictureImage', '')
        imagefile.save(os.path.join('./static', imagefile.filename))
        return json.dumps({'success': True}), 200, {'ContentType': 'application/json'}
    return json.dumps({'success': True}), 400, {'ContentType': 'application/json'}


if __name__ == '__main__':
    app.run(debug=True)

Dann stehen Daten und Bilder sauber zur Verfügung.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...