Programování

Tisk v Javě, část 1

Předchozí 1 2 Strana 2 Stránka 2 ze 2

Vykreslovací modely

V Javě existují dva modely tisku: Tisknutelné pracovních míst a Stránkovací pracovní místa.

Potisknutelné

Tisknutelné úlohy jsou jednodušší ze dvou tiskových modelů. Tento model používá pouze jeden PagePainter pro celý dokument. Stránky se vykreslují v pořadí, počínaje stránkou nula. Když se vytiskne poslední stránka, vaše PagePainter musí vrátit NO_SUCH_PAGE hodnota. Tiskový subsystém bude vždy požadovat, aby aplikace vykreslovala stránky v pořadí. Například pokud je vaše aplikace požádána o vykreslení stránek pět až sedm, tiskový subsystém požádá o všechny stránky až po sedmou stránku, ale vytiskne pouze stránky pět, šest a sedm. Pokud vaše aplikace zobrazí dialogové okno pro tisk, celkový počet stránek, které se mají vytisknout, se nezobrazí, protože pomocí tohoto modelu není možné předem zjistit počet stránek v dokumentu.

Příběhy

Stránkovací pracovní místa nabízejí větší flexibilitu než Tisknutelné úlohy, protože každá stránka v a Stránkovací úloha může obsahovat jiné rozvržení. Stránkovací práce se nejčastěji používají s Rezervovats, kolekce stránek, které mohou mít různé formáty. Vysvětlím Rezervovat třídy za chvíli.

A Stránkovací práce má následující vlastnosti:

  • Každá stránka může mít svého malíře. Můžete například nechat implementovat malíře pro tisk titulní stránky, jiného malíře pro tisk obsahu a třetího pro tisk celého dokumentu.
  • Pro každou stránku v knize můžete nastavit jiný formát stránky. V Stránkovací můžete kombinovat stránky na výšku a na šířku.
  • Tiskový subsystém může požádat vaši aplikaci, aby tiskla stránky mimo pořadí, a v případě potřeby mohou být některé stránky přeskočeny. Opět si s tím nemusíte dělat starosti, pokud můžete na požádání dodat jakoukoli stránku v dokumentu.
  • The Stránkovací úloha nemusí vědět, kolik stránek je v dokumentu.

Knihy

Také nový od verze 1.2 je Rezervovat třída. Tato třída umožňuje vytvářet vícestránkové dokumenty. Každá stránka může mít svůj vlastní formát a svůj vlastní malíř, což vám dává flexibilitu při vytváření sofistikovaných dokumentů. Protože Rezervovat třída implementuje Stránkovací můžete implementovat vlastní Rezervovat třída, pokud je k dispozici Rezervovat třídě chybí funkce, které požadujete.

A Rezervovat třída představuje kolekci stránek. Při prvním vytvoření Rezervovat objekt je prázdný. Chcete-li přidat stránky, jednoduše použijte jednu ze dvou připojit() metody (další podrobnosti viz moje vysvětlení této třídy v části API). Parametry této metody jsou PageFormat objekt, který definuje fyzikální vlastnosti stránky, a a PagePainter objekt, který implementuje Tisknutelné rozhraní. Pokud neznáte počet stránek v dokumentu, jednoduše předejte UNKNOWN_NUMBER_OF_PAGES hodnota do připojit() metoda. Tiskový systém automaticky najde počet stránek voláním všech malířů stránek v knize, dokud neobdrží a NO_SUCH_PAGE hodnota.

Definice API

V této části se setkáte s teorií a praxí. V předchozích částech jsme se dozvěděli o struktuře stránky, jednotkách měření a modelech vykreslování. V této části se podíváme na Java Printing API.

Všechny třídy potřebné k tisku jsou umístěny v java.awt.print balíček, který se skládá ze tří rozhraní a čtyř tříd. Následující tabulky definují třídy a rozhraní tiskového balíčku.

názevTypPopis
PapírTřídaTato třída definuje fyzikální vlastnosti stránky.
PageFormatTřídaPageFormat definuje velikost a orientaci stránky. Rovněž definuje, které Papír použít při vykreslování stránky.
PrinterJobTřída

Tato třída spravuje tiskovou úlohu. Mezi jeho povinnosti patří vytvoření tiskové úlohy, zobrazení dialogového okna tisku v případě potřeby a tisk dokumentu.

RezervovatTřída

Rezervovat představuje dokument. A Rezervovat objekt funguje jako soubor stránek. Stránky zahrnuté v Rezervovat může mít stejné nebo odlišné formáty a může používat různé malíře.

