使用iText在矩形中绘制可选文本

时间:2013-12-23 15:12:47

标签: java itext

很快,我想使用iText在特定矩形中绘制文本,可以在PDF编辑器工具中选择。这是我的尝试:

  Document document = new Document();
  PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FILE_RESULT));
        document.open();

 // first 
 TextField data = new TextField(writer, new Rectangle(30, 60, 200, 200), "1- this text generated by textfiled");
 data.setFontSize(10);
 data.setTextColor(BaseColor.GRAY);
 data.setText("1- this text generated by textfiled");
 PdfFormField datafield = data.getTextField();
 writer.addAnnotation(datafield);

 // second
 PdfContentByte cb = writer.getDirectContent();         
 cb.saveState();
 cb.beginText();
 cb.moveText(200, 400);
 cb.setFontAndSize(BaseFont.createFont(), 14);
 cb.showText("2- this text is generated by PdfContentByte ");
 cb.endText();
 cb.restoreState();

 // third
 ColumnText ct = new ColumnText(writer.getDirectContent());
 writer.setCompressionLevel(0);       
 ct.setSimpleColumn(100,100,400,300);
 ct.setText(new Phrase("3- this text is generated by ColumnText"));
 ct.go();

 document.close();

我在我的PC上使用Foxit reader作为PDF工具,在网络上使用Google驱动器文档,Google驱动器可以选择文本,但foxit不能(只是再次测试)。
here是输出。

以上三种方式都不是我想要的。我想要另一种方法,我可以输入一个矩形(左,上,下,右),文本将适合这个矩形,因为它可以(字体大小是动态的)。是否有任何想法或实例可以达到这个目的?

P / S:向 Bruno Lowagie 解释:

  • 我不知道PdfContentByte是否为专业人士添加文字,我只是搜索并尝试过。
  • 我已经尝试过第二种方式(PdfContentByte),但它不起作用然后我删除了这些代码,所以现在我必须再次搜索复制并发布到StackOverflow,我认为它类似于我的尝试。现在我再次写测试。

1 个答案:

答案 0 :(得分:0)

我只看了你的PDF。实质上它包含这个内容

q
BT
200 400 Td
/F1 14 Tf
(2- this text is generated by PdfContentByte ) Tj
ET
Q
BT
1 0 0 1 100 284 Tm
/F1 12 Tf
(3- this text is generated by ColumnText) Tj
ET

此处的字体 F1 定义为

2 0 obj
<</BaseFont/Helvetica/Type/Font/Encoding/WinAnsiEncoding/Subtype/Type1>>
endobj 

如您所见编码被定义为 WinAnsiEncoding ,我只使用这样的编码从内容流中复制。

因此,只需按照PDF规范第9.10节“文本内容提取”中的文本提取说明进行操作,就可以轻松复制。任何无法复制和粘贴的PDF阅读器似乎都没有尝试过。

对于文本框,它更容易,字段定义为

3 0 obj
<<
  /Ff 0
  /F 4
  /Type/Annot
  /BS<</W 1/S/S>>
  /Subtype/Widget
  /Rect[30 60 200 200]
  /FT/Tx
  /DR<</Font<</Helv 2 0 R>>>>
  /DA(/Helv 10 Tf 0.50196 0.50196 0.50196 rg )
  /T(1- this text generated by textfiled)
  /V(1- this text generated by textfiled)
  /AP<</N 1 0 R>>>>
endobj 

如您所见,该值的定义与所需的一样。

关于您的以下问题:

  

以上三种方式都不是我想要的。我想要另一种方式,我可以输入一个矩形(左,上,下,右),文本将尽可能适合这个矩形(字体大小是动态的)。是否有任何想法或实例可以实现这一目标?

如果结果太大,您将基本上必须使用您尝试的方法,使用不同的字体大小,并限制自己使用至少尝试复制文本的PDF阅读器,如规范所述。不过,我不得不承认,我并不认为Foxit属于不尝试的读者类别。