2013-07-16 112 views
0

我使用iText庫管理員創建並操作PDF文檔。 讓我們有一個文件,其中包含一個簡單的字符串,如「Hello world」。 所以在pdf文件結構中,我們必須有(Hello world)Tj。 問題是我如何設置位置爲每個字符由使用java代碼(我們也可以談論TJ操作符)。 我保證,他/她可以幫助我,給我的想法的人,我就會把他/她的名字作爲參考在我的項目:)與TJ操作員一起工作

任何回答apreciated :)

最好的問候,

+0

*的問題是如何設置位置爲每個字符* - 究竟是你的要求嗎?畢竟,如果你只想單獨定位每個字符,那麼在設置文本矩陣之前,可以簡單地爲每個獨立的chartacter使用Tj。還是你問在iTextSharp和C#或iText和Java中如何做到這一點? – mkl

回答

1

的問題是如何設置的位置對每個字符通過使用Java代碼

利用iText可以很容易地通過使用文本定位和舒地定位任何文本片段(包括單字符)如果你想換行功能的PdfContentByte.摹方法,你可以使用一個輔助類是這樣的:

public class ContentWriter 
{ 
    public ContentWriter(PdfContentByte content) throws DocumentException, IOException 
    { 
     this.content = content; 
     BaseFont bf = BaseFont.createFont(); 
     content.beginText(); 
     content.setFontAndSize(bf, 12); 
    } 

    // x and y are offsets relative to the start coordinates of the most recent write call 
    public ContentWriter write(float x, float y, String text) 
    { 
     if (finished) 
      throw new IllegalStateException("ContentWritr session already finished."); 
     content.moveText(x, y); 
     content.showText(text); 
     return this; 
    } 

    public void finish() 
    { 
     if (!finished) 
     { 
      content.endText(); 
      finished = true; 
     } 
    } 

    final PdfContentByte content; 
    boolean finished = false; 
} 

它可以像這樣使用:

public void testShowSomePositionedContent() throws DocumentException, IOException 
{ 
    Document document = new Document(); 
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("positionedContent.pdf")); 
    document.open(); 
    PdfContentByte cb = writer.getDirectContent(); 
    new ContentWriter(cb). 
     write(100, 400, "A"). 
     write(20, 0, "B"). 
     write(18, 2, "C"). 
     write(10, 7, "D"). 
     finish(); 
    document.close(); 
} 

此示例代碼創建了這一點:

letters A, B, C, and D positioned as per the sample code

正如您還談到了PDF運算符,您可能會對PDF本身的外觀感興趣:

BT 
/F1 12 Tf 
100 400 Td 
(A)Tj 
20 0 Td 
(B)Tj 
18 2 Td 
(C)Tj 
10 7 Td 
(D)Tj 
ET 

由於ContentWriter輔助類只需要一個PdfContentByte例如,它也可以與一些頁面的UnderContent或OverContent在PdfStamper.

+0

當你得到我們的問題的解決方案,請告訴我,並張貼我的代碼請。 – Bittar

+0

如前所述:除非其他人已經做到了,並且準備好分享代碼,否則我認爲這是一項至少需要**幾星期的連續工作,更可能是幾個月的任務,尤其是當您的任務尚未完成時定義非常明確:您希望採用通用PDF並重新定位字符。但是,你想如何重新定位?只要改變字符間距?或者也做其他操作?和哪些字形序列的字符間距?他們全部?在某些位置的字形序列?代表給定字符串的序列?澄清你的要求! – mkl

+0

我想做「重新定位」操作任務並更改字符間距 – Bittar

0
public static void CreatePdf(String src){ 
    Rectangle rec= new Rectangle(400,400); 
    Document doc= new Document(rec); 
    PdfWriter writer= PdfWriter.getInstance(doc,nweFileOutputStream("doc.pdf")); 
    PdfContentByte content=writer.getDirectContent(); 
    doc.open(); 
    BaseFont bf=BaseFont.createFont(); 
    String texte="hello"; 
    content.setCharacterSpacing((float)2.5); 
    content.setFontAndSize(bf,12); 
    content.beginText(); 
    content.showText(texte); 
    content.endText(); 
    document.close(); 
    } 
    public static void ManipulatePdf(String src, String dest){ 
    PdfReader read= new PdfReader("doc.pdf"); 
    PdfStamper stamper= new PdfStamper(read,new FileOutPutStream("doc_modifie.pdf")); 
    PdfContentByte canvas= stamper.getUnderContent(1); 
    canvas.setFontAndSize(bf,12); 
    canvas.setCharacterSpacing((float)6); 
    canvas.beginText(); 
    canvas.showText(texte); 
    canvas.endText(); 
    stamper.close(); 

    //now how to modify the character spacing to 6 for example and then replace the modified //string instead of the old string in the document 
    } 


} 
0

公共無效ManipulatePdf(的字符串src,字符串DEST使用){ PdfReader read = new PdfReader(「document.pdf」); PdfStamper stamper = new PdfStamper(read,new FileOutputStream(「document_modifié.pdf」));

PdfContentByte content= stamper.getUnderContent(1); 

    LocationTextExtractionStrategy lteStrategy = new LocationTextExtractionStrategy(); 
    String texte= PdfTextExtractor.getTextFromPage(read, 1, lteStrategy); 
    pdflayer= new PdfLayer("Overrite", stamper.getWriter()); 
    content.setColorFill(BaseColor.BLACK); 
    content.beginLayer(pdflayer); 
    content.fill(); 
    PdfGState pgState = new PdfGState(); 
    content.setGState(pgState); 
    content.setColorFill(BaseColor.WHITE); 
    content.setCharacterSpacing((float)6); 
    content.beginText(); 
    content.setTextMatrix(15, 385); 
    content.showText("hello"); 
    content.endText(); 
    content.endLayer(); 
    stamper.close(); 
    read.close(); 

}