StránkovacíRozhraníA Stránkovací implementace představuje sadu stránek k tisku. The Stránkovací objekt vrací celkový počet stránek v sadě i PageFormat a Tisknutelné pro zadanou stránku. The Rezervovat třída implementuje toto rozhraní.
TisknutelnéRozhraníMalíř stránek musí implementovat Tisknutelné rozhraní. V tomto rozhraní existuje pouze jedna metoda, tisk().
PrinterGraphicsRozhraníThe Grafika objekt implementuje toto rozhraní. PrinterGraphics poskytuje getPrinterJob () metoda k získání tiskové úlohy, která vytvořila instanci tiskového procesu.

Stránkovatelné rozhraní

The Stránkovací rozhraní zahrnuje tři metody:

Název metodyPopis
int getNumberOfPages ()Vrátí počet stránek v dokumentu.
PageFormat getPageFormat (int pageIndex)Vrátí stránku PageFormat jak je uvedeno v pageIndex.
Tisknutelný getPrintable (int pageIndex)Vrátí Tisknutelné instance odpovědná za vykreslení stránky určené uživatelem pageIndex.

Tisknutelné rozhraní

The Tisknutelné rozhraní obsahuje jednu metodu a dvě hodnoty:

názevTypPopis
int print (grafická grafika, PageFormat pageFormat, int pageIndex)Metoda

Vyžaduje, aby grafický popisovač používající daný formát stránky vykreslil zadanou stránku.

NO_SUCH_PAGEHodnotaTo je konstanta. Vraťte tuto hodnotu, abyste označili, že již nejsou k dispozici žádné další stránky k tisku.
PAGE_EXISTSHodnotaThe tisk() metoda se vrací PAGE_EXISTS. Označuje, že stránka byla předána jako parametr tisk() byl vykreslen a existuje.

Každý malíř stránek musí implementovat Tisknutelné rozhraní. Jelikož je možné implementovat pouze jednu metodu, může se vytváření malířů stránek zdát snadné. Nezapomeňte však, že váš kód musí být schopen vykreslit libovolnou stránku v pořadí nebo mimo něj.

Existují tři parametry tisk(), počítaje v to Grafika, což je stejná třída, která se používá k kreslení na obrazovku. Protože Grafika třída implementuje PrinterGraphic rozhraní, můžete získat PrinterJob který vytvořil instanci této tiskové úlohy. Pokud je vaše rozvržení stránky složité a vyžaduje některé pokročilé funkce kreslení, můžete seslat Grafika parametr na a Graphics2D objekt. Poté budete mít přístup k úplnému rozhraní Java 2D API.

Než začnete používat Grafika objekt, nezapomeňte, že souřadnice nejsou přeloženy do levého horního rohu tisknutelné oblasti. Na obrázku 3 najdete umístění výchozího původu.

(0, 0) se zobrazí v levém horním rohu okrajů tiskárny. Chcete-li vytisknout obdélník 1 na 1 palec, 1 palec od horního a levého okraje, použijete následující kód:

1: public int print (Graphics graphics, PageFormat pageFormat, int pageIndex) {2: Graphics2D graphics2D = (Graphics2D) graphics; 3: Rectangle2D.Double rectangle = nový Rectangle2D.Double (); 4: rectangle.setRect (pageFormat.getImageableX () + 72, 5: pageFormat.getImageableY () + 72, 6: 72, 7: 72); 8: graphics2D.draw (obdélník); 9: návrat (PAGE_EXISTS); }

Z předchozího příkladu vidíme, že musíme ručně přeložit počátek obdélníku tak, aby se tiskl v horní části tisknutelné oblasti jako na obrázku 1. Pro zjednodušení kódu bychom mohli jednou přeložit souřadnice a použít (0, 0 ) jako počátek tisknutelné oblasti. Úpravou předchozího příkladu získáme:

1: public int print (Graphics graphics, PageFormat pageFormat, int pageIndex) {2: Graphics2D graphics2D = (Graphics2D) graphics; 3: graphics2D.translate (pageFormat.getImageableX (), pageFormat.getImageableY ()); 4: Rectangle2D.Double rectangle = nový Rectangle2D.Double (); 5: rectangle.setRect (72, 72, 72, 72); 6: graphics2D.draw (obdélník); 7: návrat (PAGE_EXISTS); 8:}

Za použití přeložit() metoda v řádku 3, můžeme přeložit souřadnice a nastavit náš počátek (0, 0) v horní části tisknutelné oblasti. Od tohoto okamžiku se náš kód zjednoduší.

PrinterGraphics rozhraní

The PrinterGraphics rozhraní se skládá z jedné metody:

Název metodyPopis
PrinterJob getPrinterJob ()Vrátí PrinterJob pro tento požadavek na vykreslení a je implementován Grafika třída

Třída papíru

Osm metod tvoří Papír třída:

Název metodyPopis
double getHeight ()Tato metoda vrací fyzickou výšku stránky v bodech (1 palec = 72 bodů). Například pokud tisknete na stránku velikosti dopisu, návratová hodnota bude 792 bodů nebo 11 palců.
double getImageableHeight ()Tato metoda vrací zobrazitelnou výšku stránky. Zobrazitelná výška je výška tiskové oblasti, na kterou můžete kreslit. Viz obrázek 1 pro grafické zobrazení zobrazitelné oblasti.
double getImageableWidth ()Tato metoda vrací zobrazitelnou šířku stránky (šířka tiskové oblasti, na kterou můžete kreslit). Viz obrázek 1 pro grafické zobrazení zobrazitelné oblasti.
double getImageableX ()Tato metoda vrací počátek x zobrazitelné oblasti. Protože neexistuje žádná podpora pro okraje, návratová hodnota představuje levý okraj.
double getImageableY ()Tato metoda vrátí počátek y zobrazitelné oblasti. Hodnota vrácená z této metody je ekvivalentní hornímu okraji.
dvojnásobná getWidth ()Tato metoda vrací fyzickou šířku stránky v bodech. Pokud tisknete na papír velikosti Letter, šířka je 8,5 palce nebo 612 bodů.
void setImageableArea (double x, double y, double width, double height)Tato metoda nastavuje zobrazitelnou oblast a určuje okraje na stránce. Ve skutečnosti API neposkytuje žádnou metodu pro výslovné nastavení okrajů; musíte je vypočítat sami.
void setSize (dvojitá šířka, dvojitá výška)Tato metoda nastavuje fyzickou velikost stránky. Chcete-li definovat list 8,5 x 11 palců, zadali byste 612 a 792 bodů. Výchozí velikost je DOPIS.

Než přejdeme k další části, nezapomeňte, že Papír třída definuje fyzikální vlastnosti stránky. The PageFormat třída představuje všechny vlastnosti stránky, jako je orientace stránky, velikost a typ papíru. Tato třída se vždy předává jako parametr do Tisknutelné rozhraní tisk() metoda. Použití Papír k získání zobrazitelného umístění oblasti, velikosti a orientace stránky spolu s transformační maticí.

Třída PageFormat

The PageFormat skládá se z 12 metod:

Název metodyPopis
double getHeight ()Tato metoda vrací fyzickou výšku stránky v bodech (1 palec = 72 bodů). Pokud vaše stránka měří 8,5 x 11 palců, bude návratová hodnota 792 bodů nebo 11 palců.
double getImageableHeight ()Tato metoda vrací zobrazitelnou výšku stránky, což je výška oblasti tisku, na kterou můžete kreslit. Viz obrázek 1 pro grafické zobrazení zobrazitelné oblasti.
double getImageableWidth ()Tato metoda vrací zobrazitelnou šířku stránky - šířku tiskové oblasti, na kterou můžete kreslit. Obrázek 1 ilustruje grafický pohled na zobrazitelnou oblast.
double getImageableX ()Tato metoda vrací počátek x zobrazitelné oblasti.
double getImageableY ()Tato metoda vrací počátek y zobrazitelné oblasti.
dvojnásobná getWidth ()Tato metoda vrací fyzickou šířku stránky v bodech. Pokud tisknete na papír velikosti Letter, šířka je 8,5 palce nebo 612 bodů.
double getHeight ()Tato metoda vrací fyzickou výšku stránky v bodech. Například papír velikosti Letter má výšku 11 palců nebo 792 bodů.
double [] getMatrix ()Tato metoda vrací transformační matici, která převádí uživatelský prostor do požadované orientace stránky. Návratová hodnota je ve formátu požadovaném AffineTransform konstruktor.
int getOrientation ()Tato metoda vrací orientaci stránky buď jako PORTRÉT nebo KRAJINA.
void setOrientation (int orientace)Tato metoda nastavuje orientaci stránky pomocí konstant PORTRÉT a KRAJINA.
Papír getPaper ()Tato metoda vrací Papír objekt spojený s formátem stránky. V předchozí části naleznete popis Papír třída.
void setPaper (papírový papír)Tato metoda nastavuje Papír objekt, který bude použit PageFormat třída. PageFormat k dokončení tohoto úkolu musí mít přístup k vlastnostem fyzické stránky.

Tím se uzavírá popis tříd stránek. Další třídou, kterou budeme studovat, je PrinterJob.

PrinterJob třída

