我使用iText庫管理員創建並操作PDF文檔。 讓我們有一個文件,其中包含一個簡單的字符串,如「Hello world」。 所以在pdf文件結構中,我們必須有(Hello world)Tj。 問題是我如何設置位置爲每個字符由使用java代碼(我們也可以談論TJ操作符)。 我保證,他/她可以幫助我,給我的想法的人,我就會把他/她的名字作爲參考在我的項目:)與TJ操作員一起工作
任何回答apreciated :)
最好的問候,
我使用iText庫管理員創建並操作PDF文檔。 讓我們有一個文件,其中包含一個簡單的字符串,如「Hello world」。 所以在pdf文件結構中,我們必須有(Hello world)Tj。 問題是我如何設置位置爲每個字符由使用java代碼(我們也可以談論TJ操作符)。 我保證,他/她可以幫助我,給我的想法的人,我就會把他/她的名字作爲參考在我的項目:)與TJ操作員一起工作
任何回答apreciated :)
最好的問候,
的問題是如何設置的位置對每個字符通過使用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();
}
此示例代碼創建了這一點:
正如您還談到了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.
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
}
}
公共無效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();
}
*的問題是如何設置位置爲每個字符* - 究竟是你的要求嗎?畢竟,如果你只想單獨定位每個字符,那麼在設置文本矩陣之前,可以簡單地爲每個獨立的chartacter使用Tj。還是你問在iTextSharp和C#或iText和Java中如何做到這一點? – mkl