ฉันสามารถบอก iText ว่าจะคลิปข้อความให้พอดีกับเซลล์ได้อย่างไร

เมื่อฉันเรียก setFixedHeight() บน PdfPCell และเพิ่มข้อความมากกว่าความสูงที่กำหนด ดูเหมือนว่า iText จะพิมพ์คำนำหน้าของสตริงที่พอดี

ฉันสามารถควบคุมอัลกอริธึมการคลิปนี้ได้หรือไม่? ตัวอย่างเช่น:

  1. พิมพ์ส่วนต่อท้ายของสตริงแทนที่จะเป็นคำนำหน้า

  2. ทำเครื่องหมายสตริงย่อยของสตริงว่าไม่ต้องลบออก นี่คือการอ้างอิงเชิงอรรถ ถ้าฉันเพิ่มข้อความว่า "Hello World [1]" [1] จะเป็นการอ้างอิงถึงเชิงอรรถและไม่ควรลบออก คุณสามารถลบอักขระอื่นๆ ของสตริง เช่น "World" ได้

  3. เมื่อมีหลายคำในสตริง ดูเหมือนว่า iText จะกำจัดคำที่ไม่พอดีออกไป ในขณะที่ฉันต้องการให้พิมพ์บางส่วน นั่นคือ หากสตริงคือ "Hello World" และเซลล์มีพื้นที่สำหรับ "Hello Wo..." เท่านั้น ฉันต้องการให้พิมพ์ข้อความนั้น แทนที่จะพิมพ์เพียง "Hello" ขณะที่ iText พิมพ์

  4. แทนที่จะพิมพ์อักขระทั้งหมด ให้พิมพ์เพียงบางส่วนเท่านั้น ลองนึกภาพการพิมพ์ข้อความเป็น PNG และตัดส่วนบนและ/หรือส่วนล่างของ PNG ออกเพื่อให้พอดีกับพื้นที่ว่าง ตัวอย่างเช่น สังเกตว่าบรรทัดบนและบรรทัดล่างถูกตัดบางส่วนที่นี่:

ป้อนคำอธิบายรูปภาพที่นี่

สิ่งเหล่านี้เป็นไปได้หรือไม่? iText ให้ฉันควบคุมวิธีการตัดข้อความหรือไม่ ขอบคุณ.

นี่คือการอ้างอิงถึง iText 2.1.6


person Kartick Vaddadi    schedule 28.02.2014    source แหล่งที่มา
comment
ซึ่งสามารถทำได้โดยใช้เหตุการณ์ของเซลล์ กล่าวอีกนัยหนึ่ง: สร้างเซลล์ว่างที่มีความสูงคงที่และเพิ่มเนื้อหาในวิธี layout() ของเหตุการณ์เซลล์ ในกรณีที่คุณสงสัยว่าเหตุใดฉันจึงไม่เต็มใจที่จะให้ตัวอย่างโค้ดแก่คุณ ฉันชื่อ Lowagie (ชื่อที่คุณอ้างถึงในโค้ดของคุณ) และฉันต้องการให้ผู้คนหยุดใช้ iText เวอร์ชันล้าสมัย ดู itextpdf.com/salesfaq   -  person Bruno Lowagie    schedule 28.02.2014
comment
ขอบคุณบรูโน ฉันรู้ว่าคุณเป็นใคร :) ฉันจะลองใช้เคล็ดลับlayout()   -  person Kartick Vaddadi    schedule 28.02.2014


คำตอบ (2)


ฉันได้เขียนข้อพิสูจน์แนวคิด ClipCenterCellContent โดยที่เราพยายามปรับข้อความ "D2 is a cell with more content than we can fit into the cell." ให้พอดีกับ เซลล์ที่มีขนาดเล็กเกินไป

เช่นเดียวกับในคำถามอื่น ๆ ของคุณ ( iText -- อย่างไร ฉันจะได้รับมิติการแสดงผลของข้อความหรือไม่ ) เราเพิ่มเนื้อหาโดยใช้เหตุการณ์เซลล์ แต่ตอนนี้เราเพิ่มมันสองครั้ง: ครั้งแรกในโหมดจำลอง (เพื่อค้นหาว่าต้องใช้พื้นที่เท่าใดในแนวตั้ง) และหนึ่งครั้งจริง (ใช้ออฟเซ็ต)

สิ่งนี้จะเพิ่มเนื้อหาในโหมดจำลอง (เราใช้ความกว้างของเซลล์และความสูงที่กำหนดเอง):

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()));

ตอนนี้เรารู้ความสูงที่ต้องการแล้ว และเราสามารถเพิ่มเนื้อหาได้จริงโดยใช้ออฟเซ็ต:

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());

ในกรณีนี้ ฉันใช้ PdfTemplate เพื่อตัดเนื้อหา

ฉันยังมีคำตอบสำหรับคำถามอื่นๆ ของคุณ แต่ตอนนี้ฉันไม่มีเวลาตอบ

person Bruno Lowagie    schedule 01.03.2014

สำหรับการตัดกล่องข้อความแบบตรง ฉันได้ปรับโค้ด C# ที่ให้ไว้ที่นี่

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

ไปที่โค้ด Java ด้านล่าง พื้นที่ที่ตัดจะสิ้นสุดอยู่นอกสี่เหลี่ยมนี้ คุณจึงยังสามารถวาดรูปสี่เหลี่ยมบนพิกัดเดียวกันได้

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

ฉันใช้ try/ในที่สุดเพื่อให้แน่ใจว่ามีการเรียก RestoreState()

person englebart    schedule 12.01.2016
comment
ขอบคุณ - นี่คือทางออกที่ดีที่สุด - person David Thielen; 21.09.2016