Bisakah saya memberi tahu iText cara memotong teks agar pas di dalam sel

Saat saya memanggil setFixedHeight() pada PdfPCell, dan menambahkan lebih banyak teks daripada yang sesuai dengan ketinggian yang diberikan, iText sepertinya mencetak awalan dari string yang sesuai.

Bisakah saya mengontrol algoritma kliping ini? Misalnya:

  1. Cetak akhiran string, bukan awalan.

  2. Tandai substring dari string sebagai tidak akan dihapus. Ini dengan referensi catatan kaki. Jika saya menambahkan teks yang mengatakan "Halo Dunia [1]", [1] adalah referensi ke catatan kaki dan tidak boleh dihapus. Tidak apa-apa untuk menghapus karakter lain dari string, seperti "Dunia".

  3. Ketika ada beberapa kata dalam string, iText sepertinya menghilangkan kata yang tidak sesuai, sementara saya ingin kata itu dicetak sebagian. Artinya, jika stringnya adalah "Halo Dunia", dan sel hanya memiliki ruang untuk "Halo Wo...", saya ingin string tersebut dicetak, bukan hanya "Halo", seperti yang dicetak iText.

  4. Daripada mencetak karakter secara keseluruhan, cetaklah sebagian saja. Bayangkan mencetak teks ke PNG dan memotong bagian atas dan/atau bawah PNG agar sesuai dengan ruang yang tersedia. Misalnya, perhatikan bahwa baris atas dan bawah terpotong sebagian di sini:

masukkan deskripsi gambar di sini

Apakah semua hal ini mungkin terjadi? Apakah iText memberi saya kendali atas bagaimana teks dipotong? Terima kasih.

Ini dengan mengacu pada iText 2.1.6.


person Kartick Vaddadi    schedule 28.02.2014    source sumber
comment
Ini dapat dilakukan dengan menggunakan acara sel. Dengan kata lain: buat sel kosong dengan tinggi tetap dan tambahkan konten dalam metode layout() acara sel. Jika Anda bertanya-tanya mengapa saya enggan memberi Anda contoh kode: nama saya Lowagie (yang Anda rujuk dalam kode Anda) dan saya ingin orang-orang berhenti menggunakan versi iText yang sudah usang. Lihat itextpdf.com/salesfaq   -  person Bruno Lowagie    schedule 28.02.2014
comment
Terima kasih, Bruno. Saya tahu siapa Anda :) Saya akan mencoba trik layout().   -  person Kartick Vaddadi    schedule 28.02.2014


Jawaban (2)


Saya telah menulis bukti konsep, ClipCenterCellContent, di mana kami mencoba memasukkan teks "D2 is a cell with more content than we can fit into the cell." ke dalam a sel yang terlalu kecil.

Sama seperti di pertanyaan Anda yang lain ( iText -- Bagaimana apakah saya mendapatkan dimensi teks yang dirender? ), kami menambahkan konten menggunakan acara sel, tetapi sekarang kami menambahkannya dua kali: sekali dalam mode simulasi (untuk mengetahui berapa banyak ruang yang dibutuhkan secara vertikal) dan sekali secara nyata (menggunakan offset).

Ini menambahkan konten dalam mode simulasi (kami menggunakan lebar sel dan tinggi sembarang):

PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS];
ColumnText ct = new ColumnText(canvas);
ct.setSimpleColumn(new Rectangle(0, 0, position.getWidth(), -1000));
ct.addElement(content);
ct.go(true);
float spaceneeded = 0 - ct.getYLine();
System.out.println(String.format("The content requires %s pt whereas the height is %s pt.", spaceneeded, position.getHeight()));

Kita sekarang mengetahui ketinggian yang dibutuhkan dan kita dapat menambahkan konten secara nyata menggunakan offset:

float offset = (position.getHeight() - spaceneeded) / 2;
System.out.println(String.format("The difference is %s pt; we'll need an offset of %s pt.", -2f * offset, offset));
PdfTemplate tmp = canvas.createTemplate(position.getWidth(), position.getHeight());
ct = new ColumnText(tmp);
ct.setSimpleColumn(0, offset, position.getWidth(), offset + spaceneeded);
ct.addElement(content);
ct.go();
canvas.addTemplate(tmp, position.getLeft(), position.getBottom());

Dalam hal ini, saya menggunakan PdfTemplate untuk mengklip konten.

Saya juga punya jawaban atas pertanyaan Anda yang lain, tapi saya tidak punya waktu untuk menjawabnya sekarang.

person Bruno Lowagie    schedule 01.03.2014

Untuk kliping kotak teks lurus, saya mengadaptasi kode C# yang diberikan di sini

http://itextsharp.10939.n7.nabble.com/Limiting-Text-Width-using-PdfContentByte-td2481.html

ke kode Java di bawah ini. Area kliping berada di luar persegi panjang ini, jadi Anda masih bisa menggambar persegi panjang dengan koordinat yang sama persis.

cb.saveState(); 
cb.rectangle(left,top,width,height); 
cb.clip(); 
cb.newPath(); 
// perform clipped output here 
cb.restoreState(); 

Saya menggunakan try/finally untuk memastikan recoveryState() dipanggil.

person englebart    schedule 12.01.2016
comment
Terima kasih - ini adalah solusi terbaik. - person David Thielen; 21.09.2016