【问题标题】:c# PDF Manipulationc# PDF操作
【发布时间】:2009-07-20 14:47:17
【问题描述】:

如果我有一个现有的带有图形的 PDF,并且我只是希望用户能够单击 pdf 上的一个点,然后在单击的点上放一个字母,例如 A...B。 .. 等我认为 ITextSharp 可以处理这样的事情,但坦率地说,我不知道如何完成它。你能提供一些指导吗?

【问题讨论】:

    标签: c# pdf itextsharp


    【解决方案1】:

    这是一个使用商业广告 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);
            }
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可能不想加载 PDF,将其转换为可以在应用程序中呈现的内容(即,一些可编辑的文档对象),进行更改,然后将其写回 PDF 吗?

      当然,这对于您想要完成的工作可能需要做很多工作,但我知道的大多数 PDF 工具实际上并没有直接编辑 .PDF。

      iTextSharp 可能能够将 .PDF 文件加载到某种文档树中,然后您可以对其进行操作。我会先看看它是否会这样做,然后尝试更改一些节点,或者添加与您的注释相对应的节点。

      可能无法实时看到您的更改,因此您可能希望通过将 .PDF 文件的渲染分层为简单的标签对象来“伪造”更改。这可能是最简单的开始方式。

      【讨论】:

      • 我之前使用 I text sharp 将文本拖放到现有 PDF 中,例如我们为客户制作的小册子在每个位置都会有所不同,因此 Grapchi 设计师创建了小册子,然后我们将表格上的一些数据放到pdf上的相应位置,并保存。但在这种情况下,我需要用户单击 pdf 上的特定点。不同之处在于,我知道我手头上的 x 和 y,现在它在空中......
      【解决方案3】:

      不,itextsharp 不能这样做,因为 itextsharp 可以操作 pdf 文件,但无法在 itextsharp 中呈现 pdf。

      【讨论】:

        【解决方案4】:

        您当然可以使用 ITextSharp 向现有 PDF 添加内容。网上有一些示例可以向您展示如何操作。 (我已经有一段时间没有这样做了,我的需要是为现有的 PDF 添加水印图像。)

        ITextSharp 不能很好地阅读 PDF,因此您可能希望找到其他内容来显示 PDF。您可能需要在显示 PDF 的任何内容上覆盖一个透明窗口,以便捕捉点击,但这一切都取决于您找到的查看器。

        【讨论】:

        • 我在想也许使用阅读器附带的adobe组件来显示pdf,然后让他们点击文档,然后将字母放到上面,问题是我将如何确定x和 y 的点击,因为它与 pdf 文档有关,而不是包含控件?
        • 您有两个主要选择,都需要一些 P/Invoke 调用才能找到 PDF 显示窗口。 #1 - 找到 PDF 显示窗口并将您自己的透明窗口放在上面,以捕捉点击。 #2 - 使用一些系统范围的钩子来点击进入实际的 PDF 显示窗口。 #1 可能比 #2 更简单。
        【解决方案5】:

        请记住,我只将PDFNet SDK 用于 PDF 操作任务,我相信您所询问的一切都可以通过该库实现,尽管您可能需要处理从单击到坐标转换的一些复杂性文档中的位置,然后再次构建矩阵,将文本定位到您在写入时需要的位置。

        它们确实提供了一个简单的 WinForms 示例 PDF 查看器应用程序,可以作为您实验的良好起点。

        我自己不需要如此深入地进行编辑。文档的起点是FAQ(如何向页面添加水印)和knowledge base。 API 文档也相当广泛,可在网站上公开获取。

        【讨论】:

        • 这是一个昂贵的库,尤其是如果您想对应用程序进行商业许可!大声笑...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        • 2018-11-24
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        • 2018-10-05
        相关资源
        最近更新 更多