Question imprimer des images

Plus d'informations
il y a 4 ans 4 mois #29420 par Gabriel
imprimer des images a été créé par Gabriel
Bonjour à tous,
Dans le but d'imprimer directement des résultats de scan, je souhaite lire des fichiers jpeg dans un dossier et les envoyer directement à l'imprimante.
J'ai trouvé un vieux post dans ce forum mais l'auteur ne semble pas avoir pu faire fonctionner le script et il n'a eu aucune réponse.
J'ai aussi trouvé le script ci-dessous sur internet
[code:1]function print-image {
param([string]$imageName = $(throw \"Enter image name to print\"«»),
[string]$printer = \"\",
[bool]$fitImageToPaper = $true)

trap { break; }

# check out Lee Holmes' blog(www.leeholmes.com/blog/HowDoIEasilyLoadA...sBeenDeprecated.aspx)
# on how to avoid using deprecated \"LoadWithPartialName\" function
# To load assembly containing System.Drawing.Printing.PrintDocument
[void][System.Reflection.Assembly]::LoadWithPartialName(\"System.Drawing\"«»)

# Bitmap image to use to print image
$bitmap = $null

$doc = new-object System.Drawing.Printing.PrintDocument
# if printer name not given, use default printer
if ($printer -ne \"\"«») {
$doc.PrinterSettings.PrinterName = $printer
}

$doc.DocumentName = [System.IO.Path]::GetFileName($imageName)

$doc.add_BeginPrint({
Write-Host \"==================== $($doc.DocumentName) ====================\"
})

# clean up after printing...
$doc.add_EndPrint({
if ($bitmap -ne $null) {
$bitmap.Dispose()
$bitmap = $null
}
Write-Host \"xxxxxxxxxxxxxxxxxxxx $($doc.DocumentName) xxxxxxxxxxxxxxxxxxxx\"
})

# Adjust image size to fit into paper and print image
$doc.add_PrintPage({
Write-Host \"Printing $imageName...\"

$g = $_.Graphics
$pageBounds = $_.MarginBounds
$img = new-object Drawing.Bitmap($imageName)

$adjustedImageSize = $img.Size
$ratio = [double] 1;

# Adjust image size to fit on the paper
if ($fitImageToPaper) {
$fitWidth = [bool] ($img.Size.Width > $img.Size.Height)
if (($img.Size.Width -le $_.MarginBounds.Width) -and
($img.Size.Height -le $_.MarginBounds.Height)) {
$adjustedImageSize = new-object System.Drawing.SizeF($img.Size.Width, $img.Size.Height)
} else {
if ($fitWidth) {
$ratio = [double] ($_.MarginBounds.Width / $img.Size.Width);
} else {
$ratio = [double] ($_.MarginBounds.Height / $img.Size.Height)
}

$adjustedImageSize = new-object System.Drawing.SizeF($_.MarginBounds.Width, [float]($img.Size.Height * $ratio))
}
}

# calculate destination and source sizes
$recDest = new-object Drawing.RectangleF($pageBounds.Location, $adjustedImageSize)
$recSrc = new-object Drawing.RectangleF(0, 0, $img.Width, $img.Height)

# Print to the paper
$_.Graphics.DrawImage($img, $recDest, $recSrc, [Drawing.GraphicsUnit]\"Pixel\"«»)

$_.HasMorePages = $false; # nothing else to print
})

$doc.Print()
}[/code:1]
Je l'ai adapté à mon besoin et ça donne le script suivant
[code:1]function print-image {
param([string] $imagePath=\"\",
[string]$printer = \"\",
[bool]$fitImageToPaper = $true)

trap { break; }


# Bitmap image to use to print image
$bitmap = $null

$doc = new-object System.Drawing.Printing.PrintDocument
# if printer name not given, use default printer
if ($printer -ne \"\"«»)
{
$doc.PrinterSettings.PrinterName = $printer
}

# Adjust image size to fit into paper and print image
$doc.add_PrintPage(
{
Write-Host \"Printing Image...\"

$g = $_.Graphics
$pageBounds = $_.MarginBounds
$img = new-object Drawing.Bitmap($imagePath)
$adjustedImageSize = $img.Size
$ratio = [double] 1;
# Adjust image size to fit on the paper
if ($fitImageToPaper)
{
$fitWidth = [bool] ($img.Size.Width > $img.Size.Height)
if (($img.Size.Width -le $_.MarginBounds.Width) -and ($img.Size.Height -le $_.MarginBounds.Height))
{
$adjustedImageSize = new-object System.Drawing.SizeF($img.Size.Width, $img.Size.Height)
}
else
{
if ($fitWidth)
{
$ratio = [double] ($_.MarginBounds.Width / $img.Size.Width);
}
else
{
$ratio = [double] ($_.MarginBounds.Height / $img.Size.Height)
}

$adjustedImageSize = new-object System.Drawing.SizeF($_.MarginBounds.Width, [float]($img.Size.Height * $ratio))
}
}
# calculate destination and source sizes
$recDest = new-object Drawing.RectangleF($pageBounds.Location, $adjustedImageSize)
$recSrc = new-object Drawing.RectangleF(0, 0, $img.Width, $img.Height)

# Print to the paper
$_.Graphics.DrawImage($img, $recDest, $recSrc, [Drawing.GraphicsUnit]\"Pixel\"«»)

$_.HasMorePages = $false; # nothing else to print
}
)

$doc.Print()
}

############
$Path=\"D:\gabriel\Mes_Documents\Scan\Scan_Photocop\Images\"
$Doss = Get-ChildItem -Path $Path -File
$NumFich=$Doss.count
Write-host \"Nb fich=\" $NumFich
If ($NumFich -gt 1) {write-host \"plusieurs fichiers\"}
$printer=\"Brother\"
If ($NumFich -eq 1){
Foreach ($Fich in $Doss){$Imagepath=$path + $Fich.name}
print-image ($imagePath,$printer,$true)
}[/code:1]
Malheureusement j'obtiens une erreur que je nais pas résoudre. L'erreur semble se produire à l'instruction $img = new-object Drawing.Bitmap($imagePath) (j'ai mis des repères pour trouver jusqu'où le script s'exécutait).
[code:1]Exception lors de l'appel de «Print» avec «0» argument(s): «Exception lors de l'appel de «.ctor» avec «1»
argument(s): «Le paramètre n'est pas valide.»»
Au caractère D:\gabriel\Mes_Documents\Scan\Scan_Photocop\Photocop1.ps1:63 : 1
+ $doc.Print()
+ ~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:«») [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : CmdletInvocationException[/code:1]

La question est d'obtenir un script qui marche, soit en élucidant pourquoi le script ci-dessus ne marche pas, soit en ayant connaissance d'un autre script qu'un de vous connaîtrait.

D'avance merci

:) Gabriel<br><br>Message édité par: gabier, à: 13/11/19 13:51

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 ans 4 mois #29428 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:imprimer des images
Salut,
esaie
[code:1]$img = new-object Drawing.Bitmap -argumentlist $imagePath[/code:1]

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 ans 4 mois #29433 par Gabriel
Réponse de Gabriel sur le sujet Re:imprimer des images
Laurent Dardenne écrit:

Salut,
esaie
[code:1]$img = new-object Drawing.Bitmap -argumentlist $imagePath[/code:1]

Bonjour Laurent,
J'ai essayé cette syntaxe mais le résultat est exactement le même (même message d'erreur exactement). Ce qui m'étonne c'est que le code semble ne pas aller plus loin que cette instruction \&quot;Drawing.bitmap\&quot; tandis que le message d'erreur semble accuser $doc.Print, c'est-à-dire la méthode .print de l'objet System.Drawing.Printing.PrintDocument, qui n'est invoqué qu'à la fin (c'est la dernière instruction de la fonction). Voir code ci-dessous avec des instructions omises
[code:1]function print-image {
param([string] $imagePath=\&quot;\&quot;,[string]$printer = \&quot;\&quot;,[bool]$fitImageToPaper = $true)

# Bitmap image to use to print image
$bitmap = $null
$doc = new-object System.Drawing.Printing.PrintDocument
# if printer name not given, use default printer
...............
# Adjust image size to fit into paper and print image
$doc.add_PrintPage(
{
Write-Host \&quot;Printing Image...\&quot;

$g = $_.Graphics
$pageBounds = $_.MarginBounds
write-host \&quot;flag1\&quot;
$img = new-object Drawing.Bitmap -argumentlist $imagePath
write-host \&quot;flag2\&quot;
$adjustedImageSize = $img.Size
$ratio = [double] 1;
# Adjust image size to fit on the paper
if ($fitImageToPaper){
.......}
# calculate destination and source sizes
.......
# Print to the paper
..............
}
)
$doc.Print()
}[/code:1]
Résultat
[code:1]PS C:\WINDOWS\system32&gt; D:\gabriel\Mes_Documents\Scan\Scan_Photocop\Photocop1.ps1
Nb fich= 1
Printing Image...
flag1
Exception lors de l'appel de «Print» avec «0» argument(s): «Exception lors de l'appel de «.ctor» avec «1»
argument(s): «Le paramètre n'est pas valide.»»
Au caractère D:\gabriel\Mes_Documents\Scan\Scan_Photocop\Photocop1.ps1:64 : 1
+ $doc.Print()
+ ~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:«») [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : CmdletInvocationException[/code:1]
:) gabier

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 ans 4 mois #29434 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:imprimer des images
Quelle version de Powershell utilises-tu?

Il faut avoir le détail, utilise un try catch et enregistre l'exception sur disque avec Export-Clixml ou en texte avec Resolve-Error.
Essaie en utilisant la portée script sur la variable $Imagepath voir code en dur le chemin pour tester.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 ans 4 mois #29439 par Gabriel
Réponse de Gabriel sur le sujet Re:imprimer des images
Bonjour laurent,
merci de m'avoir incité à utiliser moi-même des outils de débogage. je ne l'avais jamais fait et je me suis aperçu que c'est tout un monde.
Ceci dit il faudrait que je potasse le livre un peu plus longtemps pour utiliser vraiment ces outils.
Ceci dit, pour tenter tout de même de répondre à tes questions
1. version Powershell : 5.1.18362.145
2. J'ai essayé de faire un try/catch et envoyer l'erreur sur disque comme tu le dis :
- try/catch portent sur l'ensemble de l'exécution de la fonction. J'ai envoyé $Error[0] à Export-Clixml faute de savoir s'il y a un autre enregistrement de l'erreur plus approprié.
[code:1]Try{
print-image ($imagePath,$printer,$true)
}
Catch{
$Error[0]|Export-Clixml -path \&quot;Error1.xml\&quot;
}[/code:1]
Ca me donne 11 pages de texte que je suis incapable d'interpréter et que je n'ose pas soumettre ici.
- peut-être on peut réduire l'enregistrement c'est sans doute ce que tu me dis \&quot;en utilisant la portée script sur la variable $Imagepath\&quot; mais je n'ai pas compris ce que ça veut dire, vu que l'erreur arrive non dans la définition de $ImagePath mais dans son utilisation, et en plus elle est utlisée dans les paramètres d'une méthode add_PrintPage de System.Drawing.Printing.PrintDocument.
J'ai aussi cru un moment qu'il s'agisait d'un problème de répertoire et que la défintion en dur du chemin complet de l'image ne lui plaisait pas. Mais apparemment ce n'est pas ça.
Dur dur ...
:) gabier
P.S. Il n'y a sans doute pas que ça, mais il y a bel et bien un problème de répertoire, parce que j'ai fait des expériences de scripts utilisant System.Drawing.Printing.PrintDocument je n'ai pas encore réussi à imprimer mais j'ai constaté que
si l'image est dans mon répertoire de travail (celui qui est dans le $Profile d:/gabriel/Mes_Documents/Powershell) il ne la trouve pas, mais si je la mets dans c:\Windows\System32 là il la trouve !!!:sick:

