4

プリンターが必要な方法でJavaで動作するようになりましたが、解決する必要がある最後の問題が1つあります。印刷すると、フォントの幅がかなり引き伸ばされ、鮮明で鮮明ではなくなります。

これが私のコードで、紙への実際の描画です。

    FontMetrics metrics = graphics.getFontMetrics(font);
    int lineHeight = metrics.getHeight();

    arrangePage(graphics, pageFormat, lineHeight);

    if (page > pageBreaks.length){
        return NO_SUCH_PAGE;
    }

    Graphics2D g = (Graphics2D) graphics;

    g.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
    g.setFont(font);

    int y = 0;
    int begin = 0;

    if (page == 0){
        begin = 0;
    }else begin = pageBreaks[page-1];

    int end = 0;

    if (page == pageBreaks.length){
        end = lines.length;
    }else end = pageBreaks[page];

    for (int line = begin; line < end; line++){
        y += lineHeight;
        g.drawString(lines[line], 0, y);
    }

    string = deepCopy;

    return PAGE_EXISTS;

ストレッチをなくすにはどうすればいいですか?これは次のチュートリアルに基づいていることに注意してください: http://docs.oracle.com/javase/tutorial/2d/printing/set.html

アドバイスやヘルプをいただければ幸いです。

4

2 に答える 2

2

デフォルトの DPI は通常の 72 DPI (私は信じています) ですが、印刷された紙ではかなりひどいものです。印刷 API にプロンプ​​トを出して、より良い DPI のプリンターを見つけようとする必要があります。

基本的に、印刷サービス API を使用する必要があります。

次のようなものを試してください...

public class PrintTest01 {

  public static void main(String[] args) {

    PrinterResolution pr = new PrinterResolution(300, 300, PrinterResolution.DPI);

    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
    aset.add(MediaSizeName.ISO_A4);
    aset.add(pr);
    aset.add(OrientationRequested.PORTRAIT);

    PrinterJob pj = PrinterJob.getPrinterJob();
    pj.setPrintable(new Page());
    try {
      pj.print(aset);
    } catch (PrinterException ex) {
      ex.printStackTrace();
    }

  }

  public static class Page implements Printable {

    @Override
    public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException {
      if (pageIndex > 0) {
        return NO_SUCH_PAGE;
      }

      Graphics2D g2d = (Graphics2D) g;
      g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());

      g.setFont(new Font("Arial", Font.PLAIN, 128));
      FontMetrics fm = g.getFontMetrics();
      int x = (int)(pageFormat.getWidth() - fm.stringWidth("A")) / 2;
      int y = (int)((pageFormat.getHeight() - fm.getHeight()) / 2) + fm.getAscent();

      g2d.drawString("A", x, y);

      return PAGE_EXISTS;
    }
  }
}

印刷サービスと属性の操作が役立つかもしれません...

警告する必要があります。これは、PrintRequestAttributeSet. 印刷ダイアログに追加して、それが何をしているかを確認することもできますが、それは私が今はなくても生きていける別のレベルの複雑さです;)

于 2013-01-16T06:32:03.843 に答える
0

上記はうまくいきました!それを使用して印刷ダイアログを開くには、次を使用します。

    PrinterJob job = PrinterJob.getPrinterJob();
    TextDocumentPrinter document = new TextDocumentPrinter();

    PrinterResolution pr = new PrinterResolution(300, 300, PrinterResolution.DPI);

    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
    aset.add(MediaSizeName.ISO_A4);
    aset.add(pr);
    aset.add(OrientationRequested.PORTRAIT);

    job.setPrintable(document);

    boolean doPrint = false;

    if (showDialog){
        doPrint = job.printDialog(aset);
    }else doPrint = true;

    if (doPrint){
        try{
            job.print();
        }catch(PrinterException e){
            e.printStackTrace();
        }
    }

aset変数にはすべての新しいデフォルト値が含まれており、それをprintDialogにプラグインすることで、それらはprintJobに入力され、その結果、紙に表示されます。ダイアログでも変更できます。

于 2013-01-16T21:37:29.120 に答える