Programmering

Utskrift i Java, del 1

Forrige 1 2 Side 2 Side 2 av 2

Gjengivelsesmodeller

Det er to utskriftsmodeller i Java: Utskriftsvennlig jobber og Sidelig arbeidsplasser.

Utskriftsvennlig

Utskriftsvennlig jobber er den enkleste av de to utskriftsmodellene. Denne modellen bruker bare en PagePainter for hele dokumentet. Sidene gjengis i rekkefølge, og begynner med side null. Når den siste siden skrives ut, vil din PagePainter må returnere NO_SUCH_PAGE verdi. Utskriftsundersystemet vil alltid be om at applikasjonen gjengir sidene i rekkefølge. For eksempel, hvis søknaden din blir gjengitt sider fem til syv, vil utskriftsundersystemet be om alle sidene opp til den syvende siden, men vil bare skrive ut sidene fem, seks og syv. Hvis programmet viser en utskriftsdialogboks, vil ikke det totale antallet sider som skal skrives ut vises, siden det er umulig å vite på forhånd antall sider i dokumentet som bruker denne modellen.

Sider

Sidelig jobber gir mer fleksibilitet enn Utskriftsvennlig jobber, som hver side i en Sidelig jobben kan ha et annet oppsett. Sidelig jobber brukes oftest med Boks, en samling av sider som kan ha forskjellige formater. Jeg vil forklare Bok klasse i et øyeblikk.

EN Sidelig jobben har følgende egenskaper:

  • Hver side kan ha sin egen maler. For eksempel kan du få en maler implementert for å skrive ut forsiden, en annen maler for å skrive ut innholdsfortegnelsen og en tredje for å skrive ut hele dokumentet.
  • Du kan angi et annet sideformat for hver side i boken. I en Sidelig jobb, kan du blande stående og liggende sider.
  • Undersystemet for utskrift kan be applikasjonen din om å skrive ut sider utenfor rekkefølge, og noen sider kan hoppes over om nødvendig. Igjen, du trenger ikke å bekymre deg for dette så lenge du kan levere en hvilken som helst side i dokumentet ditt på forespørsel.
  • De Sidelig jobben trenger ikke å vite hvor mange sider som er i dokumentet.

Bøker

Også nytt siden versjon 1.2 er Bok klasse. Denne klassen lar deg lage dokumenter på flere sider. Hver side kan ha sitt eget format og sin egen maler, noe som gir deg fleksibilitet til å lage sofistikerte dokumenter. Siden Bok klasse implementerer Sidelig grensesnitt, kan du implementere ditt eget Bok klasse når det gis Bok klasse mangler funksjonene du trenger.

EN Bok klasse representerer en samling av sider. Når den ble opprettet, ble Bok objektet er tomt. For å legge til sider bruker du bare en av de to legg til () metoder (se min forklaring på denne klassen i API-delen for mer informasjon). Parameterne til denne metoden er Sideformat objekt, som definerer de fysiske egenskapene til siden, og a PagePainter objekt, som implementerer Utskriftsvennlig grensesnitt. Hvis du ikke vet antall sider i dokumentet, kan du bare sende inn UNKNOWN_NUMBER_OF_PAGES verdi til legg til () metode. Skriversystemet finner automatisk antall sider ved å ringe alle sidemalerne i boka til den mottar et NO_SUCH_PAGE verdi.

API-definisjon

Teori og praksis vil møtes i denne delen. I de forrige avsnittene lærte vi om sidestruktur, måleenheter og gjengivelsesmodeller. I denne delen vil vi se på Java printing API.

Alle klassene som kreves for å skrive ut ligger i java.awt.print pakke, som består av tre grensesnitt og fire klasser. Følgende tabeller definerer klassene og grensesnittene til utskriftspakken.

NavnTypeBeskrivelse
PapirKlasseDenne klassen definerer sidens fysiske egenskaper.
SideformatKlasseSideformat definerer sidens størrelse og retning. Den definerer også hvilken Papir å bruke når du gjengir en side.
PrinterJobKlasse

Denne klassen klarer utskriftsjobben. Ansvaret inkluderer å lage en utskriftsjobb, vise en utskriftsdialogboks når det er nødvendig, og skrive ut dokumentet.

BokKlasse

Bok representerer et dokument. EN Bok objekt fungerer som en samling av sider. Sider inkludert i Bok kan ha identiske eller forskjellige formater og kan bruke forskjellige malere.

