Sziasztok!
En most keszitek egy pizzazo szamara egy egyszeru rendeles felvevo(es szamlazo) programot es hat akadt par gondom
Technikai adatok:
os: windows xp
server: tomcat
cliens code: gwt
server code: gwt(request factory)+hibernate
pos terminal: regi win xp driver, (elofordulhat hogy lesz egy uj aminek java-s elerese is van )
A problemam:
szeretnek pos terminal(blokk nyomtato)-t hasznalni de cliens oldalon az a gond vele hogy el tudom inditani a nyomtatast a bongeszovel de utanan ra kell megegyszer nyomni a nyomtatasra + bongeszonel nem tudom a lapmeretet rendesen beallitani es egy csomo ures papirt kinyom mielott elvagja a blokkot
en valami olyasmire gondoltam hogy inkabb server oldalon inteznem el mivel localisan fut majd a tomcat(ugyan azon a gepen ahol majd hasznaljak a programot)... pl itext-vel csinalnek egy pdf-et es valahogy ugy nyomnam ki ... akar mondjuk lerakom a pdf-et valahova es valami programmal(Ghost postscript ha jol emlekszem...) vagy akar a driver-t elerni kozvetlen es ugy nyomtatni ? igazabol azt sem tudom hogy induljak el mivel server oldalon meg nem probaltam kinyulni az oprendszerbe es azt sem tudom melyik lenne celszerubb... szenvedni azzal hogy elerjem a drivert akar nativan vagy inkabb valami kulso eszkozt keresni es ugy ? .... (halkan jegyzem meg hogy lehet vesznek uj blokk nyomtato amihez viszont jar valami java-s program is ...)
masik lehetoseg lenne egy native bongeszo plugint irni pl chrome-hoz de sajnos a C nem megy
Elore is koszonok minden otletet es javaslatot!
ui: kerlek titeket hogyha valami nem ertheto akkor kerdezetek ra mert nagyon fontos lenne megoldanom ...
18 Comments
Viczián István
Üdv,
Miért nem jó, ha megjelenik a PDF a kliens oldalon egy Reader-ben, és azt nyomtatja ki?
Máshogy nem fogsz te nyomtatni, képzeld el, hogy elmész egy weblapra, és az minden nélkül elkezdene nyomtatni neked.
És mi van, ha több nyomtató van a géphez csatlakozva?
Szóval szerintem tanulják meg az Acrobat Reader felhasználását.
Ugye itt kérdés, hogy biztos, hogy a vékony kliens a jó megoldás? Vastag klienssel nem lenne gondod.
Legvégső esetben aláírt applettel próbálkozhatsz.
Harangozo Gabor
Szia!
Miért nem jó, ha megjelenik a PDF a kliens oldalon egy Reader-ben, és azt nyomtatja ki? ----- azert nem jo mert akkor ranyom 1-xer hogy nyomtatas az en programomban utanna valahogy eloall a pdf mondjuk egy iframeben(nem kell feltetlen lathatonak lenni) na most meg el tudom inditani a nyomtatast de akkor is felugrik a bongeszo nyomtatas panelja ... ez igy nagyon nem felhasznalobarat
Máshogy nem fogsz te nyomtatni, képzeld el, hogy elmész egy weblapra, és az minden nélkül elkezdene nyomtatni neked. — a bongeszo nem enged ki a sajat sandbox-bol, lehetne irni native chrome plugin-t (C -ben : ((()
És mi van, ha több nyomtató van a géphez csatlakozva? ---- ezert kene valami olyan megoldas ahol ez is lekezelheto
Vekony vagy vastag kliens-en mit ertesz ?
az applet jo otlet azon mar gondolkoztam mert ugye azt ha betoltom a bongeszoben akkor 1xer fog csak engedelyt kerni(ha be van x....), js-bol meg lehet par parancsot hivni amit az applet tud kezelni... ezek utan mar csak az a kerdes hogy el lehete vele erni a nyomtatokat es mennyire macceras ... (kerlek ha ilyenben tudsz segiteni akkor pelda koldokat, linkeket mivel appletet meg soha nem irtam... eddig gwt es hozza server kodot irtam javaban (+server oldali javas eszkozok...) viszont gyorsan tanulok )
koszonom
Auth Gábor
Van lehetőség Java-ból nyomtatni, annó csináltam ilyet, amikor egy iskolában részben én csináltam az órarendet, most már viszonylag korrekt a Printing API, jó irány lehet, ha a szerver nyomtat... alternatív megoldás lehetne egy CUPS-ot felhúzni (nem tudom van-e Windows-os kiadása vagy valami hasonló alkalmazás van-e), mert akkor tudsz bármilyen nyomtatót használni IPP protokollon, így akár egy központi szerverről is képes lehetsz nyomtatni a kliens gépekre, pontosabban azok IPP portjára.
Harangozo Gabor
az biztos hogy jo ideig a tomcat es ahonnan majd hasznaljak a programot ugyan azon gep lesz ... lehet csinalok egy virtualis ubuntut a tomcat-nek ...(ezeket meg nem tudom, de a tavoli jovo az lenne ha kulso server lenne) ami tuti hogy a java max verzio jelenleg 1.6 a gwt miatt,
koszonom elore is ...
Auth Gábor
Tomcat-ből tudsz nyomtatni, nem kell applet... erre a nyomtatóra egyébként tudsz egy átlagos programból nyomtatni?
Harangozo Gabor
Igen tudok atlagos programbol nyomtatni csak akkor nem lehet a papirmeretet jol beallitani es a4 hosszusagnal vagja el pdf-vel be lehet allitani elvileg jo a meretet... de holnap kiprobalom hogy az xp-s driver is jol tudja-e mert nagyon nehezen lehetet hozza xp-s drivert talalni ... (a gyarto mar nagyon regota megszunt)
ha a server nyomtat akkor viszont mindig localban kell hogy legyen a server bar ez a legkevesebb inkabb nyomtasson az jobban erdekel
Auth Gábor
Papírméretet tudsz állítani a Java Printing API-n keresztül, tehát elvileg mennie kellene a nyomtatásnak... ez egyébként valami speciális hőnyomtató? Nem lenne olcsóbb egy strapabíró lézernyomtató?
Harangozo Gabor
a ponsot tipusra nem emlekszem de valami epson tm-XXX,holnap delutan mar meg tudom mondani de egy regi pos printer, meg rendes tinta szalagos ,lpt1 porton
Harangozo Gabor
sima nyomtato nem jo... mindenfelekeppen blokknyomtato kell es viszont ma beszelek a fonokkel hogy akar-e ujjat venni ... es akkor mar biztos nem 10eves driver lesz hozza
a jelenlegi tipusa:
epson tm-u210pa
Harangozo Gabor
Szia!
Szeretnek akkor toled segitseget kerni hogyan is induljak el ezen a nyomtatas teman...
nekem a tomcat-bol valo nyomtatas megfelel(tomcat ugyan azon windows-on fut majd ahol hasznaljak a projectet) es a nyomtato driver is arra van telepitve...
de azt sem tudom hogy induljak el ...
Auth Gábor
Itt egy rövid példa: http://docs.oracle.com/javase/tutorial/2d/printing/printable.html
Harangozo Gabor
Nagyon koszonom ... pont eleg volt a kezdesnek ... most fogom tesztelni...
Harangozo Gabor
Szia!
a nyomtatas megy viszont akadt par problemam
Ha kell akkor a drivert is meg tudom mutatni hozza de a tipus epson tm-u210A (Patrial cut)
ezzel a koddal nyomtatok(java6 os kod es tomcatbol nyomtatok):
StringBuilder sb = new StringBuilder();
// sb.append("1234567890123456789012345678901234567890");
sb.append("NYUGTA" + "\n");
sb.append("Készült 2. példányban, 2.pld." + "\n");
sb.append("\n");
sb.append("Sorszám: 202807" + "\n");
sb.append("Kelt: 2012.11.22 12:01" + "\n");
sb.append("Eladó:" + "\n");
sb.toString().getBytes(Charset.forName("UTF-8"));
DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
PrintService[] printServices = PrintServiceLookup.lookupPrintServices(flavor, null);
String name = "EPSON TM-U210A Partial cut 2000";
PrintService service = null;
for (PrintService s : printServices) {
if (s.getName().equals(name)) {
service = s;
// System.out.println(s.getSupportedDocFlavors());
}
}
DocPrintJob job = service.createPrintJob();
DocAttributeSet daset = new HashDocAttributeSet();
daset.add(new PrinterResolution(20, 20, ResolutionSyntax.DPI));
daset.add(new MediaPrintableArea(0, 0, 40, 100, MediaPrintableArea.MM));
Doc doc = new SimpleDoc( data, flavor, daset);
PrintJobWatcher pjDone = new PrintJobWatcher(job);
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(new PrinterResolution(20, 20, ResolutionSyntax.DPI));
aset.add(new MediaPrintableArea(0, 0, 40, 100, MediaPrintableArea.MM));
job.print(doc, aset);
pjDone.waitForDone();
--------------------------
s.getSupportedDocFlavors() => ez csak application/octet-stream tipusokat adja vissza...
Elore is koszonok minden fajta helpet, otletet tippet
Harangozo Gabor
Semmit tipp ?
Auth Gábor
Nekem sajnos nincs...
Harangozo Gabor
Akkor marad a mar mukodo modszer koppintasa.... pdf generalas(Itext-vel html templatebol) vagy JasperReport + egy ghostscript nevu cucc ... amit van commandline-on hivok meg vagy van valami javas integracioja is ....
Anonymous
Szia,
ez uni-mini-manual.pdf esetleg segíthet, az ékezetes problémát tippre az okozza, hogy a nyomtató - és a program más kódkészleten beszélget, e doksi alapján ASCII-re kellene konvertálnod, és megnézni, hogy milyen, a nyomtató által ismert alap ASCII kódokon találhatók a magyar ékezetes karakterek (már amit ismer), és azokat arra konvertálni.
Harangozo Gabor
kosoznom! ahogy nekem sikerult utanna jarnom asszerint a javax meg azert nem kezel mindent feltetlen + ez egy regi darab ... a megoldas az lett hogy generalok egy pdf-et amit utanna egy gsprint -nevu programmal (command linenon hivva) kinyomtatok es minden jo
viszont ha mar itt vagyunk akkor megosztom a kodot es a vegen lennne kerdesem is ...
public class PDFHelper {
@Deprecated
static class StreamGobbler extends Thread {
InputStream is;
String type;
StreamGobbler(InputStream is, String type) {
this.is = is;
this.type = type;
}
@Override
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(type + ">" + line);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
public static void htmlToPDF(String html) {
htmlToPDF(html, true);
}
public static void htmlToPDF(String html, boolean sendPrinter) {
String prefix = SessionHelper.getSession().getServletContext().getRealPath("/");
ITextRenderer iTextRenderer = new ITextRenderer();
try {
iTextRenderer.getFontResolver().addFont(prefix + "pdftemplates/fonts/arial.ttf", BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
iTextRenderer.getFontResolver().addFont(prefix + "pdftemplates/fonts/ariali.ttf", BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
iTextRenderer.getFontResolver().addFont(prefix + "pdftemplates/fonts/arialbi.ttf", BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
iTextRenderer.getFontResolver().addFont(prefix + "pdftemplates/fonts/arialbd.ttf", BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
iTextRenderer.getFontResolver().addFont(prefix + "pdftemplates/fonts/ariblk.ttf", BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
iTextRenderer.getFontResolver().addFont(prefix + "pdftemplates/fonts/ARIALN.ttf", BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
iTextRenderer.getFontResolver().addFont(prefix + "pdftemplates/fonts/ARIALNB.ttf", BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
iTextRenderer.getFontResolver().addFont(prefix + "pdftemplates/fonts/ARIALNBI.ttf", BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
iTextRenderer.getFontResolver().addFont(prefix + "pdftemplates/fonts/ARIALNI.ttf", BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
iTextRenderer.setDocumentFromString(html);
iTextRenderer.layout();
File tmpDir = (File) SessionHelper.getSession().getServletContext()
.getAttribute("javax.servlet.context.tempdir");
File file = new File(tmpDir, "output.pdf");
FileOutputStream fileOutputStream = new FileOutputStream(file);
iTextRenderer.createPDF(fileOutputStream);
fileOutputStream.close();
System.out.println("PATHHHH " + file.getAbsolutePath());
if (sendPrinter) {
String[] cmd = new String[3];
cmd[0] = "c:\\Program Files\\Ghostgum\\gsview\\gsprint";
cmd[1] = file.getAbsolutePath();
cmd[2] = " ";
Runtime runtime = Runtime.getRuntime();
Process exec = runtime.exec(cmd);
// any error message?
StreamGobbler errorGobbler = new StreamGobbler(exec.getErrorStream(), "ERROR");
// any output?
StreamGobbler outputGobbler = new StreamGobbler(exec.getInputStream(), "OUTPUT");
// kick them off
errorGobbler.start();
outputGobbler.start();
System.out.println(exec.waitFor());
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void createPDFFromHtml(HashMap<String, Object> placeHolderMap, String[] fileNames) {
HashMap<String, String> loadedFilesList = new HashMap<String, String>();
StringBuilder sb = new StringBuilder();
String html = "";
for (String s : fileNames) {
html = "";
if (loadedFilesList.containsKey(s)) {
html = loadedFilesList.get(s);
} else {
try {
html = readFile(s);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
loadedFilesList.put(s, html);
}
sb.append(html);
}
html = replacePlaceHolderBatch(placeHolderMap, sb.toString());
htmlToPDF(html);
}
public static String replacePlaceHolderBatch(HashMap<String, Object> map, String text) {
for (String holder : map.keySet()) {
text = text.replaceAll("%%" + holder + "%%", String.valueOf(map.get(holder)));
}
return text;
}
public static String replacePlaceHolder(String placeholderKey, String placeholderValue, String text) {
return text.replaceAll("%%" + placeholderKey + "%%", placeholderValue);
}
public static String readFile(String path) throws IOException {
String prefix = SessionHelper.getSession().getServletContext().getRealPath("/");
FileInputStream stream = new FileInputStream(new File(prefix + path));
try {
FileChannel fc = stream.getChannel();
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
/* Instead of using default, pass in a decoder. */
return Charset.defaultCharset().decode(bb).toString();
} finally {
stream.close();
}
}
}
azt szeretnem kerdezni hogy tudom megoldani hogy ez egy service-kent mukodjon... ez alatt azt ertem hogy 2 hivas kozott eltarolna ezt az objektumot a java igy megoldhatnam hogy a template-ket ne kelljen ujra beolvas (felesleges mivel nem valtoznak) + hogy tudnam megoldani hogy amikor a cmd parancsot hivok(ez a tenyleges nyomtatas) akkor az mar egy kulon szallon fusson ? mivel jelenleg amig le nem futtnak a cmd-k addig ugye nem ter vissza es a cliens addig all es valamiert 2-3 sec amig vegez a cmd parancs vegrehajtassal
valaki otlet vagy tipp ?