我修改了 TextToPDF 类来检测内容文件中的一些标签。当找到标签中心时,文本居中。
这不能正常工作,X 坐标似乎不受尊重
当我显示 x:坐标时,我得到:0
0
18.861816
2.9138184
238.31181
9.933823
68.68582
10.347824
40.14981
在生成的 pdf 中,第 6 行应该在第 5 行之前开始,但它在之后开始。
238.31181 > 9.933823 但 pdfbox 似乎说 9.933823 > 238.31181
生成文件的结果
此字符串被放入 StringReader 中,用于 createPDFFromText 参数。
String rawText = "Children's heart surgery has been suspended with immediate effect at a hospital which is embroiled in a long-running row over the future of paediatric cardiac services in England. \n "
+ "#CENTER#The decision to stop congenital heart surgery at Leeds General Infirmary comes just a day after the High Court quashed plans by the NHS to close its children's unit after ruling the consultation process was flawed.\n "
+ "It follows concerns raised about patients' care including allegations the hospital was avoiding referring children for complex and life-saving treatment at another centre in Newcastle.\n "
+ "Leeds Teaching Hospitals NHS Trust said the temporary measure was being taken to allow an internal review to be conducted following consultation with the Care Quality Commission (CQC).";
代码
public PDDocument createPDFFromText( Reader text ) throws IOException
{
PDDocument doc = null;
PDSimpleFont font = PDType1Font.TIMES_ROMAN;
int fontSize = 12;
boolean isCentered = false;
try
{
final int margin = 40;
float height = font.getFontDescriptor().getFontBoundingBox().getHeight()/1000;
//calculate font height and increase by 5 percent.
height = height*fontSize*1.05f;
doc = new PDDocument();
BufferedReader data = new BufferedReader( text );
String nextLine = null;
PDPage page = new PDPage();
PDPageContentStream contentStream = null;
float y = -1;
float maxStringLength = page.getMediaBox().getWidth() - 2*margin;
// There is a special case of creating a PDF document from an empty string.
boolean textIsEmpty = true;
while( (nextLine = data.readLine()) != null )
{
// The input text is nonEmpty. New pages will be created and added
// to the PDF document as they are needed, depending on the length of
// the text.
textIsEmpty = false;
String[] lineWords = nextLine.trim().split( " " );
int lineIndex = 0;
while( lineIndex < lineWords.length )
{
StringBuffer nextLineToDraw = new StringBuffer();
float lengthIfUsingNextWord = 0;
do
{
nextLineToDraw.append( lineWords[lineIndex] );
nextLineToDraw.append( " " );
lineIndex++;
if( lineIndex < lineWords.length )
{
String lineWithNextWord = nextLineToDraw.toString() + lineWords[lineIndex];
lengthIfUsingNextWord =
(font.getStringWidth( lineWithNextWord )/1000) * fontSize;
}
}
while( lineIndex < lineWords.length &&
lengthIfUsingNextWord < maxStringLength );
if( y < margin )
{
// We have crossed the end-of-page boundary and need to extend the
// document by another page.
page = new PDPage();
doc.addPage( page );
if( contentStream != null )
{
contentStream.endText();
contentStream.close();
}
contentStream = new PDPageContentStream(doc, page);
contentStream.setFont( font, fontSize );
contentStream.beginText();
y = page.getMediaBox().getHeight() - margin + height;
contentStream.moveTextPositionByAmount(
margin, y );
}
//System.out.println( "Drawing string at " + x + "," + y );
if( contentStream == null )
{
throw new IOException( "Error:Expected non-null content stream." );
}
String txt = nextLineToDraw.toString();
if ( txt.indexOf( "#CENTER#" ) != -1 || isCentered )
{
txt = nextLineToDraw.toString().replaceAll( "#CENTER#", "" );
PDRectangle pageSize = page.findMediaBox();
float stringWidth = font.getStringWidth( txt );
float xPosition = ( pageSize.getWidth() - ( 2 * margin ) - ( stringWidth * fontSize ) / 1000f ) / 2f;
System.out.println( xPosition );
contentStream.moveTextPositionByAmount( xPosition, -height );
isCentered = true;
}
else
{
System.out.println( 0);
contentStream.moveTextPositionByAmount( 0, -height );
}
y -= height;
contentStream.drawString( nextLineToDraw.toString() );
}
}
if (textIsEmpty)
{
doc.addPage(page);
}
if( contentStream != null )
{
contentStream.endText();
contentStream.close();
}
}
catch( IOException io )
{
if( doc != null )
{
doc.close();
}
throw io;
}
return doc;
}
文件结果可在此处获得:http: //filebin.ca/br6slMSfOR6/testUnitairePdf.pdf 如您所见,文本未正确居中。