Imprimer une envelope. #10

Bonjour a tous.
Encore une fois une demande d’aide.

Voici mon problème, je veut imprimé une envelope,
avec mon database, un mom, une addresse, un code postal.

Tout fonctionne bien, avec une feuille de 8.5 x 11, je peut insérez
ces trois ligne au centre ou à tout endroit que je veux.

Si je remplace les feuille “Lettre A4” par des envelope #10, voici le code:

html1.perPageContentInsets = UIEdgeInsets(top: 260, left: 325, bottom: 20, right: 5)

sur 4 imprimante de test 2 LES RÉSULTAT SONT PARFAIT, mais les 2 autres
type d’imprimante Brother, Hp, réponde erreur de papier et n’imprime pas.

J’ai aussi demander une leçon sur les imprimante.
Prochains chapitres iOS 11 et Swift 4.
Mais faire une demande maintenant… semble peut probable, certaine demande
date de plusieure mois, et on réusit à avoir quelque coeur, mais de moins en moins
de personne vont voir cette rubrique maintenant, comme Maxime dit :crossed_fingers: les doits, elle date de sept 2017. Une en Nov, Une en Dec, zéro en Jan. zéro en Fev.

Donc c’est pourquois je demande de l’aide.
COMMENT FAIRE POUR:

Changé le papier de format ?

Pour imprimé landscape.?

Pourquois les codes n’ont aucun influence ?

  html1.maximumContentWidth  = 9.5 * 72.0
  html1.maximumContentHeight = 4.12 * 72.0

------Merci de votre aide--------

SVP. Si vous lisez cette demande et ne pouvez m’aider pour le moment
allez sur http://community.purplegiraffe.fr/t/prochains-chapitres-ios-11-et-swift-4/661

la demande 31 et un petit coeur Merci.:heart_eyes:

Salut utilise tu UIPrintInteractionControllerDelegate ? Le délégué permet à priori de définir des taille de papier personalisé grâce à un CGSize ou CGRect dans UIPrintPaper.paperSize ou UIPrintPaper.paperRect quand tu passe à ta page d’impression normalement le papier s’imprime au format que tu aura défini auparavant dans le délégué d’après ce que je comprend dans la doc Apple. C’est un sujet que je ne maîtrise pas personnellement je n’en est jamais eu besoin mais je te file le miens de la doc sur le délégué d’impression.

https://developer.apple.com/documentation/uikit/uiprintinteractioncontrollerdelegate

Merci a toi. nicopicks
Voici ma class.

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UIPrintInteractionControllerDelegate

Une question quand on utilise un Delegate exemple pour les tables.
" tableMain.dataSource = self “
” tableMain.delegate = self "

mais pour UIPrintInteractionControllerDelegate a t’on un self a confirmé.
Je te demande cette question car tout les options de print delegate semble
pas fonctionner. Ou simplement aurais-tu un exemple de code un lien, pour
voir comment employer ces options, il semble avec apple il me manque
quelque chose, que je saisie pas. Spécialement.
optional func printInteractionController(_ printInteractionController:
UIPrintInteractionController, choosePaper paperList: [UIPrintPaper]) -> UIPrintPaper

Merci de ton aide.

Je trouve peu d’examples et surtout en swift la plupart mentionne de déclarer une variable qui contient le controller appelle quand tu appuis sur le bouton de partage pour imprimé: var printController = UIPrintInteractionController.shared. Ensuite tu le déclare dans ton viewDidLoad printController.delegate = self je sais pas comment fonctionne ton app mais la dès que tu fais partagé imprimer ce que tu configure dans le délégué devrait être pris en compte je pense

Bonjour,

Je trouve peu d’examples et surtout en swift

Tu est deja mieux que moi, je n’ai rien trouver.

Voici le listing que j’utilise.

= = = = = = = = = = = = = = = = = = = = = = =
la Class…
class ViewController: UIViewController, UITableViewDataSource,
UITableViewDelegate, UIPrintInteractionControllerDelegate

