我有一个要求,我想在PDF文档的当前光标位置插入图像。可以使用 itextSharp 库吗?如果是,请告诉我可以使用哪些接口来实现这一目标?
问题不清楚。
A. 如果您从头开始创建文档,您可能会使用...
[1.] 一系列
document.add()
调用,您可以在其中添加 Paragraph
、PdfPTable
、... 等元素
在这种情况下:
Image
对象并执行 document.Add(image);
在这种情况下,将添加图像。但是,您可能不想更改图像顺序默认值:图像未按顺序添加到 pdf 文档 itextsharp(元素顺序错误)document.add()
序列中的“当前位置”,请使用 GetVerticalPosition()
方法,如下所述:如何在 iTextSharp 中查找当前 (X, Y) 位置?[2.] 在绝对位置添加对象的方法。在这种情况下,实际上并没有光标。
B. 如果您正在谈论向现有文档添加内容,则没有光标。 PDF 只是在页面上的绝对位置绘制的一堆字符和线条。
有点晚了,但我想我还是会回答,也许这会节省其他人的时间。
考虑到您已经有一个 PDF,并且需要在其上添加图像,首先您需要以某种方式呈现它。我为此使用了 PdfiumViewer 库。
然后您需要获取点击时的光标位置并将其转换为PDF位置。
这是我能够做到的:
private void pdfRenderer_MouseClick(object sender, MouseEventArgs e)
{
var args = (MouseEventArgs)e;
_clickX = e.Location.X;
_clickY = e.Location.Y;
Point DevicePoint = new Point((int)_clickX, (int)_clickY);
PdfPoint PDFpoint = pdfRenderer.PointToPdf(DevicePoint);
float pdfX = PDFpoint.Location.X;
float pdfY = PDFpoint.Location.Y;
这将为您提供 PDF 文档上位置的 X 和 Y。从这里您只需使用 itext 在其上添加图像即可。这是我带邮票的例子:
string outputPath = Path.Combine(Path.GetDirectoryName(pdfPath), "Stamped_" + Path.GetFileName(pdfPath));
using (PdfReader pdfReader = new PdfReader(pdfPath))
using (PdfWriter pdfWriter = new PdfWriter(outputPath))
using (iText.Kernel.Pdf.PdfDocument pdfDoc = new iText.Kernel.Pdf.PdfDocument(pdfReader, pdfWriter))
{
Document document = new Document(pdfDoc);
// Add a stamp at the captured position
Paragraph stamp = new Paragraph("bababa")
.SetFixedPosition(1, pdfX, pdfY, 50)
.SetFontSize(12)
.SetBackgroundColor(iText.Kernel.Colors.ColorConstants.YELLOW);
document.Add(stamp);
}
此方法适用于不同的缩放/滚动级别以及一次加载多个页面。