Programmering

Udskrivning i Java, del 1

Forrige 1 2 Side 2 Side 2 af 2

Gengivelsesmodeller

Der er to udskrivningsmodeller i Java: Printbar job og Sidelig job.

Printables

Printbar job er den enkleste af de to udskrivningsmodeller. Denne model bruger kun en PagePainter for hele dokumentet. Sider gengives i rækkefølge, begyndende med side nul. Når den sidste side udskrives, vil din PagePainter skal returnere NO_SUCH_PAGE værdi. Undersystemet Print vil altid bede om, at applikationen gengiver siderne i rækkefølge. For eksempel, hvis din applikation bliver bedt om at gengive siderne fem til syv, beder udskriftsundersystemet om alle sider op til den syvende side, men udskriver kun siderne fem, seks og syv. Hvis din applikation viser en udskrivningsdialogboks, vises det samlede antal sider, der skal udskrives, ikke, da det er umuligt at vide på forhånd antallet af sider i dokumentet ved hjælp af denne model.

Sider

Sidelig job giver mere fleksibilitet end Printbar job, som hver side i en Sidelig job kan have et andet layout. Sidelig job bruges oftest med Bestils, en samling sider, der kan have forskellige formater. Jeg vil forklare Bestil klasse på et øjeblik.

EN Sidelig job har følgende egenskaber:

  • Hver side kan have sin egen maler. For eksempel kan du få en maler implementeret til at udskrive forsiden, en anden maler til at udskrive indholdsfortegnelsen og en tredje til at udskrive hele dokumentet.
  • Du kan indstille et andet sideformat for hver side i bogen. I en Sidelig job, kan du blande sider i stående og liggende format.
  • Udskrivningssystemet beder muligvis din applikation om at udskrive sider uden for rækkefølge, og nogle sider springes muligvis over, hvis det er nødvendigt. Igen behøver du ikke bekymre dig om dette, så længe du kan levere en hvilken som helst side i dit dokument efter behov.
  • Det Sidelig job behøver ikke at vide, hvor mange sider der er i dokumentet.

Bøger

Også nyt, da version 1.2 er Bestil klasse. Denne klasse giver dig mulighed for at oprette dokumenter på flere sider. Hver side kan have sit eget format og sin egen maler, hvilket giver dig fleksibiliteten til at oprette sofistikerede dokumenter. Siden Bestil klasse implementerer Sidelig interface, kan du implementere din egen Bestil klasse, når den leveres Bestil klasse mangler de funktioner, du har brug for.

EN Bestil klasse repræsenterer en samling af sider. Ved første oprettelse blev Bestil objektet er tomt. For at tilføje sider skal du blot bruge en af ​​de to Tilføj() metoder (se min forklaring på denne klasse i API-sektionen for flere detaljer). Denne metodes parametre er Sideformat objekt, der definerer de fysiske egenskaber på siden, og a PagePainter objekt, der implementerer Printbar interface. Hvis du ikke kender antallet af sider i dit dokument, skal du blot sende UNKNOWN_NUMBER_OF_PAGES værdi til Tilføj() metode. Printersystemet finder automatisk antallet af sider ved at kalde alle sidemalerne i bogen, indtil den modtager en NO_SUCH_PAGE værdi.

API-definition

Teori og praksis mødes i dette afsnit. I de foregående sektioner lærte vi om sidestruktur, måleenheder og gengivelsesmodeller. I dette afsnit vil vi se på Java-udskrivnings-API.

Alle de klasser, der kræves for at udskrive, findes i java.awt.print pakke, der består af tre grænseflader og fire klasser. Følgende tabeller definerer klasser og grænseflader for udskrivningspakken.

NavnTypeBeskrivelse
PapirKlasseDenne klasse definerer sidens fysiske egenskaber.
SideformatKlasseSideformat definerer sidens størrelse og retning. Den definerer også hvilken Papir til brug ved gengivelse af en side.
PrinterJobKlasse

