【发布时间】:2009-07-20 14:47:17
【问题描述】:
如果我有一个现有的带有图形的 PDF,并且我只是希望用户能够单击 pdf 上的一个点,然后在单击的点上放一个字母,例如 A...B。 .. 等我认为 ITextSharp 可以处理这样的事情,但坦率地说,我不知道如何完成它。你能提供一些指导吗?
【问题讨论】:
标签: c# pdf itextsharp
如果我有一个现有的带有图形的 PDF,并且我只是希望用户能够单击 pdf 上的一个点,然后在单击的点上放一个字母,例如 A...B。 .. 等我认为 ITextSharp 可以处理这样的事情,但坦率地说,我不知道如何完成它。你能提供一些指导吗?
【问题讨论】:
标签: c# pdf itextsharp
这是一个使用商业广告 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);
}
}
}
【讨论】:
您可能不想加载 PDF,将其转换为可以在应用程序中呈现的内容(即,一些可编辑的文档对象),进行更改,然后将其写回 PDF 吗?
当然,这对于您想要完成的工作可能需要做很多工作,但我知道的大多数 PDF 工具实际上并没有直接编辑 .PDF。
iTextSharp 可能能够将 .PDF 文件加载到某种文档树中,然后您可以对其进行操作。我会先看看它是否会这样做,然后尝试更改一些节点,或者添加与您的注释相对应的节点。
可能无法实时看到您的更改,因此您可能希望通过将 .PDF 文件的渲染分层为简单的标签对象来“伪造”更改。这可能是最简单的开始方式。
【讨论】:
不,itextsharp 不能这样做,因为 itextsharp 可以操作 pdf 文件,但无法在 itextsharp 中呈现 pdf。
【讨论】:
您当然可以使用 ITextSharp 向现有 PDF 添加内容。网上有一些示例可以向您展示如何操作。 (我已经有一段时间没有这样做了,我的需要是为现有的 PDF 添加水印图像。)
ITextSharp 不能很好地阅读 PDF,因此您可能希望找到其他内容来显示 PDF。您可能需要在显示 PDF 的任何内容上覆盖一个透明窗口,以便捕捉点击,但这一切都取决于您找到的查看器。
【讨论】:
请记住,我只将PDFNet SDK 用于 PDF 操作任务,我相信您所询问的一切都可以通过该库实现,尽管您可能需要处理从单击到坐标转换的一些复杂性文档中的位置,然后再次构建矩阵,将文本定位到您在写入时需要的位置。
它们确实提供了一个简单的 WinForms 示例 PDF 查看器应用程序,可以作为您实验的良好起点。
我自己不需要如此深入地进行编辑。文档的起点是FAQ(如何向页面添加水印)和knowledge base。 API 文档也相当广泛,可在网站上公开获取。
【讨论】: