J'essaie d'imprimer un JPanel avec des graphiques peints dessus (overriding paintComponent). Les graphiques sont si gros qu'ils ne tiennent pas sur une seule page et, par conséquent, je le laisse s'étendre sur plusieurs pages. Mon problème réside dans le fait que si je laisse l'utilisateur choisir le PageFormat/Type de papier en appelant:Comment puis-je obtenir les marges du papier lorsque j'utilise l'impression java?
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
PageFormat pf = printJob.pageDialog(aset);
printJob.setPrintable(canvas, pf);
Quand j'écris ma méthode d'impression() (mise en œuvre imprimable) dans ma classe JPanel Je ne peux pas semblent avoir l'emprise des marges? J'utilise graphics.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
pour le faire commencer à dessiner dans le coin de topleft correct (0; 0) et il prend en compte les marges (c.-à-d. En commençant plus à (80; 100) ou plus). Mais ensuite, il imprime sur la marge inférieure et droite que je ne veux pas faire car cela annule les souhaits de l'utilisateur.
Voici le code de ma méthode d'impression() comme référence, ce qui fonctionne très bien quand vous ne laissez pas l'utilisateur de définir le papier (en utilisant la valeur par défaut à la place):
Rectangle[] pageBreaks;
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
//Calculate how many pages our print will be
if(pageBreaks == null){
double pageWidth = pageFormat.getPaper().getWidth();
double pageHeight = pageFormat.getPaper().getHeight();
//Find out how many pages we need
int numberOfPagesHigh = (int) Math.ceil(size.getHeight()/pageHeight);
int numberOfPagesWide = (int) Math.ceil(size.getWidth()/pageWidth);
pageBreaks = new Rectangle[numberOfPagesHigh*numberOfPagesWide];
double x = 0;
double y = 0;
int curXPage = 0;
//Calculate what we will print on each page
for (int i = 0; i < pageBreaks.length; i++){
double xStart = x;
double yStart = y;
x += pageWidth;
pageBreaks[i] = new Rectangle((int)xStart, (int)yStart, (int)pageWidth, (int)pageHeight);
curXPage++;
if (curXPage > numberOfPagesWide){
curXPage = 0;
x = 0;
y += pageHeight;
}
}
}
if (pageIndex < pageBreaks.length){
//Cast graphics to Graphics2D for richer API
Graphics2D g2d = (Graphics2D) graphics;
//Translate into position of the paper
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
//Setup our current page
Rectangle rect = pageBreaks[pageIndex];
g2d.translate(-rect.x, -rect.y);
g2d.setClip(rect.x, rect.y, rect.width, rect.height);
//Paint the component on the graphics object
Color oldBG = this.getBackground();
this.setBackground(Color.white);
util.PrintUtilities.disableDoubleBuffering(this);
this.paintComponent(g2d);
util.PrintUtilities.enableDoubleBuffering(this);
this.setBackground(oldBG);
//Return
return PAGE_EXISTS;
}
else {
return NO_SUCH_PAGE;
}
}