Denne klasse administrerer udskriftsjobbet. Dets ansvar omfatter oprettelse af et udskriftsjob, visning af en udskrivningsdialogboks, når det er nødvendigt, og udskrivning af dokumentet.

BestilKlasse

Bestil repræsenterer et dokument. EN Bestil objekt fungerer som en samling af sider. Sider inkluderet i Bestil kan have identiske eller forskellige formater og kan bruge forskellige malere.

SideligInterfaceEN Sidelig implementering repræsenterer et sæt sider, der skal udskrives. Det Sidelig objekt returnerer det samlede antal sider i sættet såvel som Sideformat og Printbar for en bestemt side. Det Bestil klasse implementerer denne grænseflade.
PrintbarInterfaceEn sidemaler skal implementere Printbar interface. Der er kun en metode i denne grænseflade, Print().
PrinterGrafikInterfaceDet Grafik objekt implementerer denne grænseflade. PrinterGrafik giver den getPrinterJob () metode til at opnå det printerjob, der instantierede udskrivningsprocessen.

Sidet interface

Det Sidelig interface inkluderer tre metoder:

MetodenavnBeskrivelse
int getNumberOfPages ()Returnerer antallet af sider i dokumentet.
PageFormat getPageFormat (int pageIndex)Returnerer siderne Sideformat som specificeret af pageIndex.
Printbar getPrintable (int pageIndex)Returnerer Printbar instans ansvarlig for gengivelse af den side, der er angivet af pageIndex.

Printbar grænseflade

Det Printbar interface har en metode og to værdier:

NavnTypeBeskrivelse
int print (Grafik grafik, PageFormat sideFormat, int pageIndex)Metode

Anmoder om, at grafikken håndteres ved hjælp af det givne sideformat, gengiver den angivne side.

NO_SUCH_PAGEVærdiDette er en konstant. Returner denne værdi for at angive, at der ikke er flere sider at udskrive.
PAGE_EXISTSVærdiDet Print() metoden vender tilbage PAGE_EXISTS. Det indikerer, at siden blev sendt som en parameter til Print() er gengivet og eksisterer.

Hver sidemaler skal implementere Printbar interface. Da der kun er én metode at implementere, kan det være let at oprette sidemalere. Husk dog, at din kode skal kunne gengive en hvilken som helst side i eller uden for rækkefølgen.

Der er tre parametre til Print(), inklusive Grafik, som er den samme klasse, der bruges til at tegne på skærmen. Siden Grafik klasse implementerer PrinterGrafisk interface, kan du få PrinterJob der instantierede dette udskriftsjob. Hvis dit sidelayout er komplekst og kræver nogle avancerede tegningsfunktioner, kan du caste Grafik parameter til en Grafik2D objekt. Du får derefter adgang til den fulde Java 2D API.

Inden du begynder at bruge Grafik objekt, bemærk at koordinaterne ikke oversættes til det øverste venstre hjørne af det udskrivbare område. Se figur 3 for at finde placeringen af ​​standardoprindelsen.

(0, 0) vises i øverste venstre hjørne af printermargenerne. Hvis du vil udskrive et 1-til-1-tommers rektangel, 1 tommer fra både øverste og venstre margen, bruger du følgende kode:

1: offentlig int-udskrivning (Grafikgrafik, PageFormat-sideFormat, int-sideIndex) {2: Grafik2D-grafik2D = (Grafik2D) -grafik; 3: Rektangel2D.Dobbelt rektangel = ny Rektangel2D.Dobbelt (); 4: rectangle.setRect (pageFormat.getImageableX () + 72, 5: pageFormat.getImageableY () + 72, 6: 72, 7: 72); 8: graphics2D.draw (rektangel); 9: returnere (PAGE_EXISTS); }

