如果我有一个现有的带有图形的 PDF,并且我只是希望用户能够单击 pdf 上的一个点,然后在单击点放置一个字母,例如 A...B... 等.我认为 ITextSharp 可以处理这样的事情,但坦率地说,我不知道如何完成它。你能提供一些指导吗?
5 回答
这是一个使用商业Quick PDF Library的 C# 示例。
using System;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using QuickPDFAX0714;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private string LicenseKey = " your key here ";
private string OriginalFileName = "D:\\QuickPDFLibrary\\hello1.pdf";
private string NewFileName = "D:\\QuickPDFLibrary\\hello2.pdf";
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
ShowPDF(OriginalFileName);
}
private void ShowPDF(string fileName)
{
PDFLibrary qp = new PDFLibrary();
qp.UnlockKey(LicenseKey);
qp.LoadFromFile(fileName);
// Fit width of PDF to width of picture box
int dpi = Convert.ToInt32((pictureBox1.Width * 72) / qp.PageWidth());
byte[] bmpData = (byte[])qp.RenderPageToVariant(dpi, 1, 0);
MemoryStream ms = new MemoryStream(bmpData);
Bitmap bmp = new Bitmap(ms);
pictureBox1.Image = bmp;
ms.Dispose();
}
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
PDFLibrary qp = new PDFLibrary();
qp.UnlockKey(LicenseKey);
qp.LoadFromFile(OriginalFileName);
// Calculate co-ordinates, width of PDF fitted to width of PictureBox
double xpos = ((double)e.X / (double)pictureBox1.Width) * qp.PageWidth();
double ypos = qp.PageHeight() - ((double)e.Y / (double)pictureBox1.Width) * qp.PageWidth();
qp.SetTextSize(24);
qp.SetTextColor(1, 0, 0);
qp.DrawText(xpos, ypos, "A");
qp.SaveToFile(NewFileName);
ShowPDF(NewFileName);
}
}
}
请记住,我只使用过PDFNet SDK来处理 PDF 操作任务,我相信您所询问的一切都可以使用该库来实现,尽管您可能必须处理从单击到位置的坐标转换的一些复杂性文档,然后再次构建矩阵,在写入时将文本定位到您需要的位置。
它们确实提供了一个简单的 WinForms 示例 PDF 查看器应用程序,可以作为您实验的良好起点。
我自己不需要这么深入地进行编辑。文档的起点位于常见问题解答(如何向页面添加水印)和知识库中。API 文档也相当广泛,并且可以在网站上公开获得。
您是否可能不想加载 PDF,将其转换为可以在应用程序中呈现的内容(即,一些可编辑的文档对象),进行更改,然后将其写回 PDF?
诚然,对于您要完成的工作,这可能需要做很多工作,但我知道的大多数 PDF 工具实际上并没有直接编辑 .PDF。
iTextSharp 可能能够将 .PDF 文件加载到某种文档树中,然后您可以对其进行操作。我会先看看它是否做了这样的事情,然后尝试更改一些节点,或者添加与您的注释相对应的节点。
可能无法实时看到您的更改,因此您可能希望通过将 .PDF 文件的渲染分层为简单的标签对象来“伪造”更改。这可能是最简单的开始方式。
不,itextsharp 不能这样做,因为 itextsharp 可以操作 pdf 文件,但是无法在 itextsharp 中呈现 pdf。
您当然可以使用 ITextSharp 向现有 PDF 添加内容。网上有一些示例可以向您展示如何操作。(我已经有一段时间没有这样做了,我的需要是将水印图像添加到现有的 PDF 中。)
ITextSharp 不能很好地阅读 PDF,因此您可能希望找到其他内容来显示 PDF。您可能需要在显示 PDF 的任何内容上覆盖一个透明窗口,以便您可以捕捉到点击,但这一切都取决于您找到的查看器。