SideligGrensesnittEN Sidelig implementering representerer et sett med sider som skal skrives ut. De Sidelig objektet returnerer det totale antallet sider i settet samt Sideformat og Utskriftsvennlig for en spesifisert side. De Bok klasse implementerer dette grensesnittet.
UtskriftsvennligGrensesnittEn sidemaler må implementere Utskriftsvennlig grensesnitt. Det er bare en metode i dette grensesnittet, skrive ut().
PrinterGraphicsGrensesnittDe Grafikk objektet implementerer dette grensesnittet. PrinterGraphics gir den getPrinterJob () metoden for å skaffe skriverjobben som startet utskriftsprosessen.

Sidbart grensesnitt

De Sidelig grensesnittet inneholder tre metoder:

MetodenavnBeskrivelse
int getNumberOfPages ()Returnerer antall sider i dokumentet.
PageFormat getPageFormat (int pageIndex)Returnerer sidens Sideformat som spesifisert av pageIndex.
Utskrivbar getPrintable (int pageIndex)Returnerer Utskriftsvennlig instans ansvarlig for gjengivelse av siden spesifisert av pageIndex.

Utskrivbart grensesnitt

De Utskriftsvennlig grensesnittet har en metode og to verdier:

NavnTypeBeskrivelse
int-utskrift (Grafikkgrafikk, PageFormat-sideFormat, int-sideIndex)Metode

Ber om at grafikken skal håndtere det gitte sideformatet, gjengi den angitte siden.

NO_SUCH_PAGEVerdiDette er en konstant. Returner denne verdien for å indikere at det ikke er flere sider å skrive ut.
PAGE_EXISTSVerdiDe skrive ut() metoden returnerer PAGE_EXISTS. Det indikerer at siden ble sendt som en parameter til skrive ut() har blitt gjengitt og eksisterer.

Hver sidemaler må implementere Utskriftsvennlig grensesnitt. Siden det bare er en metode å implementere, kan det være enkelt å lage sidemalere. Husk imidlertid at koden din må kunne gjengi hvilken som helst side i eller utenfor rekkefølgen.

Det er tre parametere for skrive ut(), gjelder også Grafikk, som er den samme klassen som ble brukt til å tegne på skjermen. Siden Grafikk klasse implementerer PrinterGraphic grensesnitt, kan du få tak i PrinterJob som instantierte denne utskriftsjobben. Hvis sideoppsettet ditt er komplekst og krever noen avanserte tegnefunksjoner, kan du kaste Grafikk parameter til en Grafikk2D gjenstand. Du vil da ha tilgang til hele Java 2D API.

Før du begynner å bruke Grafikk Vær oppmerksom på at koordinatene ikke oversettes til det øverste venstre hjørnet av det utskrivbare området. Se figur 3 for å finne plasseringen til standardopprinnelsen.

(0, 0) vises øverst til venstre på skrivermargene. For å skrive ut et 1-for-1-tommers rektangel, 1 tommers fra både topp- og venstre marg, bruker du følgende kode:

1: public int print (Grafikkgrafikk, PageFormat sideFormat, int pageIndex) {2: Grafikk2D grafikk2D = (Grafikk2D) grafikk; 3: Rectangle2D.Double rectangle = ny Rectangle2D.Double (); 4: rectangle.setRect (pageFormat.getImageableX () + 72, 5: pageFormat.getImageableY () + 72, 6: 72, 7: 72); 8: graphics2D.draw (rektangel); 9: retur (PAGE_EXISTS); }

Fra forrige eksempel ser vi at vi må oversette opprinnelsen til rektangelet manuelt slik at det skrives ut øverst i det utskrivbare området som i figur 1. For å forenkle koden, kan vi oversette koordinatene en gang og bruke (0, 0 ) som opprinnelse til det utskrivbare området. Ved å endre det forrige eksemplet får vi:

1: public int print (Grafikkgrafikk, PageFormat sideFormat, int pageIndex) {2: Grafikk2D grafikk2D = (Grafikk2D) grafikk; 3: graphics2D.translate (pageFormat.getImageableX (), pageFormat.getImageableY ()); 4: Rectangle2D.Double rectangle = ny Rectangle2D.Double (); 5: rectangle.setRect (72, 72, 72, 72); 6: graphics2D.draw (rektangel); 7: retur (PAGE_EXISTS); 8:}

Bruker oversette() metode i linje 3, kan vi oversette koordinatene og angi opprinnelsen (0, 0) øverst i det utskrivbare området. Fra dette tidspunktet vil koden vår bli forenklet.

PrinterGraphics-grensesnitt

De PrinterGraphics grensesnittet består av en metode:

MetodenavnBeskrivelse
PrinterJob getPrinterJob ()Returnerer PrinterJob for denne gjengivelsesforespørselen og er implementert av Grafikk klasse