Fra det foregående eksempel ser vi, at vi manuelt skal oversætte oprindelsen af ​​rektanglet, så det udskrives øverst i det udskrivbare område som i figur 1. For at forenkle koden kunne vi oversætte koordinaterne en gang og bruge (0, 0 ) som oprindelsen til det udskrivbare område. Ved at ændre det foregående eksempel får vi:

1: offentlig int-udskrivning (Grafikgrafik, PageFormat-sideFormat, int-sideIndex) {2: Grafik2D-grafik2D = (Grafik2D) -grafik; 3: graphics2D.translate (pageFormat.getImageableX (), pageFormat.getImageableY ()); 4: Rektangel2D.Dobbelt rektangel = ny Rektangel2D.Dobbelt (); 5: rectangle.setRect (72, 72, 72, 72); 6: graphics2D.draw (rektangel); 7: returner (PAGE_EXISTS); 8:}

Bruger Oversætte() metode i linje 3, kan vi oversætte koordinaterne og indstille vores oprindelse (0, 0) øverst i det udskrivbare område. Fra dette tidspunkt bliver vores kode forenklet.

PrinterGraphics-grænseflade

Det PrinterGrafik interface består af en metode:

MetodenavnBeskrivelse
PrinterJob getPrinterJob ()Returnerer PrinterJob for denne gengivelsesanmodning og implementeres af Grafik klasse

Papir klasse

Otte metoder udgør Papir klasse:

MetodenavnBeskrivelse
dobbelt getHeight ()Denne metode returnerer sidens fysiske højde i point (1 tomme = 72 point). For eksempel, hvis du udskriver på en side i Letter-størrelse, vil returværdien være 792 point eller 11 inches.
dobbelt getImageableHøjde ()Denne metode returnerer sidens billedhøjde. Den forestillbare højde er højden på det udskrivningsområde, du kan trække på. Se figur 1 for en grafisk afbildning af det forestillbare område.
dobbelt getImageableWidth ()Denne metode returnerer en sides imagebredde (bredden på det udskrivningsområde, som du kan trække på). Se figur 1 for en grafisk afbildning af det forestillbare område.
dobbelt getImageableX ()Denne metode returnerer x-oprindelsen til det forestillbare område. Da der ikke er nogen understøttelse af margener, repræsenterer returværdien venstre margen.
dobbelt getImageableY ()Denne metode returnerer y-oprindelsen for det forestillbare område. Værdien, der returneres fra denne metode, svarer til topmargenen.
dobbelt getWidth ()Denne metode returnerer sidens fysiske bredde i point. Hvis du udskriver på papir i Letter-størrelse, er bredden 8,5 inches eller 612 point.
void setImageableArea (dobbelt x, dobbelt y, dobbelt bredde, dobbelt højde)Denne metode indstiller det forestillbare område og specificerer marginerne på siden. Faktisk giver API'en ingen metode til at indstille margenerne eksplicit. du skal selv beregne dem.
void setSize (dobbelt bredde, dobbelt højde)Denne metode indstiller den fysiske sidestørrelse. For at definere et 8,5 x 11 tommer ark leverer du 612 og 792 point. Bemærk, at standardstørrelsen er BREV.

Inden vi går videre til næste afsnit, skal du huske, at Papir klasse definerer sidens fysiske egenskaber. Det Sideformat klasse repræsenterer alle sidens egenskaber, såsom sideretning, størrelse og papirtype. Denne klasse sendes altid som en parameter til Printbar grænseflader Print() metode. Brug Papir for at opnå den forestillbare områdes placering, størrelse og sideorientering sammen med en transformationsmatrix.

PageFormat klasse

Det Sideformat består af 12 metoder:

MetodenavnBeskrivelse
dobbelt getHeight ()Denne metode returnerer sidens fysiske højde i point (1 tomme = 72 point). Hvis din side måler 8,5 x 11 tommer, vil returværdien være 792 point eller 11 tommer.
dobbelt getImageableHøjde ()Denne metode returnerer sidens billedhøjde, som er højden på det udskrivningsområde, som du kan tegne. Se figur 1 for en grafisk afbildning af det forestillbare område.
dobbelt getImageableWidth ()Denne metode returnerer sidens forestillbare bredde - bredden på det udskrivningsområde, som du kan tegne. Figur 1 illustrerer et grafisk billede af det forestillbare område.
dobbelt getImageableX ()Denne metode returnerer x-oprindelsen til det forestillbare område.
dobbelt getImageableY ()Denne metode returnerer det tænkelige områdes y-oprindelse.
dobbelt getWidth ()Denne metode returnerer sidens fysiske bredde i point. Hvis du udskriver på papir i Letter-størrelse, er bredden 812 tommer eller 612 point.
dobbelt getHeight ()Denne metode returnerer sidens fysiske højde i point. For eksempel er papir i Letter-størrelse 11 inches i højden eller 792 point.
dobbelt [] getMatrix ()Denne metode returnerer en transformationsmatrix, der oversætter brugerplads til den ønskede sideorientering. Returneringsværdien er i det format, der kræves af AffineTransform konstruktør.
int getOrientation ()Denne metode returnerer retningen af ​​siden som en af ​​disse PORTRET eller LANDSKAB.
ugyldigt sæt Orientering (int-retning)Denne metode indstiller retningen på siden ved hjælp af konstanterne PORTRET og LANDSKAB.
Papir getPaper ()Denne metode returnerer Papir objekt tilknyttet sideformatet. Se det foregående afsnit for en beskrivelse af Papir klasse.
ugyldigt sæt Papir (papir)Denne metode indstiller Papir objekt, der vil blive brugt af Sideformat klasse. Sideformat skal have adgang til de fysiske sidekarakteristikker for at udføre denne opgave.

Dette afslutter beskrivelsen af ​​sideklasser. Den næste klasse, som vi skal studere, er PrinterJob.

PrinterJob-klasse

Det PrinterJob klasse styrer udskrivningsprocessen. Det kan både starte og styre et udskriftsjob. Nedenfor finder du en definition af klassen:

MetodenavnBeskrivelse
abstrakt ugyldigt annullere ()Denne metode annullerer det aktuelle udskriftsjob. Du kan validere annulleringen med isCancel () metode.
abstrakt boolsk isCancelled ()Denne metode returnerer sand, hvis jobbet annulleres.
PageFormat defaultPage ()Denne metode returnerer standardsideformatet for PrinterJob.
abstrakt PageFormat defaultPage (PageFormat side)Denne metode kloner Sideformat videregivet i parametre og ændrer klonen for at oprette standard Sideformat.
abstrakt int getCopies ()Denne metode returnerer antallet af kopier, som udskriftsjobbet udskriver.
abstrakt ugyldigt sætKopier (int kopier)Denne metode indstiller antallet af kopier, jobbet udskrives på. Bemærk, at hvis du viser en udskrivningsdialogboks, kan brugerne ændre antallet af kopier (se sideDialog metode).
abstrakt streng getJobName ()Denne metode returnerer jobnavnet.
statisk PrinterJob getPrinterJob ()Denne metode opretter og returnerer en ny PrinterJob.
abstrakt streng getUserName ()Denne metode returnerer det brugernavn, der er knyttet til udskriftsjobbet.
abstrakt SideFormat-sideDialog (SideFormat-side)Denne metode viser en dialog, der giver brugeren mulighed for at ændre Sideformat. Det Sideformat, videregivet i parametre, indstiller felterne i dialogen. Hvis brugeren annullerer dialogen, så er originalen Sideformat vil blive returneret. Men hvis brugeren accepterer parametrene, så en ny Sideformat vil blive oprettet og returneret. Da det ikke viser de samme parametre på alle operativsystemer, skal du være forsigtig, når du bruger sideDialog.
abstrakt ugyldigt sæt Pageable (Pageable document)Denne metode spørger dokumentet for at få det samlede antal sider. Det Sidelig vil også returnere Sideformat og Printbar objekt for hver side. Se definitionen af Sidelig interface for mere information.
abstrakt ugyldigt sæt Printbart (malbar til udskrivning)Denne metode indstiller Maler objekt, der gengiver siderne, der skal udskrives. EN Maler objekt er et objekt, der implementerer Printbar klasse og dens Print() metode.
abstrakt ugyldigt sæt Printbart (malbar til udskrivning, PageFormat-format)Denne metode udfører de samme opgaver som abstrakt ugyldigt sæt Printbart (malbar til udskrivning), bortset fra at du leverer Sideformat at den Maler vil bruge. Som angivet i definitionen af Printbar interface, den Print() metoden passerer en Sideformat objekt som den første parameter.
abstrakt ugyldigt tryk ()Denne metode udskriver dokumentet. Det kalder faktisk Print() metode til Maler tidligere tildelt dette udskriftsjob.
abstrakt ugyldigt sætJobName (streng jobnavn)Denne metode indstiller navnet på udskriftsjobbet.
abstrakt boolesk print Dialog ()Denne metode viser en udskrivningsdialogboks, der giver brugeren mulighed for at ændre udskriftsparametrene. Bemærk, at resultatet af denne interaktion ikke returneres til dit program. I stedet overføres det til peer-operativsystemet.
abstrakt PageFormat validatePage (PageFormat side)Denne metode validerer Sideformat videregivet i parametre. Hvis printeren ikke kan bruge Sideformat som du leverede, så returneres en ny, der passer til printeren.

