更改PDF - 文本重新定位

时间:2012-02-04 21:19:33

标签: c# pdf itextsharp pdfsharp

有没有办法转移/移动现有pdf页面内的文字到其他位置

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

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

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

我发现我需要找到一种方法来改变文本定位操作符(文本矩阵和文本状态参数),这并不是那么简单。

任何人都有任何想法?

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:1)

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

来验证元素计数

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

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;
    }

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果选择商业图书馆而不是PDFSharp,您可以尝试Amyuni PDF Creator .NetAmyuni PDF Creator ActiveX。方法IacDocument.GetObjectsInRectangle允许您检索指定矩形的所有“图形对象”,然后您可以为每个x和/或y坐标添加特定值以将这些对象移动到页。来自文档:

IacDocument.GetObjectsInRectangle Method

The GetObjectsInRectangle method gets all the objects that are in the specified rectangle.

通常的免责声明适用。