Papirklasse

Åtte metoder utgjør Papir klasse:

MetodenavnBeskrivelse
dobbel getHeight ()Denne metoden returnerer sidens fysiske høyde i poeng (1 tomme = 72 poeng). Hvis du for eksempel skriver ut på en side i Letter-størrelse, vil returverdien være 792 poeng eller 11 tommer.
dobbel getImageableHeight ()Denne metoden returnerer sidens tenkelige høyde. Den tenkelige høyden er høyden på utskriftsområdet du kan tegne på. Se figur 1 for en grafisk oversikt over det tenkelige området.
dobbel getImageableWidth ()Denne metoden returnerer sidens forestillbare bredde (bredden på utskriftsområdet du kan tegne på). Se figur 1 for en grafisk oversikt over det tenkelige området.
dobbel getImageableX ()Denne metoden returnerer x-opprinnelsen til det tenkelige området. Siden det ikke er støtte for marginer, representerer returverdien venstre margin.
dobbel getImageableY ()Denne metoden returnerer y-opprinnelsen til det tenkelige området. Verdien som returneres fra denne metoden tilsvarer toppmargenen.
dobbel getWidth ()Denne metoden returnerer sidens fysiske bredde i poeng. Hvis du skriver ut på papir i Letter-størrelse, er bredden 8,5 tommer eller 612 poeng.
void setImageableArea (dobbel x, dobbel y, dobbel bredde, dobbel høyde)Denne metoden angir det tenkelige området og spesifiserer margene på siden. Faktisk gir API ingen metode for å angi marginene eksplisitt; du må beregne dem selv.
void setSize (dobbel bredde, dobbel høyde)Denne metoden angir den fysiske sidestørrelsen. For å definere et ark på 8,5 x 11 tommer, leverer du 612 og 792 poeng. Merk at standardstørrelsen er BREV.

Før vi går videre til neste avsnitt, husk at Papir klasse definerer sidens fysiske egenskaper. De Sideformat klasse representerer alle sidens egenskaper, for eksempel sideretning, størrelse og papirtype. Denne klassen sendes alltid som en parameter til Utskriftsvennlig grensesnitt skrive ut() metode. Bruk Papir for å oppnå den tenkelige områdets plassering, størrelse og sideorientering sammen med en transformasjonsmatrise.

PageFormat-klasse

De Sideformat består av 12 metoder:

MetodenavnBeskrivelse
dobbel getHeight ()Denne metoden returnerer sidens fysiske høyde i poeng (1 tomme = 72 poeng). Hvis siden din måler 8,5 x 11 tommer, vil returverdien være 792 poeng eller 11 tommer.
dobbel getImageableHeight ()Denne metoden returnerer sidens tenkelige høyde, som er høyden på utskriftsområdet du kan tegne på. Se figur 1 for en grafisk oversikt over det tenkelige området.
dobbel getImageableWidth ()Denne metoden returnerer sidens forestillbare bredde - bredden på utskriftsområdet du kan tegne på. Figur 1 illustrerer en grafisk oversikt over det tenkelige området.
dobbel getImageableX ()Denne metoden returnerer x-opprinnelsen til det tenkelige området.
dobbel getImageableY ()Denne metoden returnerer det tenkelige områdets y-opprinnelse.
dobbel getWidth ()Denne metoden returnerer sidens fysiske bredde i poeng. Hvis du skriver ut på papir i Letter-størrelse, er bredden 612 poeng.
dobbel getHeight ()Denne metoden returnerer sidens fysiske høyde i poeng. For eksempel er papir i Letter-størrelse 11 tommer i høyden, eller 792 poeng.
doble [] getMatrix ()Denne metoden returnerer en transformasjonsmatrise som oversetter brukerplass til ønsket sideorientering. Returverdien er i det formatet som kreves av AffineTransform konstruktør.
int getOrientation ()Denne metoden returnerer retningen på siden som en av dem PORTRETT eller LANDSKAP.
void setOrientation (int-orientering)Denne metoden angir retningen på siden ved hjelp av konstantene PORTRETT og LANDSKAP.
Paper getPaper ()Denne metoden returnerer Papir objekt tilknyttet sideformatet. Se forrige avsnitt for en beskrivelse av Papir klasse.
void set Papir (papir)Denne metoden setter Papir objekt som skal brukes av Sideformat klasse. Sideformat må ha tilgang til de fysiske sidegenskapene for å fullføre denne oppgaven.

Dette avslutter beskrivelsen av sideklassene. Neste klasse vi skal studere er PrinterJob.

PrinterJob-klasse