dans les var…
var printController = UIPrintInteractionController.shared

dans override func viewDidLoad()…
printController.delegate = self

Voici la function.

@IBAction func acEnv(_ sender: Any) {
        txt1 = "<!DOCTYPE html><html>"
        txt1 = txt1 + "<body>"
        txt1 = txt1 + "<font face=\"Courier\">"
	    txt1 = txt1 + "Robert" + "<br>"
	    txt1 = txt1 + "This Adresst" + "<br>" 
	    txt1 = txt1 + "Cod Postal" + "<br>"
        txt1 = txt1 + "</font></body></html>"
        let html1 = UIMarkupTextPrintFormatter.init(markupText: txt1)
        html1.perPageContentInsets = UIEdgeInsets(top: 260, left: 325, bottom: 20, right: 5)
        
        html1.maximumContentWidth  = 9.5 * 72.0  		// aucune utilité change Rien
        html1.maximumContentHeight = 4.12 * 72.0 		// aucune utilité change Rien
        
        let pInfo : UIPrintInfo = UIPrintInfo.printInfo()   
        pInfo.outputType = UIPrintInfoOutputType.general
        pInfo.jobName = "My Print Job"
        pInfo.orientation = UIPrintInfoOrientation.landscape  // Si j'utilise pinfo landscape FONCTIONNE bien.
        
        printController.printInfo = pInfo
        
        printController.printFormatter = html1
        printController.present(animated: true, completionHandler: nil)
    }

Avec ce code j’imprime des envelope 4.12 x 9.5 model #10
Comme mentionner je ne trouve pas la façon de selectionner le papier
et sa foire sur plusieures imprimante.

[EDIT ]Enfait lorsque tu utilise printInteractionController(_:choosePaper:) la fonction du délégué celle ci te retourne un tableau de papier utilisable actuellement par l’imprimante. Je n’ai que une imprimante HP pour tester voila comment ca se comporte chez moi j’utilise la fonction précédente dedans je met let paper = UIPrintPaper.bestPaper(forPageSize: size, withPapersFrom: paperList) size correspond a un CGSize précédement crée et en fait paperList retourne les format de papier qui sont dans l’imprimante, je n’ai qu’un chargeur qui contient du A4 et si je change de papier pour mettre une enveloppe la taille n’est pas reconnu immédiatement si je change pas le format de papier dans les option de l’imprimante donc mon paperList contient uniquement une seule taille. Quand je met mon enveloppe et que je configure mon format de papier dans mon imprimante comme un enveloppe #10 cela fonctionne. A priori il est impossible de changer le format du papier contenue dans l’imprimante c’est une info qui est reçu par l’app depuis l’imprimante via AirPrint. Je te met le code que j’ai utiliser pour tester:

 //
