Я хочу вычислить ограничивающую рамку для каждого символа, который я рисую в PDF, для набора разных шрифтов и размеров. Кажется, он работает по-разному для разных шрифтов, например, arial mt vs elephant normal.
Например, я использовал знак -, чтобы почувствовать это, в Arial нижний левый угол - у 65 440, у слона - у 7 165, но слон тянется выше, и я не могу найти, к чему приводит это движение. с.
Большинство шрифтов работают больше как Arial, где верх шрифта достигает высоты / 2, но это не работает для шрифта слона.
Какие факторы необходимо включить для точного расчета ограничительной рамки?
package com.nexiaem.nemocr.generatepdf;
import java.awt.Color;
import java.awt.geom.GeneralPath;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
import org.apache.pdfbox.util.Vector;
/**
*
* @author bjames
*/
public class DrawBoundngBox {
public static void main(String[] args){
try{
PDPage thisPage = new PDPage(new PDRectangle(100, 40));
PDDocument document = new PDDocument();
document.addPage(thisPage);
//PDTrueTypeFont font = PDTrueTypeFont.loadTTF(document, new File("C:\\windows\\fonts\\elephnt.ttf"));
PDTrueTypeFont font = PDTrueTypeFont.loadTTF(document, new File("C:\\windows\\fonts\\arial.ttf"));
PDPageContentStream contentStream = new PDPageContentStream(document, thisPage);
int thisSize = 10;
float currentX = 0;
float width = 0;
String charactersToWrite = "aj";
char[] characters = charactersToWrite.toCharArray();
for(char thisChar: characters){
String thisCharString = Character.toString(thisChar);
width = (font.getWidthFromFont((int)thisChar) / 1000.0f) * thisSize;
GeneralPath charPath = font.getPath((int)thisChar);
Rectangle2D charRect = charPath.getBounds2D();
float charMinX = thisSize * (float)charRect.getMinX() / 1000.0f;
float charMaxX = thisSize * (float)charRect.getMaxX() / 1000.0f;
float charMinY = thisSize * (float)charRect.getMinY() / 1000.0f;
float charX = thisSize * (float)charRect.getX() / 1000.0f;
float charY = thisSize * (float)charRect.getY() / 1000.0f;
Vector displacement = font.getDisplacement((int)thisChar);
float charWidth = thisSize * (float)charRect.getWidth()/ 1000.0f;
width = charMaxX - charMinX;
float height = ((float)charRect.getHeight()/ 1000.0f) * thisSize;
contentStream.setStrokingColor(Color.red);
contentStream.moveTo(currentX + charMinX/2, 10 + charMinY/2);
contentStream.lineTo(currentX + charMinX/2, 10 + charMinY/2 + height/2);
contentStream.lineTo(currentX + charMinX/2 + width/2, 10 + charMinY/2 + height/2);
contentStream.lineTo(currentX + charMinX/2 + width/2, 10 + charMinY/2);
contentStream.lineTo(currentX + charMinX/2, 10 + charMinY/2);
contentStream.stroke();
contentStream.setStrokingColor(Color.green);
contentStream.moveTo(currentX + charX, 10 + charY);
contentStream.lineTo(currentX + charX, 10 + charY + height);
contentStream.lineTo(currentX + charX + width, 10 + charY + height);
contentStream.lineTo(currentX + charX + width, 10 + charY);
contentStream.lineTo(currentX + charX, 10 + charY);
contentStream.stroke();
contentStream.setStrokingColor(Color.yellow);
contentStream.moveTo(currentX, 10);
contentStream.lineTo(currentX, 10 + height);
contentStream.lineTo(currentX + width, 10 + height);
contentStream.lineTo(currentX + width, 10);
contentStream.lineTo(currentX, 10);
contentStream.stroke();
contentStream.beginText();
contentStream.setFont(font, thisSize);
contentStream.newLineAtOffset(currentX, 10);
currentX = currentX + 30;
contentStream.showText(thisCharString);
contentStream.endText();
}
contentStream.close();
document.save("C:\\temp\\DrawBB.pdf");
document.close();
}catch(IOException ex) {
Logger.getLogger(DrawBoundngBox.class.getName()).log(Level.SEVERE, null, ex);
}
}
}