De PrinterJob klasse styrer utskriftsprosessen. Det kan både starte og kontrollere en utskriftsjobb. Nedenfor finner du en definisjon av klassen:

MetodenavnBeskrivelse
abstrakt ugyldig annullere ()Denne metoden avbryter gjeldende utskriftsjobb. Du kan validere kanselleringen med isCancel () metode.
abstrakt boolsk isCancelled ()Denne metoden blir sant hvis jobben blir kansellert.
PageFormat defaultPage ()Denne metoden returnerer standard sideformat for PrinterJob.
abstrakt PageFormat defaultPage (PageFormat side)Denne metoden kloner Sideformat overført i parametere og endrer klonen for å opprette standard Sideformat.
abstrakt int getCopies ()Denne metoden returnerer antall eksemplarer som utskriftsjobben skal skrives ut.
abstrakt ugyldig settKopier (int kopier)Denne metoden angir antall kopier som jobben skal skrives ut. Merk at hvis du viser en utskriftsdialogboks, kan brukere endre antall eksemplarer (se pageDialog metode).
abstrakt streng getJobName ()Denne metoden returnerer jobbnavnet.
statisk PrinterJob getPrinterJob ()Denne metoden oppretter og returnerer en ny PrinterJob.
abstrakt streng getUserName ()Denne metoden returnerer brukernavnet som er knyttet til utskriftsjobben.
abstrakt PageFormat-sideDialog (PageFormat-side)Denne metoden viser en dialog som lar brukeren endre Sideformat. De Sideformat, sendt i parametere, angir felt i dialogboksen. Hvis brukeren avbryter dialogen, så originalen Sideformat vil bli returnert. Men hvis brukeren godtar parametrene, så en ny Sideformat vil bli opprettet og returnert. Siden det ikke viser de samme parametrene på alle operativsystemer, må du være forsiktig når du bruker pageDialog.
abstrakt ugyldig settPageable (Pageable document)Denne metoden spør dokumentet for å oppnå totalt antall sider. De Sidelig vil også returnere Sideformat og Utskriftsvennlig objekt for hver side. Se definisjonen av Sidelig grensesnitt for mer informasjon.
abstrakt ugyldig sett Utskriftsvennlig (utskrivbar maler)Denne metoden setter Maler objekt som gjengir sidene som skal skrives ut. EN Maler objekt er et objekt som implementerer Utskriftsvennlig klasse og dens skrive ut() metode.
abstrakt tomrom sett Utskriftsvennlig (Utskrivbar maler, PageFormat format)Denne metoden fullfører de samme oppgavene som abstrakt ugyldig sett Utskriftsvennlig (utskrivbar maler), bortsett fra at du leverer Sideformat at Maler vil bruke. Som angitt i definisjonen av Utskriftsvennlig grensesnitt, skrive ut() metoden passerer en Sideformat objekt som den første parameteren.
abstrakt ugyldig utskrift ()Denne metoden skriver ut dokumentet. Det kaller faktisk skrive ut() metoden for Maler tidligere tilordnet denne utskriftsjobben.
abstrakt ugyldig settJobnavn (streng jobbnavn)Denne metoden angir navnet på utskriftsjobben.
abstrakt boolsk trykk Dialog ()Denne metoden viser en utskriftsdialogboks som lar brukeren endre utskriftsparametrene. Merk at resultatet av denne interaksjonen ikke vil bli returnert til programmet ditt. I stedet blir den overført til peer-operativsystemet.
abstrakt PageFormat validatePage (PageFormat side)Denne metoden vil validere Sideformat gått i parametere. Hvis skriveren ikke kan bruke Sideformat du har levert, så vil en ny som samsvarer med skriveren returneres.

Bokklasse

Syv metoder utgjør Bok klasse:

>

MetodenavnBeskrivelse
ugyldig vedlegg (Utskrivbar maler, PageFormat-side)Denne metoden legger til en side til Bok. De maler og Sideformat for den siden sendes i parametere.
void append (Utskrivbar maler, PageFormat-side, int numPages)Denne metoden fullfører de samme oppgavene som ugyldig vedlegg (Utskrivbar maler, PageFormat-side), bortsett fra at du angir antall sider.
int getNumberOfPages ()Denne metoden returnerer antall sider som for øyeblikket er i Bok.
PageFormat getPageFormat (int pageIndex)Denne metoden returnerer Sideformat objekt for en gitt side.
Utskrivbar getPrintable (int pageIndex)Denne metoden returnerer maler for en gitt side.
void setPage (int pageIndex, Utskrivbar maler, PageFormat side)Denne metoden setter maler og Sideformat for en gitt side allerede i boka.

Utskriftsoppskriften