//  ViewController.swift
//  testprint
//
//  Created by Nicolas on 09/03/2018.
//  Copyright © 2018 Nicolas. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UIPrintInteractionControllerDelegate {
    var txt1 = ""
    var printController = UIPrintInteractionController.shared
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        printController.delegate = self
        acEnv()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    
    func printInteractionController(_ printInteractionController: UIPrintInteractionController, choosePaper paperList: [UIPrintPaper]) -> UIPrintPaper {
        
        
        let size = CGSize(width: 252, height: 360) //Tu créer la taille de ton papier
        let paper = UIPrintPaper.bestPaper(forPageSize: size, withPapersFrom: paperList) //tu lui dit de trouver le papier contenu dans ton imprimante qui correspond au mieux a la taille que tu souhaite
        
        for i in paperList { //ce for in est la juste pour te mettre dans les logs le ou les (si tua s plusieur chargeurs) format disponible dans ton imprimante
            print(i.paperSize)
        }
        
        print("------", paper.paperSize) //ce print te met dans le log le format choisis par le délégué pour imprimé
        
        return paper
    }
    
    func acEnv() {
        txt1 = "<!DOCTYPE html><html>"
        txt1 = txt1 + "<body>"
        txt1 = txt1 + "<font face=\"Courier\">"
        txt1 = txt1 + "Robert" + "<br>"
        txt1 = txt1 + "This Adresst" + "<br>"
        txt1 = txt1 + "Cod Postal" + "<br>"
        txt1 = txt1 + "</font></body></html>"
        let html1 = UIMarkupTextPrintFormatter.init(markupText: txt1)
        html1.perPageContentInsets = UIEdgeInsets(top: 260, left: 325, bottom: 20, right: 5)
        
        let pInfo : UIPrintInfo = UIPrintInfo.printInfo()
        pInfo.outputType = UIPrintInfoOutputType.general
        pInfo.jobName = "My Print Job"
        pInfo.orientation = UIPrintInfoOrientation.landscape  // Si j'utilise pinfo landscape FONCTIONNE bien.
        
        printController.printInfo = pInfo
        
        printController.printFormatter = html1
        printController.present(animated: true, completionHandler: nil)
    }
}

Imprimer sur une enveloppe C6 =)

En espérant t’avoir aidé =)

Merci nicopicks.

Le résultat après deux long jours de travail :weary:
Je suis au même point de départ, avec beaucoup plus
de test et de bug avec l’imprimante.

J’ai installer printer simulateur, et c’est encore plus
découragent. Je comprend maintenant pourquoi
personne ne veut faire un tutorial sur l’imprimante.

Rien sur le net ni sur git.

Merci beaucoup pour ton aide.

Le vrai problème est que UIPrintPaper.bestPaper est seulement
en read(lecture) et change de format avant l’ouverture de l’imprimante
et change encore quand il imprime, en plus la page de sélection, j’utilise
un standard envelope #10 soit 4.12 x 9.5. J’ai vérifier avec un PC et tout
va bien, mais avec AIR PLAY tout une autre histoire.
Chaque imprimante choisie une page, aucune a la même page, et même
certaine reste sur un envelope de 4 x 5 la documentation apple sur
mode PHOTO ne fonctionne pas comme prévu…
Bon avec de la chance Maxime passeras peut’ être par ici avec un peut de
chance… :crossed_fingers::crossed_fingers::crossed_fingers:

Bonsoir,

En effet, l’option printInfo.outputType = .general propose par défaut un format A4.

Ma solution consiste à laisser l’utilisateur lui même le bac à papier de l’imprimante. Il faut préciser l’option showsPaperSelectionForLoadedPapers avant de présenter le printController. Par exemple, comme ceci :

printController.printInfo = pInfo
printController.showsPaperSelectionForLoadedPapers = true
printController.showsNumberOfCopies = false

printController.printFormatter = htmlContent
printController.present(animated: true) { (printController, status, error) in
    print("completionHandler returned status = \(status)")
    if let error = error {
        print(error.localizedDescription)
    }
}

Autre point, je préconise de tester avant si l’impression est possible dès le départ, dans viewDidLoad :

print ("viewDidLoad : isPrintingAvailable = \(UIPrintInteractionController.isPrintingAvailable)")
if UIPrintInteractionController.isPrintingAvailable {
    printController.delegate = self
} else {
    // outlet sur bouton "Imprimer"
    ui_printButton.removeFromSuperview()
}

Cordialement

Merci Yves, une très bonne tentative.
Voici deux problème avec cette solutions.
La première est que très peu d’imprimante on deux tray
un pour les papier lettre et le deuxième pour les enveloppes.
Voici le code de Apple.

On printers where only one paper type is available, no paper selection menu is displayed,
regardless of the value of this property.

Le deuxième problème encore plus important, une fois que tu choisi le type de papier
c’est imprimante qui choisi le size de l’enveloppe, de ce fait on revient au tout
début du problème. Air Print ne permet pas de choisir la dimension du papier.

