Печать Tif Из Ls

Bob84

Well-Known Member
16.05.2012
48
0
#1
Здравствуйте.
Посредством LS отравляю на печать tif файл. Код:

Код:
Set oTiff = CreateObject("MODI.Document")	
Call oTiff.Create(path)
Call oTiff.PrintOut( 0, -1, 1, PrinterName, "", False, 1 )
Если в PrinterName лежит что-то вроде "Xerox WorkCentre 3210 PCL 6" документ уходит на печать.
Если же вот такое "\\SomeUSER-PC\Xerox WorkCentre 3210 PCL 6" (т.е. разшареный сетевой принтер), то задачу о печати просто добаляет в очередь и она остается висеть там, пока руками не удалю.
Может в этой процедуре нужно в каком-то другом виде имя принтера передавать, в втором случае?
Пробовал через Выполнить в Windows выполнить комманду
rundll32.exe C:\WINDOWS\System32\shimgvw.dll,ImageView_PrintTo /pt filePath "\\SomeUSER-PC\Xerox WorkCentre 3210 PCL 6" - результат такой же, как и при программной реализации.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 486
365
#2
большинство современных принтеров печатают PS (если принтер не виндозный, т.е. - софтварный)
нек. принтеры печатают сразу PDF
т.о. задача плавно превращается в конвертацию в PS, а делее - просто копированием бинаря в принтер...
остается задача - как заставить винду копировать бинарь в принтер :)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 486
365
#4
вот это по описанию - может печатать на дефолтный принтер и конвертить тиф в разное (PS там есть), условий использования я не знаю
 

Bob84

Well-Known Member
16.05.2012
48
0
#5
Спасибо, буду изучать. Надеялся правда на более простой вариант :) .
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 486
365
#6
разгадывать - что не работает в КОМ - ни у кого не возникает желания - онож проприетарь и виндовз-онли :)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 486
365
#7
проверил с командной строки, в линухах - и печатает и конвертит в PS
НО - надо править скрипты:
find ./ -name "*.sh" -exec dos2unix {} \;
find ./ -name "*.sh" -exec chmod a+x {} \;