Oppskriften for utskrift er veldig enkel. Opprett først en PrinterJob gjenstand:

PrinterJob printJob = PrinterJob.getPrinterJob ();

Deretter bruker du setPrintable () metoden for PrinterJob, tilordne Maler motsette seg PrinterJob. Merk at a Maler objektet er en som implementerer Utskriftsvennlig grensesnitt.

printJob.setPrintable (Maler);

Eller du kan stille inn Sideformat sammen med Maler :

printJob.setPrintable (Painter, pageFormat);

Til slutt, Maler objektet må implementere skrive ut() metode:

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

Her er den første parameteren grafikkhåndtaket du vil bruke til å gjengi siden, den sideFormat er formatet som skal brukes for den gjeldende siden, og den siste parameteren er sidenummeret som må gjengis.

Det er alt det er - for enkel utskrift, altså.

Introduksjon til rammeverket

Utskriftsrammeverket som vi skal bygge i denne serien vil være helt uavhengig av Java printing API. Det vil gi større fleksibilitet i å produsere forskjellige utganger.Strukturen lar deg lage dokumenter, sider og skrive ut objekter. Du vil kunne legge til utskriftsobjekter på en side mens du legger til sider i et dokument. Ved å bruke denne strukturen vil du enkelt kunne implementere eksportfunksjoner til PDF- eller HTML-filer, eller skrive ut direkte til skriveren ved hjelp av utskrifts-API. Men hovedmålet med rammeverket er å forenkle opprettelsen av trykte dokumenter. Når du skriver ut med utskrifts-API-en, får du bare et grafisk lerret å tegne på. Det unnlater å adressere begrepene avsnitt, bilder, tegninger, grafikk, tabeller eller løpende topp- og bunntekster. Fordi du må beregne opprinnelsen (x, y), bredden og høyden på det utskrivbare området, er det vanskelig å stille inn marginer. Våre trykte rammeverk vil løse alle disse svakhetene.

Konklusjon

Vi dekket mye grunn i denne første delen. Vi så på måleenheter, strukturen til siden, de to gjengivelsesmodellene (Sidelig og Utskriftsvennlig), og Bøker, og vi avsluttet med en detaljert forklaring av utskrifts-API. Neste måned vil vi først og fremst fokusere på kode, ettersom vi vil sette alt ut i livet. Vi vil også se på problemene som oppstår når vi skriver ut på flere plattformer. Ser jeg frem til del 3, vil jeg forklare i detalj utformingen og implementeringen av rammeverket.

Jean-Pierre Dube er en uavhengig Java-konsulent. Han grunnla Infocom i 1988. Siden den gang har Infocom utviklet tilpassede applikasjoner innen felt, inkludert produksjon, dokumentadministrasjon og storskala elektrisk ledningsadministrasjon. Jean-Pierre har omfattende programmeringserfaring innen C, Visual Basic og Java; sistnevnte er nå hovedspråket for alle nye prosjekter. Han tilegner denne serien til moren, som gikk bort mens han skrev denne artikkelen.

Lær mer om dette emnet

  • "Utskrift i Java," Jean-Pierre Dubé (JavaWorld)
  • Del 1: Bli kjent med Java-utskriftsmodellen (20. oktober 2000)
  • Del 2: Skriv ut første side og gjengiv komplekse dokumenter (1. desember 2000)
  • Del 3: Jean-Pierre Dubé introduserer utskriftsrammeverket som fungerer på toppen av Java Print API (5. januar 2001)
  • Del 4: Koder utskriftsrammeverket
  • (2. februar 2001)
  • Del 5: Oppdag utskriftsrammeverkets støtteklasser
  • (2. mars 2001)
  • Du vil finne mange bøker som dekker Java AWT, men ingen vil dekke dette emnet i den utstrekning denne boken inneholder. Hvis du skriver GUI-er, må du ha denne boka ved siden av datamaskinen din: Grafisk Java 2, Mastering The JFCAWT, Volum 1, David M. Geary (Prentice Hall, 1998)

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

  • Denne boka var nyttig når Java 1.1 kom ut, og var den første som snakket om utskrift 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

  • Sannsynligvis den beste boken på Java 2D, denne boken dekker alle aspekter av 2D API og gir også en Grafikk rammeverk for avanserte 2D-komposisjoner: Java 2D API-grafikk, Vincent J. Hardy (Prentice Hall, 1999)

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

  • En utmerket introduksjon til Java 2D API "Komme i gang med Java 2D", Bill Day (JavaWorld, Juli 1998)

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

Denne historien, "Printing in Java, Part 1" ble opprinnelig utgitt av JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found