2

パラメータを取得し、データベースにクエリを実行し、請求書の PDF を生成し、デフォルトのプリンタにサイレントに送信するだけの JSP ページがあります。itext ライブラリを使用します。

請求書は、連続紙を使用するドットマトリックス プリンターで印刷する必要があります。

請求書の各ページ サイズは、a5 横サイズです。

ページサイズをa5として選択すると、コードはここに見られるようにPDFを生成します

a5ポートレート

印刷すると、1ページが印刷され、別のページは空白のままになります。ユーザーは紙を手動でスクロールして戻す必要があります。

ページサイズをa5ランドスケープ(a5.rotate())として選択すると、コードはここに見られるようにPDFを生成します。これはより優れています。

a5風景

しかし、これが紙に印刷されると、プリンターにa4用紙トレイがあることを処理して、ページを垂直に印刷し始めます。

私には、プリンタを連続紙のドットマトリックス プリンタとして定義する必要があるように思えます。

私が使用しているコードは次のとおりです。

    Document document = new Document(PageSize.A5,0,0,0,0);
try {   
 PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
 writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);
document.open();


StringBuffer javascript = new StringBuffer();
 javascript.append("this.print({bUI: false, bSilent: true, bShrinkToFit: true});");
 PdfAction pdfAction= PdfAction.javaScript(javascript.toString(), writer);
 writer.addJavaScript(pdfAction);
 writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);
 PdfPTable table = new PdfPTable(3); // 3 columns.
 table.setWidthPercentage(100);

 PdfPCell cell1 = new PdfPCell(new Paragraph(""));
 PdfPCell cell2 = new PdfPCell(new Paragraph(""));
 PdfPCell cell3 = new PdfPCell(new Paragraph(MakbuzNo,FontFactory.getFont(FontFactory.COURIER,9)));
 cell3.setLeading(16f, 0f);
 cell1.setBorder(Rectangle.NO_BORDER);
 cell2.setBorder(Rectangle.NO_BORDER);
 cell3.setBorder(Rectangle.NO_BORDER);
 
cell3.setHorizontalAlignment(Element.ALIGN_RIGHT);
table.addCell(cell1);
table.addCell(cell2);    
table.addCell(cell3);    

cell1 = new PdfPCell(new Paragraph(""));
cell2 = new PdfPCell(new Paragraph(""));
cell3 = new PdfPCell(new Paragraph(Duzenleyen,FontFactory.getFont(FontFactory.COURIER,9)));
cell3.setLeading(16f, 0f);
cell3.setHorizontalAlignment(Element.ALIGN_RIGHT);

cell1.setBorder(Rectangle.NO_BORDER);
cell2.setBorder(Rectangle.NO_BORDER);
cell3.setBorder(Rectangle.NO_BORDER);
table.addCell(cell1);
table.addCell(cell2);    
table.addCell(cell3);    


cell1 = new PdfPCell(new Paragraph(MSISDN,FontFactory.getFont(FontFactory.COURIER,9)));
cell2 = new PdfPCell(new Paragraph(""));
cell3 = new PdfPCell(new Paragraph(DuzenlemeSaati,FontFactory.getFont(FontFactory.COURIER,9)));
cell1.setLeading(16f, 0f);
cell3.setLeading(16f, 0f);
cell1.setHorizontalAlignment(Element.ALIGN_LEFT);
cell3.setHorizontalAlignment(Element.ALIGN_RIGHT);

cell1.setBorder(Rectangle.NO_BORDER);
cell2.setBorder(Rectangle.NO_BORDER);
cell3.setBorder(Rectangle.NO_BORDER);
table.addCell(cell1);
table.addCell(cell2);    
table.addCell(cell3);   

cell1 = new PdfPCell(new Paragraph(""));
cell2 = new PdfPCell(new Paragraph(""));
cell3 = new PdfPCell(new Paragraph(DuzenlemeTarihi,FontFactory.getFont(FontFactory.COURIER,9)));
cell3.setLeading(16f, 0f);
cell3.setHorizontalAlignment(Element.ALIGN_RIGHT);

cell1.setBorder(Rectangle.NO_BORDER);
cell2.setBorder(Rectangle.NO_BORDER);
cell3.setBorder(Rectangle.NO_BORDER);
table.addCell(cell1);
table.addCell(cell2);    
table.addCell(cell3);

