{the magic lies between the brackets}

Schlagwort: File (Seite 1 von 1)

[WP8] PDF-Datei aus dem Web laden und per App anzeigen

Eine PDF-Datei aus dem Web herunterzuladen und anzuzeigen ist relativ einfach.
Folgender Methoden laden die Webseite, laden die PDF-Datei herunter, speichern diese in den Isolated Storage und starten die externe App mit dem Pfad der Datei.

Folgende Links geben weitere Informationen zu folgendem Code:

WebClient pdfDownloader = null;
string LastFileName = ""; //Speichert den Dateinamen der zuletzt gesicherten Datei

private void StartPDFDownload()
{
    pdfDownloader = new WebClient(); //prevents that the OpenReadCompleted-Event is called multiple times
    pdfDownloader.OpenReadCompleted += DownloadPDF; //Create an event handler
    pdfDownloader.OpenReadAsync(new Uri("Your URL as string with HTTP://")); //Start to read the website
}

async void DownloadPDF(object sender, OpenReadCompletedEventArgs e)
{
    byte[] buffer = new byte[e.Result.Length]; //Gets the byte length of the pdf file
    await e.Result.ReadAsync(buffer, 0, buffer.Length); //Waits until the rad is completed (Async doesn't block the GUI Thread)

    using (IsolatedStorageFile ISFile = IsolatedStorageFile.GetUserStoreForApplication())
    {
        try
        {
            LastFileName = "tempPDF" + DateTime.Now.Ticks + ".pdf";
            using (IsolatedStorageFileStream ISFileStream = ISFile.CreateFile(LastFileName))
            {
                await ISFileStream.WriteAsync(buffer, 0, buffer.Length);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message + Environment.NewLine + ex.HResult,
                ex.Source, MessageBoxButton.OK);
            //Catch errors regarding the creation of file
        }
    }
    OpenPDFFile();
}

private async void OpenPDFFile()
{
    StorageFolder ISFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
    try
    {
        IStorageFile ISFile = await ISFolder.GetFileAsync(LastFileName);
        await Windows.System.Launcher.LaunchFileAsync(ISFile);
            //http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj206987%28v=vs.105%29.aspx
    }
    catch (Exception ex)
    {
        //Catch unknown errors while getting the file
        //or opening the app to display it
    }
}

Text in Android drucken

Einige Entwickler wollen, dass ihr Programm über einen normalen Drucker Textdateien ausdrucken kann.
Sei es für die Ausgabe von Log-Dateien oder für andere Dateien.
Das gleiche Problem hatte auch ich.
Mein Programm sollte einige Daten auslesen, in ein bestimmtes (vordefiniertes) Muster packen und speicher(als HTML-Datei).
Diese Datei sollte dann auf ein DIN A4 Blatt gedruckt werden.
Um anderen den Weg zu ersparen, alles googlen zu müssen. Habe ich hier den Code angehängt:

package com.x.y;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import android.os.AsyncTask;
import android.text.Html;
import android.text.Spanned;

public class PrintTask extends AsyncTask<Void, Void, Void> {

String printerAddress;
String printerPort;

    public PrintTask(String port) {
        printerAddress = ip;
        printerPort = port;
    }

    @Override
    protected Void doInBackground(Void... params){
        try{
        int PrinterPort =Integer.parseInt(printerPort);
        Socket clientSocket = null;
       DataOutputStream OutStream = null;

        // open connection
        clientSocket = new Socket(printerAddress, PrinterPort);
        // open data output stream
        OutStream = new DataOutputStream(clientSocket.getOutputStream());
        File f = new File("/sdcard/index.html");
        System.out.println("Reading from file.");
        StringBuilder text = new StringBuilder();
        Scanner scanner = new Scanner(new FileInputStream(f));
        String printthis = null;
        try {
          while (scanner.hasNextLine()){
            text.append(scanner.nextLine()+ "\r\n");
                String htmlcontent = text.toString();
                System.out.println(htmlcontent);
                // here comes the code from the html file
                 Spanned htmlencoded = Html.fromHtml(htmlcontent);
                 printthis = htmlcontent;

          }
              OutStream..writeChars(printthis);
              OutStream..equals(f);
        }
        finally{
          scanner.close();
        }
        System.out.println("Text read in: " + text);
        // close data stream and socket
        OutStream.close();
        clientSocket.close();
        }catch(IOException e){
            e.printStackTrace();
        }

        return null;
    }

    protected Void onPostExecute(Integer inte){
        return null;
    }

}

Dieser Code macht, einfach gesagt folgendes:
1. Öffnet einen Stream zum Drucker. IP und Port können über den Konstruktor (PrintTask) an den AsyncTask (Thread) übrgeben werden.
2. liest die Datei Zeile für Zeile ein und druckt diese aus. (Codiert in HTML)

Ich habe versucht, soweit wie mögich alle Fehler mit try-catch auszuschließen.
Dies muss aber ggf. angepasst werden.

Achtung:
Es müssen folgende Berechtigungen in der Manifest.xml gesetzt werden:

„android.permission.ACCESS_NETWORK_STATE“
„android.permission.ACCESS_WIFI_STATE“
„android.permission.INTERNET“
„android.permission.READ_EXTERNAL_STORAGE“

Dateien auf externen Speicher schreiben (SD-Karte)

In meinem vorigen Beispiel habe ich Dateien vom externen Speicher ausgelesen (HTML-Datei).
Nun muss diese natürlich vorher gespeichert werden.
Dies geht ganz simpel mit folgendem Code:

Es wird ein File / eine Datei mit Namen „print.txt“ in folgendem Pfad „/sdcard/“ erstellt.
Dann wird ein filewriter erstellt und eine Zeichenkette „xyz“ in das File geschrieben.

 File f = new File("/sdcard/print.txt");
FileWriter filewriter = new FileWriter(f);
BufferedWriter bfilewriter = new BufferedWriter(filewriter);
bfilewriter.write("xyz);

Danach muss der BufferedFileWriter geflusht und geschlossen werden:

 bfilewriter.flush();
bfilewriter.close();

Dieser Vorgang benötigt die Permission:

„android.permission.WRITE_EXTERNAL_STORAGE“

in der Manifest.xml