The PrinterJob třída řídí proces tisku. Může jak vytvořit instanci, tak řídit tiskovou úlohu. Níže naleznete definici třídy:

Název metodyPopis
abstract void cancel ()Tato metoda zruší aktuální tiskovou úlohu. Storno můžete potvrdit pomocí isCancel () metoda.
abstraktní boolean isCancelled ()Tato metoda vrátí hodnotu true, pokud je úloha zrušena.
PageFormat defaultPage ()Tato metoda vrací výchozí formát stránky pro PrinterJob.
abstraktní PageFormat defaultPage (stránka PageFormat)Tato metoda klonuje PageFormat předán v parametrech a upraví klon tak, aby vytvořil výchozí PageFormat.
abstract int getCopies ()Tato metoda vrací počet kopií, které tisková úloha vytiskne.
abstract void setCopies (int copy)Tato metoda nastavuje počet kopií, které úloha vytiskne. Všimněte si, že pokud zobrazíte dialogové okno pro tisk, uživatelé mohou změnit počet kopií (viz pageDialog metoda).
abstraktní řetězec getJobName ()Tato metoda vrací název úlohy.
statická PrinterJob getPrinterJob ()Tato metoda vytvoří a vrátí nový PrinterJob.
abstraktní řetězec getUserName ()Tato metoda vrací uživatelské jméno spojené s tiskovou úlohou.
abstraktní stránka PageFormat pageDialog (stránka PageFormat)Tato metoda zobrazí dialogové okno, které uživateli umožňuje upravit PageFormat. The PageFormat, předáno v parametrech, nastaví pole dialogu. Pokud uživatel zruší dialog, pak originál PageFormat bude vrácena. Ale pokud uživatel přijme parametry, pak nový PageFormat bude vytvořen a vrácen. Protože nebude zobrazovat stejné parametry ve všech operačních systémech, musíte být při používání pageDialog.
abstract void setPageable (stránkovací dokument)Tato metoda dotazuje dokument, aby získala celkový počet stránek. The Stránkovací vrátí také PageFormat a Tisknutelné objekt pro každou stránku. Viz definice Stránkovací rozhraní pro více informací.
set abstraktních prázdninTisknutelný (malíř pro tisk)Tato metoda nastavuje Malíř objekt, který vykreslí stránky k tisku. A Malíř objekt je objekt, který implementuje Tisknutelné třída a její tisk() metoda.
abstract void setPrintable (malíř pro tisk, formát PageFormat)Tato metoda provádí stejné úkoly jako set abstraktních prázdninTisknutelný (malíř pro tisk)kromě toho, že dodáváte PageFormat že Malíř použije. Jak je uvedeno v definici Tisknutelné rozhraní, tisk() metoda prochází a PageFormat objekt jako první parametr.
abstraktní neplatný tisk ()Tato metoda vytiskne dokument. Ve skutečnosti to volá tisk() metoda Malíř dříve přiřazené k této tiskové úloze.
abstract void setJobName (String jobName)Tato metoda nastavuje název tiskové úlohy.
abstraktní boolean printDialog ()Tato metoda zobrazuje dialogové okno tisku, které uživateli umožňuje měnit parametry tisku. Výsledek této interakce nebude vrácen do vašeho programu. Místo toho bude předán do peer operačního systému.
abstraktní PageFormat validatePage (stránka PageFormat)Tato metoda ověří PageFormat předáno v parametrech. Pokud tiskárna nemůže použít PageFormat který jste dodali, bude vrácen nový, který odpovídá tiskárně.

Kniha třída

Sedm metod tvoří Rezervovat třída:

>

Název metodyPopis
void append (Malíř pro tisk, stránka PageFormat)Tato metoda připojí stránku k Rezervovat. The malíř a PageFormat pro tuto stránku jsou předávány v parametrech.
void append (Malíř pro tisk, stránka PageFormat, int numPages)Tato metoda provádí stejné úkoly jako void append (Malíř pro tisk, stránka PageFormat)kromě toho, že určíte počet stránek.
int getNumberOfPages ()Tato metoda vrací počet stránek aktuálně v Rezervovat.
PageFormat getPageFormat (int pageIndex)Tato metoda vrací PageFormat objekt pro danou stránku.
Tisknutelný getPrintable (int pageIndex)Tato metoda vrací malíř pro danou stránku.
void setPage (int pageIndex, malíř pro tisk, stránka PageFormat)Tato metoda nastavuje malíř a PageFormat pro danou stránku již v knize.

Recept na tisk

Recept na tisk je velmi jednoduchý. Nejprve vytvořte a PrinterJob objekt:

PrinterJob printJob = PrinterJob.getPrinterJob ();

Dále pomocí setPrintable () metoda PrinterJob, přiřadit Malíř namítat proti PrinterJob. Všimněte si, že a Malíř objekt je ten, který implementuje Tisknutelné rozhraní.

printJob.setPrintable (malíř);

Nebo můžete nastavit PageFormat spolu s Malíř :

printJob.setPrintable (Painter, pageFormat);

Nakonec Malíř objekt musí implementovat tisk() metoda:

public int print (Graphics g, PageFormat pageFormat, int page)

Zde je prvním parametrem grafický popisovač, který použijete k vykreslení stránky, pageFormat je formát, který bude použit pro aktuální stránku, a posledním parametrem je číslo stránky, které musí být vykresleno.

To je vše - pro jednoduchý tisk to znamená.

Úvod do rámce

Rámec tisku, který v této sérii postavíme, bude zcela nezávislý na tiskovém rozhraní Java Java. Umožní větší flexibilitu při vytváření různých výstupů.Jeho struktura vám umožní vytvářet dokumenty, stránky a tisknout objekty. Při přidávání stránek do dokumentu budete moci na stránku přidat tiskové objekty. Pomocí této struktury budete moci snadno implementovat funkce exportu do souborů PDF nebo HTML nebo tisknout přímo na tiskárnu pomocí tiskového API. Hlavním cílem tohoto rámce je však zjednodušit vytváření tištěných dokumentů. Při tisku pomocí tiskového rozhraní API získáte pouze grafické plátno, na které můžete kreslit. Neřeší pojmy odstavců, obrázků, výkresů, grafiky, tabulek nebo běžících záhlaví a zápatí. Protože musíte vypočítat počátek (x, y), šířku a výšku tisknutelné oblasti, nastavení okrajů je práce. Náš tiskový rámec bude řešit všechny tyto slabosti.

Závěr

V této první části jsme pokryli hodně půdy. Podívali jsme se na jednotky měření, strukturu stránky, dva modely vykreslování (Stránkovací a Tisknutelné), a Knihy, a dospěli jsme k závěru s podrobným vysvětlením tiskového API. Příští měsíc se zaměříme především na kód, protože vše uvedeme do praxe. Podíváme se také na problémy, které vznikají při tisku na více platforem. S výhledem do části 3 podrobně vysvětlím návrh a implementaci rámce.

Jean-Pierre Dube je nezávislý konzultant v oblasti Java. Infocom založil v roce 1988. Od té doby vyvinul Infocom zakázkové aplikace v oblastech, jako je výroba, správa dokumentů a rozsáhlá správa elektrického vedení. Jean-Pierre má rozsáhlé zkušenosti s programováním v jazycích C, Visual Basic a Java; druhý je nyní primárním jazykem pro všechny nové projekty. Tuto sérii věnuje své matce, která zemřela při psaní tohoto článku.

Další informace o tomto tématu

  • „Tisk v Javě,“ Jean-Pierre Dubé (JavaWorld)
  • Část 1: Seznámení s modelem tisku Java (20. října 2000)
  • Část 2: Tisk první stránky a vykreslení složitých dokumentů (1. prosince 2000)
  • Část 3: Jean-Pierre Dubé představuje tiskový rámec, který funguje na rozhraní Java Print API (5. ledna 2001)
  • Část 4: Kódujte rámec tisku
  • (2. února 2001)
  • Část 5: Objevte třídy podpory rámce tisku
  • (2. března 2001)
  • Najdete spoustu knih pokrývajících Java AWT, ale žádná nebude pokrývat toto téma v rozsahu této knihy. Pokud píšete GUI, musíte mít tuto knihu vedle svého počítače: Graphic Java 2, Mastering The JFCAWT, díl 1, David M. Geary (Prentice Hall, 1998)

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

  • Tato kniha byla užitečná, když vyšla Java 1.1, a byla první, kdo hovořil o tisku v Javě: Migrace z prostředí Java 1.0 na prostředí Java 1.1, Daniel I. Joshi a Pavel A. Vorobiev (Ventana Communications Group, 1997)

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

  • Pravděpodobně nejlepší kniha o prostředí Java 2D, tato kniha pokrývá všechny aspekty 2D API a také poskytuje Grafika rámec pro pokročilé 2D kompozice: Grafika Java 2D API, Vincent J. Hardy (Prentice Hall, 1999)

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

  • Skvělý úvod do Java 2D API „Začínáme s Java 2D“, Bill Day (JavaWorld, Července 1998)

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

Tento příběh „Tisk v Javě, část 1“ byl původně publikován společností JavaWorld.