使用C#WinForm在PDF上绘制形状

使用C#WinForm在PDF上绘制形状,c#,pdf,shapes,C#,Pdf,Shapes,我已经在这方面寻求帮助很久了。如果这里已经有答案,我就找不到了。我在Windows窗体上使用C# 我正在尝试创建一个简单的程序,允许我打开PDF,展平其中的任何层,然后,每次单击鼠标,画一个圆 以每个圆圈为中心,我需要一个数字,从“1”开始,按时间顺序递增到无穷大(可能是1,可能是15000) 最后,我需要能够保存并打印最终结果 我还需要补充其他一些东西,但如果有人能让我开始做这件事,我应该能够自己解决其余的问题 我已经可以导入.pdf了。然而,我发现的任何用于创建透明图层的图坦卡蒙都不允许我看

我已经在这方面寻求帮助很久了。如果这里已经有答案,我就找不到了。我在Windows窗体上使用C#

我正在尝试创建一个简单的程序,允许我打开PDF,展平其中的任何层,然后,每次单击鼠标,画一个圆

以每个圆圈为中心,我需要一个数字,从“1”开始,按时间顺序递增到无穷大(可能是1,可能是15000)

最后,我需要能够保存并打印最终结果

我还需要补充其他一些东西,但如果有人能让我开始做这件事,我应该能够自己解决其余的问题

我已经可以导入.pdf了。然而,我发现的任何用于创建透明图层的图坦卡蒙都不允许我看到后面的pdf。我甚至需要这个透明层,还是可以直接在pdf上绘制?我要解决的第二大问题是如何创建圆圈,无论我选择在哪里单击鼠标,圆圈的数量都会按时间顺序递增

提前感谢您的帮助

请参见下图了解其外观


您可以使用Atalasoft的DotImage/DotPdf/DotAnnotation软件包(免责声明:直到3年前我一直在开发这些产品)。有很多方法可以做到这一点。如果您不关心标记是否是注释,则可以创建具有自定义外观的注释,并将每个注释添加到文档中。 如果您希望将数字添加到文档中,则可以直接使用DotPdf将内容附加到任何页面的内容流中

如何做到这一点,你自己。祝你好运(说真的,这不是一个容易解决的问题)。 要将新内容放入现有页面,您首先(至少)要做到以下几点:

首先,让我们谈谈PDF渲染模型: PDF使用一点非图灵完整RPN语言将内容放置在页面上。给定页面具有一个或多个代码流,这些代码流被执行以呈现页面。如果你想在上面添加内容,你需要最后渲染(还有其他更复杂的方法,但这已经足够了)。这意味着您要么附加到现有的内容流(不推荐),要么利用PDF页面上可以有任意数量的内容流这一事实。创建一个新流并添加代码以呈现所需的内容。 我会提前警告您,呈现文本是非常重要的,尤其是当您必须嵌入字体或使用unicode编码时。我还要警告您,PDF中没有“圆”原语。你必须用贝塞尔曲线来近似它。 我对自己的懒惰很好学,所以我创建了抽象,以便更容易正确地创建内容流。例如,我创建了一个名为“绘图曲面”的类,我可以告诉它“将绘图样式设置为此”、“在此处放置“形状”、“在此处绘制文本”等等。当被告知渲染时,它将生成匹配的PDF渲染程序。除此之外,我还有另一个抽象,它由一个更高级别对象的绘图列表和绘图列表组成,当渲染时,该列表将写入绘图表面,而绘图表面将反过来写入PDF

  • 将更改(生成)附加到PDF
  • 创建内容流
  • 将替换页面对象附加到现有页面,内容从流更改为数组(或者如果它已经是数组,则附加到数组),并将新资源添加到资源字典中
  • 在现有页面上放置批注时,首先(至少)需要做到以下几点:

  • 将更改(生成)附加到PDF
  • 使用添加了新注释(或通过插入/追加新注释进行修改)的注释为现有页面追加替换页面对象
  • 创建外观流
  • 使用自定义外观流创建注释
  • 至于如何实现用户界面,只要你有一个PDF渲染器,那就很简单了。将页面渲染为图像,并制作一个控件,使您可以在页面上单击鼠标。然后构建一个从图像坐标到PDF页面坐标的转换矩阵,并将鼠标坐标推过该矩阵。结果将是页面上标记的原点(请注意,某些页面已旋转,需要调整变换矩阵以匹配)

    现在,要明确的是,当我为Atalasoft编写这个库时,我已经有了几年的PDF经验(我在AcrobatV1-4上工作)。虽然我不是全职在图书馆工作,但它是在长达10年的时间里写成的。附加到现有PDF的代码需要几个月的时间才能正确完成。最终,我放弃了这段代码,因为除了简单的更改(如注释)之外,我还添加了一些复杂的内容,并编写了一些代码,这些代码可以通过对现有内容(页面重新排序、注释、书签、页面上的新内容、编辑过的图像等)的更新来重写整个PDF,同时也放弃了不再需要的内容。这类似于添加和剪切带循环的有向图的部分,并且能够确保在另一端有一个正确的图。 困难的部分没有在规范范围内工作-这对我来说相当简单。问题是如何处理由其他工具生成的复杂的PDF,这些工具有各种各样的bizarro规范冲突,并正确处理这些问题

    现在,我不是说不要这样做。我完全支持学习新事物和PDF的人。有很多东西需要学习,也有很多有趣的想法,但是你需要意识到,PDF空间中听起来简单的问题并不是微不足道的,除非你有大量的基础设施。例如,“PDF中有多少页?”需要PDF扫描仪和代码来执行或解析PDF内容,以便您可以在交叉引用表中读取