5

Is there any way to shift / move the text inside existing pdf page to some other position?

Like there is some text at area x=100, y=100, w=100, h=100 and i want to move it to x=50, y=200, w=100, h=100.

I did a lot of research and it seems iTextSharp cannot do that. PDFSharp claims that it can be done but i could not find any examples.

One way is to make a bitmap of specific area of the text i want to shift, draw white rectangle over that area and insert bitmap at new location. I don't want to use this solution as i work with large pdf files with more than 1K pages where each page has to be altered.

What i found out is that i need to find a way to change text-positioning operators (text matrix and the text state parameters) which is not that simple.

Anyone has any ideas?

4

3 回答 3

7

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

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

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

于 2012-02-06T14:34:55.290 回答
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;
    }
于 2013-04-25T05:37:56.960 回答
-1

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

于 2012-02-05T10:32:43.630 回答