а в винде надо править батник<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">tiff_print_classpath.bat:</div></div><div class="sp-body"><div class="sp-content">
Код:
@echo off
if ""%JAVA_HOME%"" == """" goto SET_JAVA_HOME
goto start

:SET_JAVA_HOME
echo Set JAVA_HOME to point to a JVM installation, e.g. set JAVA_HOME=c:\j2sdk1.4.2
goto end

:end
exit 0

:start
set CLASSPATH=".;..\..\;..\..\jai_codec.jar;..\..\jai_core.jar;..\..\jai_imageio.jar;..\..\smartjcommon.jar;..\..\smartjpdfwriter_license.jar;..\..\smartjpdfwriter.jar;..\..\smartjtiff_license.jar;..\..\smartjtiff.jar;..\..\smartjtiff_demo.jar"
set JAVA_OPTS=-Xms20m -Xmx400m -Djava.awt.headless=true -DSMARTJ_DEBUG=false
echo Starting the demo using JAVA_HOME=%JAVA_HOME%
%JAVA_HOME%\bin\java -version
строка %JAVA_HOME%\bin\java -version
там слэши непральные
проверял с изменением PATH:%PATH%;"C:\Program Files\IBM\Notes\jvm\bin" (это необязательно)
и JAVA_HOME:"C:\Program Files\IBM\Notes\jvm"
т.е. брал нотуснёвую жвм

виндистый запуск:
cd \mydata\inst\development\java\Graphics\SmartJTiff_1.1_03_free\bin\print
start SilentPrintTIFF.bat [..\..\sample_tif\sample1.tif]

линуховый:
cd ~/mydata/inst/development/java/Graphics/SmartJTiff_1.1_03_free/bin/print
./SilentPrintTIFF.sh [../../sample_tif/sample1.tif]

конвертор проверял так: ./Tiff2PsDemo.sh [../../sample_tif/sample1.tif] ./ sample1.ps
lp sample1.ps

принтер Куоцера FS 4020 DN
он же расшарен виндятке (по сети, IPP), кот. - Хрю в виртуалке

т.о. - сморим скрипты и юзаем готовые классы, для генерации PS или прямой печати на дефолт - усё буить пахать (КМК)

возможны заморочки с типами тифов - но здесь надо смореть по мере возникновения траблов
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 486
365
#8
использование либ в домине...
либы:
jai_codec.jar
jai_core.jar
smartjcommon.jar
smartjpdfwriter.jar
smartjpdfwriter_license.jar
amartjtiff.jar
smartjtiff_demo.jar
smartjtiff_license.jar

кладем в lib/ext (либо прописываем путь и notes.ini), пихать в nsf, на первый момент, ябы постремался
код (пральней сказать - список импорта:) ) из:
Tiff2PsDemo.java
SilentPrintTIFF.java
пихаем в либу
пишем рапер для LS2J либо зовем его прям из LS (как это происходит и с КОМ), учитывая что конструкторы без аргументов - это ваще пестня
получаем файло, либо печать
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 486
365
#9
как и предполагал - из БД либы работать не будут... (исследовать не стал)
т.е. рекомендация - класть в lib/ext
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код агента</div></div><div class="sp-body"><div class="sp-content">
Код:
Option Public
Option Declare
Use "convert"
Use "ErrorHandling"
Public jSession As JavaSession
Sub Initialize
On Error GoTo ErrH
Set jSession= New JAVASESSION
Dim DocConverter As JAVACLASS, converter As JAVAOBJECT
Set DocConverter = jSession.GetClass("com.activetree.tiff.server.SilentTiffConverter")
Set converter=DocConverter.Createobject()
Call converter.setAttribute(DocConverter.DOC_TYPE, DocConverter.PS)
Call converter.setAttribute(DocConverter.DOC_LIST, {[/sample_tif/sample1.tif]})
Call converter.setAttribute(DocConverter.OUTPUT_DIRECTORY, {/})
Call converter.setAttribute(DocConverter.OUTPUT_STREAM, {sample1.ps})
Call converter.setAttribute(DocConverter.DOC_LISTENER, "demo.activetree.tiff.TiffDocListener")
'	Call converter.setAttribute(DocConverter.URL_AUTH_ID, {})
'	Call converter.setAttribute(DocConverter.URL_AUTH_PASSWORD, {})

Dim startProc As JavaMethod
'	Dim myCollection
'	Set myCollection = DocConverter.getClassMethods()
'	ForAll m In myCollection
'		Print m.MethodName, m.Signature
'	End ForAll
Set startProc=DocConverter.Getmethod({start}, {()V})
Call startProc.invoke(converter)
'	Call converter.start()
Quit:
Exit Sub
ErrH:
RaiseError_mod
Resume Quit
End Sub

Function RaiseError_mod() As String
Dim jError As JavaError
Dim modInfo As String	
modInfo = GetThreadInfo(LSI_THREAD_MODULE) & "::" & GetThreadInfo(LSI_THREAD_CALLPROC) & ": "
Set jError = jSession.getLastJavaError()
Dim es As String
If (jError.errorMsg = "") Then
es=modInfo
If (Err = 0) Then
es = es + "Manually raised an error"
Else
es = es + "Run time error: (" + Trim(Str(Err)) + ") " + Error$ + " at line: "+ Trim(Str(Erl))
End If
Else
es=modInfo+"Error at line " & Erl & ": " & jError.errorMsg
jSession.ClearJavaError
End If
Print es
RaiseError_mod=es
End Function
код java либы (convert)<!--shcode--><pre><code class='java'>import com.activetree.common.conversion.DocConverter;
import com.activetree.tiff.server.SilentTiffConverter;
public class Untitled {
}[/CODE]разумеется - имя класса не интересует (нужны тока импорты)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 486
365
#10
хочу добавить, что можно печатать и из jai
и принтера выбирать согласно javax.print.PrintService javax.print.PrintServiceLookup
но с тифами будут заморочки...
примеры реализации (я их по диагонали сморел)
Чтобы видеть этот контент необходимо: Войти или зарегистрироваться


хотелось бы отметить еще одну деталь...
как пр-ло, сетевые принтеры поддерживают LPD и IPP
т.о. можно ваще миновать ОС - http://code.google.com/p/jspi/source/brows...DocExample.java

http://sourceforge.net/projects/jlpr/
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 486
365
#12
поигрался с прямой печатью (просто RAW), через PJL...
выводит, но не подгоняет положение и размер картинки под лист, видать опций не хватает :)
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">java код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'>import java.io.*;
import java.net.*;

import org.apache.commons.io.IOUtils;
class TCPClient
{
/*************************************************************************/
// known special characters
/**
* escape.
*/
public static final char ESC = 0x1b;
/**
* end of transmission (EOF).
*/
public static final char EOT = 0x04;
/**
* carriage return.
*/
public static final String CR = "\r";
/**
* linefeed/newline.
*/
public static final String LF = "\n";
/**
* form feed.
*/
public static final String FF = "\f";
/**
* carriage return, line feed.
*/
public static final String CRLF = CR + LF;
/**
* PostScript begin string.
*/
public static final String PS = "%!PS";

/*************************************************************************/
// pjl strings
/**
* the pjl string.
*/
public static final String PJL = "@PJL";
private static final String UNESCAPED_UEL = "%-12345X";
/**
* the uel, gets the printer's attention to be able issue pjl commands.
*/
public static final String UEL = ESC + UNESCAPED_UEL;
/**
* a full uel and enter into pjl.
*/
public static final String ENTER_PJL = UEL + PJL + CRLF;
/**
* exit uel.
*/
public static final String UEL_EXIT = UEL + CRLF;


public static void main (String argv[]) throws Exception
{
// The line below illustrates the default port 6101 for mobile printers 9100 is the default port number
// for desktop and tabletop printers
Socket clientSocket=new Socket("KM7FA8DD",9100);

DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream() );
String strJob= "NAME = \"JOBNAME\" ";
FileInputStream fis=new FileInputStream ("sample1.ps");
outToServer.writeBytes(ENTER_PJL);
outToServer.writeBytes(PJL + " JOB " + strJob + CRLF);
outToServer.writeBytes(PJL + " ENTER LANGUAGE = POSTSCRIPT " + CRLF);
IOUtils.copy(fis, outToServer);
outToServer.writeBytes(ENTER_PJL);
outToServer.writeBytes(PJL + " EOJ "+ strJob + CRLF);
outToServer.writeBytes(UEL);
IOUtils.closeQuietly(fis);
IOUtils.closeQuietly(outToServer);
clientSocket.close();
}
}[/CODE]
константы брал
Чтобы видеть этот контент необходимо: Войти или зарегистрироваться

описание PJL
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 486
365
#13
расширил пример агента (там есть ряд "узких" моментов для LS2J)
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">теперь и принтует</div></div><div class="sp-body"><div class="sp-content">
Код:
%REM
Agent testTiff
Created Nov 5, 2013 by Mikhail Cholokov/CRUINTERNET
Description: Comments for Agent
%END REM
Option Public
Option Declare
Use "convert"
'Use "ErrorHandling"
%Include "lserr.lss"
'Uselsx "*lsxlc"
UseLSX "*javacon"
%Include "lsconst.lss"
Public jSession As JavaSession
Sub Initialize
PrintToDefault
End Sub


Function RaiseError_mod() As String
Dim jError As JavaError
Dim modInfo As String	
modInfo = GetThreadInfo(LSI_THREAD_MODULE) & "::" & GetThreadInfo(LSI_THREAD_CALLPROC) & ": "
Set jError = jSession.getLastJavaError()
Dim es As String
If (jError.errorMsg = "") Then
es=modInfo
If (Err = 0) Then
es = es + "Manually raised an error"
Else
es = es + "Run time error: (" + Trim(Str(Err)) + ") " + Error$ + " at line: "+ Trim(Str(Erl))
End If
Else
es=modInfo+"Error at line " & Erl & ": " & jError.errorMsg
jSession.ClearJavaError
End If
Print es
RaiseError_mod=es
End Function
%REM
Sub CreatePS
Description: Comments for Sub
%END REM
Sub CreatePS
On Error GoTo ErrH
Set jSession= New JAVASESSION
Dim DocConverter As JAVACLASS, converter As JAVAOBJECT
Set DocConverter = jSession.GetClass("com.activetree.tiff.server.SilentTiffConverter")
Set converter=DocConverter.Createobject()
Call converter.setAttribute(DocConverter.DOC_TYPE, DocConverter.PS)
Call converter.setAttribute(DocConverter.DOC_LIST, {[/sample_tif/sample1.tif]})
Call converter.setAttribute(DocConverter.OUTPUT_DIRECTORY, {/})
Call converter.setAttribute(DocConverter.OUTPUT_STREAM, {sample1.ps})
Call converter.setAttribute(DocConverter.DOC_LISTENER, "demo.activetree.tiff.TiffDocListener")
'	Call converter.setAttribute(DocConverter.URL_AUTH_ID, {})
'	Call converter.setAttribute(DocConverter.URL_AUTH_PASSWORD, {})

Dim startProc As JavaMethod
'	Dim myCollection
'	Set myCollection = DocConverter.getClassMethods()
'	ForAll m In myCollection
'		Print m.MethodName, m.Signature
'	End ForAll
Set startProc=DocConverter.Getmethod({start}, {()V})
Call startProc.invoke(converter)
'	Call converter.start()
Quit:
Exit Sub
ErrH:
RaiseError_mod
Resume Quit
End Sub

%REM
Sub PrintToDefault
Description: Comments for Sub
%END REM
Sub PrintToDefault
On Error GoTo ErrH
Set jSession= New JAVASESSION
Dim BooleanC As Javaclass, IntegerC As JavaClass, Int1 As JavaObject
Set BooleanC=jSession.GetClass("java.lang.Boolean") 
Set IntegerC=jSession.GetClass("java.lang.Integer") 
'	Set Int1=IntegerC.Createobject({(I)V},1)
Dim SilentPrintTiff As Javaclass, silentPrint As JAVAOBJECT
Set SilentPrintTiff=jSession.GetClass("com.activetree.tiff.server.SilentPrintTiff")
Set silentPrint = SilentPrintTiff.CreateObject()
'default media size
Dim paperSize As String:paperSize = "(0, 0, 0, 0, 612, 792)"
silentPrint.setAttribute SilentPrintTiff.PAPER, paperSize
'when using paper - make sure To Use automatch To False; True Is default And it will Use size of the actual page.
silentPrint.setAttribute SilentPrint.AUTO_MATCH_PAPER, BooleanC.FALSE
'printer To Print
Dim PrinService As Javaclass, defaultPrintService As Javaobject
Dim PrintServiceLookup As Javaclass
Set PrinService=jSession.GetClass("javax.print.PrintService")
Set PrintServiceLookup=jSession.GetClass("javax.print.PrintServiceLookup")
Set defaultPrintService = PrintServiceLookup.lookupDefaultPrintService()
If defaultPrintService Is Nothing Then
Print "No printers found."
Exit Sub
End if
Dim printerName As String
printerName = defaultPrintService.getName()
Call silentPrint.setAttribute(SilentPrint.PRINTER_NAME, printerName)
'auto rotate And center
silentPrint.setAttribute SilentPrint.AUTO_ROTATE_AND_CENTER, BooleanC.TRUE
'page scaling
silentPrint.setAttribute SilentPrint.PAGE_SCALING, SilentPrint.FIT_TO_PRINTABLE_AREA
'auto-match paper based On PDF page size.
silentPrint.setAttribute SilentPrint.AUTO_MATCH_PAPER, BooleanC.FALSE
'Print all docs As one Print job
'	silentPrint.setAttribute(SilentPrint.SINGLE_PRINT_JOB, Boolean.TRUE);
'collate
silentPrint.setAttribute SilentPrint.COLLATE_COPIES, BooleanC.TRUE
'copies defaut 1; can make it To N copies
silentPrint.setAttribute SilentPrint.COPIES, IntegerC.Createobject({(I)V},1)
'debug it
'silentPrint.setAttribute(SilentPrint.DEBUG, Boolean.TRUE);
'job Name
silentPrint.setAttribute SilentPrint.JOB_NAME, "SilentPrintTIFF"
'document
silentPrint.setAttribute SilentPrint.DOC_LIST, {[/sample_tif/sample1.tif]}
'Add a docListener
'must have a default constructor For this class.
silentPrint.setAttribute SilentPrint.DOC_LISTENER, "demo.activetree.tiff.TiffDocListener"
'doc password protected If Any
'	silentPrint.setAttribute(SilentPrint.PASSWORD, docPassword);
'url protection If Any
'	silentPrint.setAttribute(SilentPrint.URL_AUTH_ID, urlAuthId);
'	silentPrint.setAttribute(SilentPrint.URL_AUTH_PASSWORD, urlAuthPassword);
Dim startProc As Javamethod
Set startProc=silentPrintTiff.Getmethod({start}, {()V})
Call startProc.invoke(silentPrint)
'	Call converter.start()
Quit:
Exit Sub
ErrH:
RaiseError_mod
Resume Quit

End Sub