我可以插入这样简单的文本:
document = new PDDocument(); page = new PDPage(PDPage.PAGE_SIZE_A4); document.addPage(page); PDPageContentStream content = new PDPageContentStream(document,page); content.beginText(); content.moveTextPositionByAmount (10,10); content.drawString ("test text"); content.endText(); content.close();
但是如何使用width属性创建类似于HTML的段落?
<p style="width:200px;">test text</p>
解决方法
根据
this answer,不可能将换行符插入到某些文本中,并且PDF正确显示(无论是使用PDFBox还是其他东西),所以我认为自动包装一些文本以适应某些宽度也可能是不能做的事情自动. (除此之外,还有许多方法可以包装一个文本 – 全部单词,将它们分成较小的部分等)
This answer到另一个问题(以一个字符串为中心)给出了一些关于如何自己做的指针.假设你写了一个函数possibleWrapPoints(String):int []列出文本中的所有点,可以发生一个单词wrap(不包括“zero”,包括“text length”),一个可能的解决方案可能是:
PDFont font = PDType1Font.HELVETICA_BOLD; // Or whatever font you want. int fontSize = 16; // Or whatever font size you want. int paragraphWidth = 200; String text = "test text"; int start = 0; int end = 0; int height = 10; for ( int i : possibleWrapPoints(text) ) { float width = font.getStringWidth(text.substring(start,i)) / 1000 * fontSize; if ( start < end && width > paragraphWidth ) { // Draw partial text and increase height content.moveTextPositionByAmount(10,height); content.drawString(text.substring(start,end)); height += font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize; start = end; } end = i; } // Last piece of text content.moveTextPositionByAmount(10,height); content.drawString(text.substring(start));
可能的WapapPoints的一个例子,允许在不是单词(reference)的任何一点的包装可以是:
int[] possibleWrapPoints(String text) { String[] split = text.split("(?<=\\W)"); int[] ret = new int[split.length]; ret[0] = split[0].length(); for ( int i = 1 ; i < split.length ; i++ ) ret[i] = ret[i-1] + split[i].length(); return ret; }
更新:一些附加信息:
> PDF文件格式设计为在不同情况下看起来是一样的,像您所要求的功能在PDF编辑器/创建者中是有意义的,但不是PDF文件本身.因此,大多数“低级”工具往往集中在处理文件格式本身,而忽略了这样的东西.
>高级工具OTOH通常具有进行此转换的方法.一个例子是Platypus(对于Python,虽然),它有简单的方法来创建段落,并依赖于较低级别的ReportLab函数来执行实际的PDF渲染.我不知道类似的PDFBox工具,但this post提供了一些关于如何使用免费提供的工具在Java环境中将HTML内容转换为PDF的提示.没有自己尝试过,但是我在这里发布,因为它可能是有用的(如果我以上的手工尝试是不够的).