Message édité par: gabier, à: 15/11/19 12:03<br><br>Message édité par: gabier, à: 15/11/19 12:04

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 ans 4 mois #29440 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:imprimer des images
gabier écrit:

merci de m'avoir incité à utiliser moi-même des outils de débogage. je ne l'avais jamais fait et je me suis aperçu que c'est tout un monde.

C'est le même monde en plus détaillé. Cela demande un peu plus de connaissance en plomberie ;-)
Il y a des cas où on ne peut pas faire autrement, par lors d'une exécution d'un script dans une tâche planifié ou en remote.
gabier écrit:

et que je n'ose pas soumettre ici.

Ok.
gabier écrit:

Ca me donne 11 pages de texte que je suis incapable d'interpréter.

Il faut maintenant faire l'inverse, à partir du fichier contenant l'erreur sérialisée l'importer avec $E=Import-Clixml filename
Resolve-Error affiche à peu près les même infos mais en texte ce qui facilite la relecture.
Il faut retrouver le message de chaque exception, une exception pouvant en imbriquer une autre (cf. InnerException) ce qui donne l'enchainement/pile d'appel.
gabier écrit:

utilisant la portée script sur la variable $Imagepath\&quot; mais je n'ai pas compris ce que ça veut dire, vu que l'erreur arrive non dans la définition de $ImagePath mais dans son utilisation

Le code que tu déclares dans ton EventHandler est appelé dans un scope (une portée différente) essaie avec $script:ImagePath où 'script:' est le nom de portée.
Ainsi tu précises d'utiliser la variable dans la portée de l'appelant et pas dans la portée courante.
Définie également pour la cohérence/relecture $script:ImagePath dans le script principal.

gabier écrit:

P.S. Il n'y a sans doute pas que ça, mais il y a bel et bien un problème de répertoire, parce que j'ai fait des expériences de scripts utilisant System.Drawing.Printing.PrintDocument je n'ai pas encore réussi à imprimer mais j'ai constaté que
si l'image est dans mon répertoire de travail (celui qui est dans le $Profile d:/gabriel/Mes_Documents/Powershell) il ne la trouve pas, mais si je la mets dans c:\Windows\System32 là il la trouve

Peut être voir ceci .

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.085 secondes
Propulsé par Kunena