Bogklasse

Syv metoder udgør Bestil klasse:

>

MetodenavnBeskrivelse
ugyldig tilføjelse (udskrivbar maler, PageFormat-side)Denne metode føjer en side til Bestil. Det maler og Sideformat for den side sendes i parametre.
ugyldig tilføjelse (udskrivbar maler, PageFormat-side, int numPages)Denne metode udfører de samme opgaver som ugyldig tilføjelse (udskrivbar maler, PageFormat-side), bortset fra at du angiver antallet af sider.
int getNumberOfPages ()Denne metode returnerer antallet af sider, der aktuelt er i Bestil.
PageFormat getPageFormat (int pageIndex)Denne metode returnerer Sideformat objekt for en given side.
Printbar getPrintable (int pageIndex)Denne metode returnerer maler for en given side.
void setPage (int pageIndex, malbar til udskrivning, PageFormat-side)Denne metode indstiller maler og Sideformat for en given side, der allerede er i bogen.

Udskrivningsopskriften

Opskriften til udskrivning er meget enkel. Opret først en PrinterJob objekt:

PrinterJob printJob = PrinterJob.getPrinterJob ();

Brug derefter setPrintable () metode til PrinterJob, tildele Maler modsætter sig PrinterJob. Bemærk, at en Maler objekt er et, der implementerer Printbar interface.

printJob.setPrintable (Maler);

Eller du kan indstille Sideformat sammen med Maler :

printJob.setPrintable (Maler, sideFormat);

Endelig blev Maler objektet skal implementere Print() metode:

public int print (Grafik g, PageFormat sideFormat, int side)

Her er den første parameter det grafiske håndtag, som du vil bruge til at gengive siden, den sideFormat er det format, der skal bruges til den aktuelle side, og den sidste parameter er det sidetal, der skal gengives.

Det er alt der er til det - til simpel udskrivning, altså.

Introduktion til rammen