Avec les recherche j’ai trouvé le code software du language PCL de tout les
imprimante HP “~033[E~033[&l81A~033[E~033[%-12345X” ce code sélectionne
une enveloppe #10, ca corrige pas tout mais HP, pas bête mais sa ne fonctionne
pas, il semble que Air Print ne laisse pas passé le code escape.

Merci, pour cette solution, il semble que les chances de réussir a imprimer une
enveloppe soit vraiment compliquer. :disappointed_relieved:

@aucrobert mon code avec une imprimante charger en enveloppe #10 et configurer dans l’imprimante comme tel ne fonctionne pas chez toi ? Car chez moi avec mon imprimante hp ça marche

Nicopicks a raison, AirPrint permet de choisir « au mieux » (BestPaper) le format de papier, et sa solution fonctionne.

Dans la routine choosePaper in faut demander le format spécifique, par ex pour une enveloppe C10 c’est 1.1 x 1.6 pouces (d’après Dimensions de formats d’enveloppe de la série C) cela donne ceci :

// Create a custom CGSize.
customPaperSize = CGSize(1.1 * 72.0, 1.6 * 72.0)

AirPrint renvoie le format le plus adapté, en fonction de ce que l’imprimante lui a fourni. La question est : Que renvoie ton imprimante à AirPrint dans la liste des formats disponibles paperList ? l’option bestPaper va choisir le plus proche.

Tu veux faire à l’ancienne et envoyer des séquences d’échappement à l’imprimante, à priori il faut passer via wifi, avec un truc du genre :

class PrinterSocket {

    var addr: String
    var port: Int
    var task: NSURLSessionStreamTask!

    init(host: String, port: Int){
        print("init")
        self.addr = host
        self.port = port
        setupConnection()
    }

    func setupConnection() {
        print("setup")
        let session = NSURLSession(configuration: .defaultSessionConfiguration())

        task = session.streamTaskWithHostName(addr, port: port)
        self.task.resume()
    }

    func send(data: NSData) {
        self.task.writeData(data, timeout: 5.0) { (error) in
            if error == nil {
                print("Data sent")
            } else {
                print("Nope")
            }
        }
    }
}

let socket = PrinterSocket(host: "192.168.1.5", port: 9100)
socket.send(("raw data + "\n").dataUsingEncoding(NSUTF8StringEncoding)!)

Mais si tu en est à passer par le réseau, autant investir dans une imprimante à étiquettes…

1 « J'aime »

Je pense que Apple s’est voulu le plus simpliste possible quand à l’utilisation d’Air Print et dans l’absolu ca fonctionne plutôt bien et est assez simple. L’apareil récupère le format du papier qui est chargé dans l’imprimante puis l’imprime dessus et cela gère les imprimante multi chargeur et Air print offre la possibilité de choisir le papier le plus adapté face a la taille que tu souhaite dans l’absolu c’est plutôt simple et efficace mais pas puissant comme sur un mac ou tu pourra rentrer des tailles de papiers personnalisés. Tous ca pour dire que si ce que tu souhaite c’est forcé une imprimante à imprimer sur une enveloppe c10 alors que pour l’imprimante le papier chargé est du A4 ce sera tout bonnement impossible dans mon imprimante hp en tous cas cela l’est. Dailleur ca ce vérifie dans l’app photo si je compte imprimé une photo je n’est pas le choix de la taille du papier il me dit que j’ai du a4 si mon imprimante le crois…

1 « J'aime »

Euh…

Alors pour les photos il essaye de trouver du A6, s’il y en a : UIPrintInfoOutputType

Pour le reste, il essaye A4 ou sinon A4, voire A4.

Et là on peut citer Henri Ford :

Si j’avais demandé à mes clients ce qu’ils voulaient, ils m’auraient répondu : “Des chevaux plus rapides”

1 « J'aime »