Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改PDF-文本重新定位_C#_Pdf_Itextsharp_Pdfsharp - Fatal编程技术网

C# 更改PDF-文本重新定位

C# 更改PDF-文本重新定位,c#,pdf,itextsharp,pdfsharp,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文件,每个页面都需要修改 我发现我需要找到一种方法来改变文本定

是否有方法将现有pdf页面中的文本移动到其他位置

比如在x=100,y=100,w=100,h=100区域有一些文本,我想把它移到x=50,y=200,w=100,h=100

我做了很多研究,但似乎
iTextSharp
做不到这一点
PDFSharp
声称这是可以做到的,但我找不到任何例子

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

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


有人有什么想法吗?

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

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

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

我认为这里显示的用于提取文本的代码可能会有所帮助:


要重新定位文本,首先必须找到它-还需要大量额外的工作…

您可以使用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;
    }

这是针对单个pdf,还是需要为任意pdf移动文本?用户可以选择要移动的文本区域(矩形)。它适用于单个pdf及其所有页面。