cell1 = new PdfPCell(new Paragraph(" "));
cell2 = new PdfPCell(new Paragraph(" "));
cell3 = new PdfPCell(new Paragraph(" "));
cell1.setLeading(45f, 0f);
cell1.setBorder(Rectangle.NO_BORDER);
cell2.setBorder(Rectangle.NO_BORDER);
cell3.setBorder(Rectangle.NO_BORDER);

table.addCell(cell1);
table.addCell(cell2);    
table.addCell(cell3);

cell1 = new PdfPCell(new Paragraph(izahat,FontFactory.getFont(FontFactory.COURIER,9)));
cell1.setHorizontalAlignment(Element.ALIGN_LEFT);
cell1.setColspan(3);
cell1.setBorder(Rectangle.NO_BORDER);  
table.addCell(cell1);

cell1 = new PdfPCell(new Paragraph(" "));
cell2 = new PdfPCell(new Paragraph(" "));
cell3 = new PdfPCell(new Paragraph(" "));
cell1.setLeading(75f, 0f);
cell1.setBorder(Rectangle.NO_BORDER);
cell2.setBorder(Rectangle.NO_BORDER);
cell3.setBorder(Rectangle.NO_BORDER);

table.addCell(cell1);
table.addCell(cell2);    
table.addCell(cell3);

cell1 = new PdfPCell(new Paragraph(kopyayazi,FontFactory.getFont(FontFactory.COURIER,9)));
cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
cell1.setColspan(3);
cell1.setBorder(Rectangle.NO_BORDER);  
table.addCell(cell1);

cell1 = new PdfPCell(new Paragraph(TutarYazi,FontFactory.getFont(FontFactory.COURIER,9)));
cell1.setHorizontalAlignment(Element.ALIGN_LEFT);
cell1.setColspan(2);
cell3 = new PdfPCell(new Paragraph(ToplamTutar,FontFactory.getFont(FontFactory.COURIER,9)));
cell3.setHorizontalAlignment(Element.ALIGN_RIGHT);
cell1.setLeading(16f, 0f);
cell3.setLeading(16f, 0f);
cell1.setBorder(Rectangle.NO_BORDER);
cell3.setBorder(Rectangle.NO_BORDER);

table.addCell(cell1);
table.addCell(cell3);
document.add(table);
document.newPage();
    } catch (DocumentException de) {
        de.printStackTrace();
        System.err.println("document: " + de.getMessage());
    }
    
    document.close();

では、連続紙でドットマトリックスプリンターを使用し、ページ上の文字が既に印刷されているときに紙スクローラーを停止する方法は?

4

3 に答える 3

1

地獄へようこそ :-) プロセスに小さな爪を持つすべてのデーモンを次に示します。

  • PDFファイル自体に向きがあります
  • PDF ビューアー/プリンターは、ページに合わせてページを回転させようとする場合があります。
  • プリンタードライバーもそうかもしれません
  • レーザー プリンターを使用している場合は、ページも回転する可能性があります。

最も「簡単な」解決策は、PDF を BufferedImage でレンダリングし、それをピクセル イメージ (PNG など) として保存して印刷することです。これにより、方向が希望どおりであることを確認できます。

プリンタ ドライバの設定も確認してください。一部のドライバは、ファイルの印刷後に「フォーム フィード」文字を送信し、a5 ページ全体を埋めると空白のページになります。

于 2011-11-28T10:48:40.040 に答える
0

長い調査の結果、追加のインストールなしでクライアントのドットマトリックス プリンターで印刷する方法を見つけることができませんでした。

最も効率的な方法は、署名済みのアプレットを用意することです。クライアント側で Java のインストールが必要です。

于 2012-01-16T12:40:15.253 に答える
0

Jasperレポートの印刷(連続紙を使用)で同様の問題を経験しました。コードを何日もいじった後、うまくいくと思う解決策を見つけました。

出力としてPDFファイルを生成し、AdobeReader exeに印刷を実行させるだけでよいと思います。使用できます

AcroRd32.exe /N /T PdfFile プリンター名

これを達成するためのパラメーター。

于 2011-11-28T10:57:34.113 に答える