关于 c#:Alter PDF – 文本重新定位

Alter PDF - Text repositioning

有没有办法将现有 pdf 页面内的文本移动/移动到其他位置?

就像在 x=100, y=100, w=100, h=100 区域有一些文本,我想将它移动到 x=50, y=200, w=100, h=100。

我做了很多研究,似乎 iTextSharp 做不到。 PDFSharp 声称可以做到,但我找不到任何示例。

一种方法是制作我想要移动的文本的特定区域的位图,在该区域上绘制白色矩形并在新位置插入位图。我不想使用此解决方案,因为我处理的大型 pdf 文件超过 1K 页,其中每个页面都必须更改。

我发现我需要找到一种方法来更改文本定位运算符(文本矩阵和文本状态参数),这并不简单。

有人有什么想法吗?


我认为,如果所有 PDF 文件都来自同一个应用程序的简单(不复杂)文件,则可以做到这一点。
如果你需要这个,例如一个用户可以上传文件的网站,然后最好忘记它:你永远不会得到一个可以完美处理任何 PDF 文件的解决方案。

PDFsharp 可以提供帮助 - 但 AFAIK PDFsharp 只能完成您需要的一半。 PDFsharp 将为您提供构成 PDF 文件的块。您必须解析块以找到绘图指令,检查位置并重新定位它们。
有些应用程序甚至不绘制单词,因此可以将诸如"Hello"这样的简单单词绘制成 3 个块(可能是"He"、"ll"和"o")。您可能需要注意这一点;如果所有文件都来自同一个应用程序,则可能不会。

我认为此处显示的用于提取文本的代码可能会有所帮助:
http://forum.pdfsharp.net/viewtopic.php?p=4010#p4010
要重新定位文本,您必须首先找到它 - 仍然需要做很多额外的工作...


您可以使用 Page.Contents.Elements.RemoveAt(8) 删除对象
通过检查 Page.Contents.Elements.Count.

来验证元素计数

您可以获取每个元素的字符串值(进行一些字符串验证)您可以获取如下数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static string GetElementStream(PdfPage page, int elementIndex)
    {
        string strStreamValue;
        byte[] streamValue;
        strStreamValue ="";

        if (page.Contents.Elements.Count >= elementIndex)
        {
            PdfDictionary.PdfStream stream = page.Contents.Elements.GetDictionary(elementIndex).Stream;
            streamValue = stream.Value;

            foreach (byte b in streamValue)
            {
                strStreamValue += (char)b;
            }
        }
        return strStreamValue;
    }

或者您可以在新位置绘制并创建一个只读文本表单