17

次のコードで PDFBox を使用しています。

doc = new PDDocument();
page = new PDPage();

doc.addPage(page);
PDFont font = PDType1Font.COURIER;

pdftitle = new PDPageContentStream(doc, page);
pdftitle.beginText();
pdftitle.setFont( font, 12 );
pdftitle.moveTextPositionByAmount( 40, 740 );
pdftitle.drawString("Here I insert a lot of text");
pdftitle.endText();
pdftitle.close();

自動的に別の行に移動するようにテキストを折り返す方法を知っている人はいますか?

4

4 に答える 4

5

テキストを自動的に折り返すことはできないと思います。ただし、テキストを自分でラップすることはできます。PDFBox drawStringで改行を挿入する方法と PDFboxで固定幅の段落を作成するにはどうすればよいですか? を参照してください。.

于 2013-02-21T07:48:00.523 に答える
0

pdfBOX の改行問題の解決策を見つけました

一般に、テキストを折り返すには 3 つの手順が必要です。

1) ラップする必要がある文字列内の各単語を分割し、それらを文字列の配列に入れます (例: String [] パーツ)。

2) (textlength/(1 行の文字数)) で stringbuffer の配列を作成します。たとえば、280/70=5 >> 5 つの改行が必要です!

3) パーツを stringbuffer[i] に入れ、行内の最大文字数の制限が許可されるまで、

4) stringbuffer.length < linebreaks までループ

メソッドsplitStringはそれを行うメソッドです。メソッドwriteTextは、ラップされたテキストを pdf に描画するだけです。

ここに例があります

import java.io.IOException;
import java.util.ArrayList;

import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

public class pdfTest{
 private ArrayList<String> arrayList;
 private PDDocument document;
 private PDFont font = PDType1Font.HELVETICA;

 pdfTest(PDDocument document, ArrayList arrayList, PDFont font) throws COSVisitorException, IOException {
    this.document = document;
    this.arrayList = arrayList;
    this.font = font;   
    writeText(document, arrayList, 30, 750, font); //method for easily drawing a text into a pdf
 } //constructor


 public void writeText(PDDocument document, ArrayList arrayList, int positionX, int positionY, PDFont font) throws IOException, COSVisitorException {
     PDPage page = new PDPage();
     document.addPage( page );

     // Start a new content stream
     PDPageContentStream contentStream = new PDPageContentStream(document, page);

     // Define a text content stream using the selected font, moving the cursor and drawing the text in arrayList
     for(int i=0;i<arrayList.size();i++) {  
         String text=(String) arrayList.get(i);
         String [] tmpText = splitString(text);
         for( int k=0;k<tmpText.length;k++) {
             contentStream.beginText();
             contentStream.setFont(font, 12);
             contentStream.moveTextPositionByAmount(positionX, positionY);
             contentStream.drawString(tmpText[k]);           
             contentStream.endText();
             positionY=positionY-20;
         }           
         contentStream.setLineWidth((float) 0.25);
     }

     // Make sure that the content stream is closed:
     contentStream.close();      
     document.save( "Test.pdf");
     document.close();
 } //main

 public static void main(String[] args) throws COSVisitorException, IOException {
     ArrayList arrayList = new ArrayList<String>();

     PDDocument document = new PDDocument();
     PDFont font = PDType1Font.HELVETICA;
     PDPage page = new PDPage();

     arrayList.add(       "12345 56789 0 aaa bbbew wel kwäer kweork merkweporkm roer wer wer e  er"
                        + "df sdmfkl  slkdfm sdkfdof sopdkfp osdkfo sädölf söldm,f sdkfpoekr re, ä"
                        + " sdfk msdlkfmsdlk fsdlkfnsdlk fnlkdn flksdnfkl sdnlkfn kln df sdmfn sn END");
     arrayList.add("this is an example");
     arrayList.add("java pdfbox stackoverflow");         

     new pdfTest(document,arrayList,font);
     System.out.println("pdf created!");
 }

 public String [] splitString(String text) {
     /* pdfBox doesnt support linebreaks. Therefore, following steps are requierd to automatically put linebreaks in the pdf
      * 1) split each word in string that has to be linefeded and put them into an array of string, e.g. String [] parts
      * 2) create an array of stringbuffer with (textlength/(number of characters in a line)), e.g. 280/70=5 >> we need 5 linebreaks!
      * 3) put the parts into the stringbuffer[i], until the limit of maximum number of characters in a line is allowed,
      * 4) loop until stringbuffer.length < linebreaks
      * 
      */
     int linebreaks=text.length()/80; //how many linebreaks do I need?  
     String [] newText = new String[linebreaks+1];       
     String tmpText = text;
     String [] parts = tmpText.split(" "); //save each word into an array-element

     //split each word in String into a an array of String text. 
     StringBuffer [] stringBuffer = new StringBuffer[linebreaks+1]; //StringBuffer is necessary because of manipulating text
     int i=0; //initialize counter 
     int totalTextLength=0;
     for(int k=0; k<linebreaks+1;k++) {
         stringBuffer[k] = new StringBuffer();
         while(true) {               
             if (i>=parts.length) break; //avoid NullPointerException
             totalTextLength=totalTextLength+parts[i].length(); //count each word in String              
             if (totalTextLength>80) break; //put each word in a stringbuffer until string length is >80
             stringBuffer[k].append(parts[i]);
             stringBuffer[k].append(" ");
             i++;
         }
         //reset counter, save linebreaked text into the array, finally convert it to a string 
         totalTextLength=0; 
         newText[k] = stringBuffer[k].toString();
     }
     return newText;
 } 

} 
于 2014-06-05T12:58:53.573 に答える