Udskrivningsrammen, som vi bygger i denne serie, vil være helt uafhængig af Java-udskrivnings-API'en. Det giver mulighed for større fleksibilitet i produktionen af ​​forskellige output.Dens struktur giver dig mulighed for at oprette dokumenter, sider og udskrive objekter. Du vil være i stand til at tilføje udskriftsobjekter til en side, mens du føjer sider til et dokument. Ved at bruge denne struktur vil du være i stand til nemt at implementere eksportfunktioner til PDF- eller HTML-filer eller udskrive direkte til printeren ved hjælp af udskrivnings-API. Men det primære mål med rammen er at forenkle oprettelsen af ​​trykte dokumenter. Når du udskriver ved hjælp af udskrivnings-API'et, ender du kun med et grafisk lærred at tegne på. Det adresserer ikke begreberne afsnit, billeder, tegninger, grafik, tabeller eller løbende sidehoveder og sidefødder. Fordi du skal beregne oprindelsen (x, y), bredden og højden af ​​det udskrivbare område, er indstillingsmargener en opgave. Vores printrammer vil løse alle disse svagheder.

Konklusion

Vi dækkede meget grund i denne første del. Vi kiggede på måleenheder, sidens struktur, de to gengivelsesmodeller (Sidelig og Printbar), og Bøger, og vi afsluttede med en detaljeret forklaring af udskrivnings-API'et. Næste måned vil vi primært fokusere på kode, da vi vil omsætte alt i praksis. Vi vil også se på de problemer, der opstår, når der udskrives på flere platforme. Ser jeg frem til del 3, vil jeg forklare detaljeret designet og implementeringen af ​​rammen.

Jean-Pierre Dube er en uafhængig Java-konsulent. Han grundlagde Infocom i 1988. Siden da har Infocom udviklet brugerdefinerede applikationer inden for områder, herunder fremstilling, dokumentstyring og storskala elektrisk ledningsstyring. Jean-Pierre har omfattende programmeringserfaring inden for C, Visual Basic og Java; sidstnævnte er nu det primære sprog for alle nye projekter. Han dedikerer denne serie til sin mor, der døde, mens han skrev denne artikel.

Lær mere om dette emne

  • "Udskrivning i Java", Jean-Pierre Dubé (JavaWorld)
  • Del 1: Bekend dig med Java-udskrivningsmodellen (20. oktober 2000)
  • Del 2: Udskriv din første side og gengiv komplekse dokumenter (1. december 2000)
  • Del 3: Jean-Pierre Dubé introducerer printrammerne, der fungerer oven på Java Print API (5. januar 2001)
  • Del 4: Kod udskriftsrammen
  • (2. februar 2001)
  • Del 5: Opdag udskriftsrammernes supportklasser
  • (2. marts 2001)
  • Du vil finde masser af bøger, der dækker Java AWT, men ingen vil dække dette emne i denne bogs omfang. Hvis du skriver GUI'er, skal du have denne bog ved siden af ​​din computer: Grafisk Java 2, Mastering The JFCAWT, bind 1, David M. Geary (Prentice Hall, 1998)

    //www.amazon.com/exec/obidos/ASIN/0130796662/javaworld

  • Denne bog var nyttig, da Java 1.1 kom ud og var den første til at tale om udskrivning i Java: Migrering fra Java 1.0 til Java 1.1, Daniel I. Joshi og Pavel A. Vorobiev (Ventana Communications Group, 1997)

    //www.amazon.com/exec/obidos/ASIN/1566046866/javaworld

  • Sandsynligvis den bedste bog på Java 2D, denne bog dækker alle aspekter af 2D API og giver også en Grafik ramme for avancerede 2D-kompositioner: Java 2D API-grafik, Vincent J. Hardy (Prentice Hall, 1999)

    //www.amazon.com/exec/obidos/ASIN/0130142662/javaworld

  • En glimrende introduktion til Java 2D API "Kom godt i gang med Java 2D", Bill Day (JavaWorld, Juli 1998)

    //www.javaworld.com/javaworld/jw-07-1998/jw-07-media.html

Denne historie, "Printing in Java, Part 1" blev oprindeligt udgivet af JavaWorld.