我想在叠加文字中添加一个链接。我已经读过,使用Anchor
仅适用于从头开始制作的文档,不适用于现有的pdf。我的
代码是向每个页面添加一个覆盖文本。我的目标是使
该文本的一部分可点击。我不知道如何制作
短语中的链接注释。
这是我的代码:
int n = reader.getNumberOfPages();
// step 4: we add content
PdfImportedPage page;
PdfCopy.PageStamp stamp;
for (int j = 0; j < n; )
{
++j;
page = writer.getImportedPage(reader, j);
if (i == 1) {
stamp = writer.createPageStamp(page);
Rectangle mediabox = reader.getPageSize(j);
Rectangle crop = new Rectangle(mediabox);
writer.setCropBoxSize(crop);
// add overlay text
Paragraph p = new Paragraph();
p.setAlignment(Element.ALIGN_CENTER);
FONT_URL_OVERLAY.setColor(0, 191, 255);
// get current user
EPerson loggedin = context.getCurrentUser();
String eperson = null;
if (loggedin != null)
{
eperson = loggedin.getFullName();
}
else eperson = "Anonymous";
Phrase downloaded = new Phrase();
Chunk site = new Chunk("My Website",FONT_URL_OVERLAY);
site.setAction(new PdfAction("http://www.mywebsite.com"));
downloaded.add(new Chunk("Downloaded by [" + eperson + "] from ", FONT_OVERLAY));
downloaded.add(site);
downloaded.add(new Chunk(" on ", FONT_OVERLAY));
downloaded.add(new Chunk(new SimpleDateFormat("MMMM d, yyyy").format(new Date()), FONT_OVERLAY));
downloaded.add(new Chunk(" at ", FONT_OVERLAY));
downloaded.add(new Chunk(new SimpleDateFormat("h:mm a z").format(new Date()), FONT_OVERLAY));
p.add(downloaded);
ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, p,
crop.getLeft(10), crop.getHeight() / 2 + crop.getBottom(), 90);
stamp.alterContents();
}
writer.addPage(page);
}
所以我的叠加看起来像这样:
从[匿名]下载我的网站在1:20 2015年2月17日
上午CST
如何将我的网站转换为链接注释?在SO中搜索时,我
找到了这篇文章,但是我不知道如何
将添加链接注释应用于部分重叠文本。
提前致谢。
编辑:如何添加带有链接注释的旋转的覆盖文本到现有的
pdf?
感谢Bruno Lowagie竭尽全力回答我的问题。尽管我
最初问过如何在覆盖文本中添加链接注释到现有的
pdf,但他还在他的答案的注释部分中满足了我的问题,即
如果旋转了覆盖文本,则如何正确设置坐标。
您正在使用ColumnText.showAligned()它来添加一行
没有任何特殊功能的文本就足够了,但是如果您想要锚点起作用,则
需要使用ColumnText不同的方式。
这在
AddLinkAnnotation2
示例中显示:
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
PdfContentByte canvas = stamper.getOverContent(1);
Font bold = new Font(FontFamily.HELVETICA, 12, Font.BOLD);
Chunk chunk = new Chunk("The Best iText Questions on StackOverflow", bold);
chunk.setAnchor("http://pages.itextpdf.com/ebook-stackoverflow-questions.html");
Phrase p = new Phrase("Download ");
p.add(chunk);
p.add(" and discover more than 200 questions and answers.");
ColumnText ct = new ColumnText(canvas);
ct.setSimpleColumn(36, 700, 559, 750);
ct.addText(p);
ct.go();
stamper.close();
reader.close();
}
在这种情况下,我们为ColumnText对象定义一个矩形,将添加
Phrase到列中,然后添加go()。
如果检查结果
link_annotation2.pdf,
则会注意到您可以单击粗体字。
尚无计划支持ColumnText.showTextAligned()。这是
一种方便的方法,可以用作
上面显示的少数几行的捷径,但是存在一些已知的局限性:没有包装行,
忽略了交互性,…
更新1:在注释部分中,您询问了有关
旋转内容和链接的其他问题。
旋转内容并不难。做到
这一点的方法不止一种。旋转链接并非易事,因为链接是一种注释,
注释也不是内容的一部分。
首先让我们看一下
AddLinkAnnotation3:
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
AffineTransform transform = AffineTransform.getRotateInstance(Math.PI / 6);
stamper.getWriter().setPageEvent(new AddAnnotation(stamper, transform));
PdfContentByte canvas = stamper.getOverContent(1);
Font bold = new Font(FontFamily.HELVETICA, 12, Font.BOLD);
Chunk chunk = new Chunk("The Best iText Questions on StackOverflow", bold);
chunk.setGenericTag("http://pages.itextpdf.com/ebook-stackoverflow-questions.html");
Phrase p = new Phrase("Download ");
p.add(chunk);
p.add(" and discover more than 200 questions and answers.");
canvas.saveState();
canvas.concatCTM(transform);
ColumnText ct = new ColumnText(canvas);
ct.setSimpleColumn(300, 0, 800, 400);
ct.addText(p);
ct.go();
canvas.restoreState();
stamper.close();
reader.close();
}
In this example, we define a tranformation of 30 degrees (Math.PI / 6
):
AffineTransform transform = AffineTransform.getRotateInstance(Math.PI / 6);
We use this transformation when rendering the column:
canvas.saveState();
canvas.concatCTM(transform);
// render column
canvas.restoreState();
This rotates the content, but we didn’t add any annotation yet. Instead, we
define a page event:
stamper.getWriter().setPageEvent(new AddAnnotation(stamper, transform));
and we introduced a generic tag:
chunk.setGenericTag("http://pages.itextpdf.com/ebook-stackoverflow-questions.html");
To add the annotation, we use some magic in the page event implementation:
public class AddAnnotation extends PdfPageEventHelper {
protected PdfStamper stamper;
protected AffineTransform transform;
public AddAnnotation(PdfStamper stamper, AffineTransform transform) {
this.stamper = stamper;
this.transform = transform;
}
@Override
public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
float[] pts = {rect.getLeft(), rect.getBottom(), rect.getRight(), rect.getTop()};
transform.transform(pts, 0, pts, 0, 2);
float[] dstPts = {pts[0], pts[1], pts[2], pts[3]};
rect = new Rectangle(dstPts[0], dstPts[1], dstPts[2], dstPts[3]);
PdfAnnotation annot = PdfAnnotation.createLink(writer, rect, PdfAnnotation.HIGHLIGHT_INVERT, new PdfAction(text));
stamper.addAnnotation(annot, 1);
}
}
我们创建了一个批注,但在此之前,我们对
矩形执行了转换。这样可以确保文本与
需要单击的文本适合矩形,但是……这可能不是您所期望的:
您可能希望旋转矩形,这是可能的,但这是
更多的数学方法。例如:您可以创建一个更合适的多边形:
ITextShape Clickable Polygon或
path
幸运的是,您不需要30度的角度,而是希望将
文本旋转90度的角度。在这种情况下,您不会获得
上面的屏幕截图所示的奇怪效果。ase, you don’t have the strange
effect shown in the above screen shot.
Take a look at
AddLinkAnnotation4
public class AddAnnotation extends PdfPageEventHelper {
protected PdfStamper stamper;
protected AffineTransform transform;
public AddAnnotation(PdfStamper stamper, AffineTransform transform) {
this.stamper = stamper;
this.transform = transform;
}
@Override
public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
float[] pts = {rect.getLeft(), rect.getBottom(), rect.getRight(), rect.getTop()};
transform.transform(pts, 0, pts, 0, 2);
float[] dstPts = {pts[0], pts[1], pts[2], pts[3]};
rect = new Rectangle(dstPts[0], dstPts[1], dstPts[2], dstPts[3]);
PdfAnnotation annot = PdfAnnotation.createLink(writer, rect, PdfAnnotation.HIGHLIGHT_INVERT, new PdfAction(text));
annot.setBorder(new PdfBorderArray(0, 0, 0));
stamper.addAnnotation(annot, 1);
}
}
如您所见,我添加了一行删除边框(
默认情况下,边框在那里,除非您重新定义PdfBorderArray)。
其余代码也几乎相同。现在,我们定义一个角度
Math.PI / 2(90度)。
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
AffineTransform transform = AffineTransform.getRotateInstance(Math.PI / 2);
stamper.getWriter().setPageEvent(new AddAnnotation(stamper, transform));
PdfContentByte canvas = stamper.getOverContent(1);
Font bold = new Font(FontFamily.HELVETICA, 12, Font.BOLD);
Chunk chunk = new Chunk("The Best iText Questions on StackOverflow", bold);
chunk.setGenericTag("http://pages.itextpdf.com/ebook-stackoverflow-questions.html");
Phrase p = new Phrase("Download ");
p.add(chunk);
p.add(" and discover more than 200 questions and answers.");
canvas.saveState();
canvas.concatCTM(transform);
ColumnText ct = new ColumnText(canvas);
ct.setSimpleColumn(36, -559, 806, -36);
ct.addText(p);
ct.go();
canvas.restoreState();
stamper.close();
reader.close();
}
请注意,页面的左下角是枢轴点,因此我们需要
调整添加列的位置的坐标,否则将所有
内容旋转到页面可见区域之外。
更新2:
在另一个评论中,您询问的是
在旋转坐标系中添加文本时需要使用的坐标。
我画了这张图: 在此处输入图片说明
在顶部,您会在页面中间添加单词MIDDLE,但
它不会出现在这里:您将所有内容旋转了90度,因此
单词MIDDLE将在页面外旋转(进入阴影区域)。该单词
将出现在PDF中,但您将永远看不到它。
如果查看我的代码,就会发现我使用以下坐标:
If you look at my code, you see that I use these coordinates:
ct.setSimpleColumn(36, -559, 806, -36);
这是在可见区域之外(低于实际页面尺寸),
但是当我将所有内容旋转90度时,它将旋转到可见
区域中。
如果看我的绘图,可以看到坐标为(0,0),
(0,-595),(842,-598)和(842,0)的页面旋转了90度,因此
与坐标为(0,0),(595,0),(595,842)和(
0,842)的页面。那就是我们在高中都学过的数学;-)
您是在位置添加文字crop.getLeft(10), crop.getHeight() / 2 + crop.getBottom()
。如果您知道文本将旋转90度,
则应使用crop.getHeight() / 2 + crop.getBottom(), -crop.getLeft()
。
理解原因的最好方法是绘制图纸。
我需要添加一些文本内容的底部现有的。带有iText的pdf文档。我有一个工作方法,但新内容显示在左上角,与现有内容重叠: 如何“移动”最后一页底部的,而不是第一页的开头?我对iText不熟悉,令人惊讶的是,在网上找不到解决方案。
问题内容: 对于不可编辑的UITextView,我想在iOS9 +中嵌入这样的文本: 只需单击此处进行注册 我可以创建一个函数并处理文本,但是有没有更简单的方法? 我看到我可以使用NSTextCheckingTypeLink,因此在Interface Builder中无需“ click here”部分就可以单击文本: 只需http://example.com进行注册 如果相关,我正在使用Xcode
问题内容: 如何添加到MySQL表的现有列? 问题答案: 我认为您想按照命令中的说明进行操作。可能是这样的: 在上面运行之前,请确保该列具有主索引。
我有一个基于Windows的docker容器,运行它并在其中运行一个应用程序。但有时我需要在图像中添加一个文件夹,并运行另一个应用程序。如何递归添加 从我的主机到我的图像?
坚持使用PDFBox Android,PDFBox Android:1.8.9.0 我加载pdf文件的第一页,在其中写入文本,并将此页面导入最终文档的新页面。 问题是,当创建新页面时,它会使用包含以前文本的最后一页 所以,第一页是可以的,但是下一页有重叠的文本。。 有没有办法在每次迭代中都有新的页面?谢谢
我正在尝试从Android中的一个遗留应用程序打开一个标准的PDF表单,使用iText覆盖表单字段,并传递到Android上的Adobe Reader来填写表单。 我已经能够手动创建文本字段,但我更希望有一个pdf文件作为模板,以加快过程和更好地控制质量。 这是我到目前为止的代码,遵循itext的例子。 我遇到的问题在最后一行。cb.addTemplate(第0,0页); Eclipse报告以下错