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

时间:2018-04-17 13:43:15

标签: c# pdf shapes

我一直在寻找这方面的帮助很长一段时间。如果它已在这里得到解答,我找不到它。我在Windows窗体上使用C#。

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

在每个圆圈中居中我需要一个数字,从" 1"开始,按时间顺序增加到无穷大(可能是1,可能是15000)。

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

我还需要添加其他内容,但如果有人能让我开始这样做,我应该能够自己弄清楚其余的事情。

我已经能够导入.pdf。但是,我发现创建一个可以绘制的透明层的任何东西,都不允许我看到背后的pdf。我是否需要这个透明层,还是可以直接在pdf上绘图?我的第二个最大的问题是如何创建圆圈,在我选择单击鼠标的任何地方按时间顺序增加数字。

提前感谢您的帮助。

请看下面的图片。

sample

1 个答案:

答案 0 :(得分:0)

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

如何自行完成此操作。祝你好运(认真 - 这不是一个容易解决的问题)。 以下是您需要首先(至少)将新内容放入现有页面所需的内容:

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

  1. 将更改(代)附加到PDF
  2. 创建内容流
  3. 为现有页面附加替换页面对象,其中内容已从Stream更改为数组(或者如果它已经是数组,则附加到其中)并且新资源已添加到资源字典中
  4. 以下是您需要首先(至少)将注释放在现有页面上的内容:

    1. 将更改(代)附加到PDF
    2. 为现有页面附加替换页面对象,其中Annots添加了新注释(或通过插入/附加新注释进行修改)
    3. 创建外观流
    4. 使用自定义外观流
    5. 创建注释

      就如何操作用户界面而言,只要您拥有PDF渲染器,就会非常直接。将页面渲染为图像并制作一个控件,使您可以在页面上单击鼠标。然后构建一个从图像坐标到PDF页面坐标的变换矩阵,并将鼠标坐标推过该矩阵。结果将是您在页面上标记的来源(请注意,某些页面会被旋转,您需要调整转换矩阵才能匹配)。

      现在,要明确的是,当我为Atalasoft编写这个库时,我已经有了几年的PDF经验(我曾在Acrobat v 1-4上工作过)。虽然我不是全职工作,但它是在10年的时间里写的。附加到现有PDF的代码需要几个月的时间才能正确完成。最终,我删除了代码,因为除了简单的更改(如注释)之外还附加了任何内容,并编写了可以使用现有内容更新重写整个PDF的代码(页面重新排序,注释,书签,页面上的新内容,编辑后的图像,等)同时脱掉任何不再需要的东西。这类似于使用循环添加和剪切有向图的部分,并且能够确保在另一端具有正确的图形。 困难的部分不在规范范围内 - 这对我来说相当简单。问题在于处理由其他工具生成的cockamamie PDF,这些工具具有各种奇怪的规范违规并正确处理。

      现在,我并不是说不要这样做。我是所有人学习新事物和学习PDF的人。那里有很多东西需要学习,还有很多有趣的想法,但你需要知道,除非你有大量的基础设施,否则PDF空间中简单的声音问题并不是微不足道的。例如," PDF中有多少页?"需要PDF扫描程序和代码来执行或解析PDF内容,以便您可以读取交叉引用表(可能是压缩的交叉引用流),文档字典(可能包括加密),最后是页面树:所有这些可以通过不合规的PDF轻易脱轨。

      如果您正在努力平衡时间和成本,请记住,您的时间远非免费,也许图书馆要做繁重的工作并不是件坏事。 iTextPdf是开源的,可以完成你需要做的所有事情,但它会花费你及时学习图书馆,但这比你自己编写PDF工具节省了很多。 Atalasoft的代码不是免费的,但编写的学习曲线比大多数图书馆都要浅。