【问题标题】:itext or itextsharp - move text in an existing PDFitext 或 itextsharp - 在现有 PDF 中移动文本
【发布时间】:2015-02-06 14:47:10
【问题描述】:

我的目标是在某个矩形区域内移动 PDF 中的文本。 stackoverflow 上有一个现有的项目,它已经让我接近实现这一目标: iText or iTextSharp rudimentary text edit

但是,我会回到非常基础的水平来操作 PDF。是否有机会使用更高级别的 itext 工具来改变文本的位置?恐怕没有简单的解决方案,但我很乐意得到一些建议。

PS:还请记住,我只想在矩形区域内移动文本,即与原始 PDF 中的区域匹配的文本(块)应在其 x 和 y 坐标中移动一些。我对 PDF 的创建方式没有任何影响,我可以接受一个只能勉强工作的解决方案。

【问题讨论】:

  • 明确一点:您想在矩形区域内移动文本。这是否意味着您知道该矩形的坐标,并且您希望获得一种看起来好像该矩形被剪切并放置在另一个位置的效果?
  • 不,不是图形效果。它可能会更混乱。我有坐标,我在“内部”找到的任何文本块都应在 x 和 y 轴上移动给定数量的点。我发​​誓我上下读过你的书,但仍然无法理解工作流程这个任务:)
  • 你说no但是有什么区别呢?

标签: pdf itextsharp itext editing


【解决方案1】:

我以为我理解了你的问题,但你对我的反问题的回答令人困惑,所以让我举一个例子,在我解释它时回答你的问题。

假设您有这样的文本:

我还有一个矩形的坐标:new Rectangle(100, 500, 200, 600); 和一个偏移量:将该矩形中的所有内容向左移动 10 个点,向底部移动 2 个点,如下所示:

这很容易实现。看看CutAndPaste 的例子:

public void manipulatePdf(String src, String dest)
    throws IOException, DocumentException {
    // Creating a reader
    PdfReader reader = new PdfReader(src);
    // step 1
    Rectangle pageSize = reader.getPageSize(1);
    Rectangle toMove = new Rectangle(100, 500, 200, 600);
    Document document = new Document(pageSize);
    // step 2
    PdfWriter writer
        = PdfWriter.getInstance(document, new FileOutputStream(dest));
    // step 3
    document.open();
    // step 4
    PdfImportedPage page = writer.getImportedPage(reader, 1);
    PdfContentByte cb = writer.getDirectContent();
    PdfTemplate template1 = cb.createTemplate(pageSize.getWidth(), pageSize.getHeight());
    template1.rectangle(0, 0, pageSize.getWidth(), pageSize.getHeight());
    template1.rectangle(toMove.getLeft(), toMove.getBottom(),
            toMove.getWidth(), toMove.getHeight());
    template1.eoClip();
    template1.newPath();
    template1.addTemplate(page, 0, 0);
    PdfTemplate template2 = cb.createTemplate(pageSize.getWidth(), pageSize.getHeight());
    template2.rectangle(toMove.getLeft(), toMove.getBottom(),
            toMove.getWidth(), toMove.getHeight());
    template2.clip();
    template2.newPath();
    template2.addTemplate(page, 0, 0);
    cb.addTemplate(template1, 0, 0);
    cb.addTemplate(template2, -20, -2);
    // step 4
    document.close();
    reader.close();
}

如果这不是你想要的。如果您想检测实际单词并移动这些单词,那么您就有问题了。在这种情况下,我们谈论的项目可能很容易花费几个月的时间才能正确完成,而您的简短问题在很大程度上不足以知道在可以想象的许多边缘情况下该怎么做。

【讨论】:

  • 天哪,这确实是我需要的解决方案。我的回答是基于这样一个假设,即实际的“剪切”效果确实更难以实现。但它也适合我的任务。非常感谢您提供的解决方案和示例。我刚刚回到书上,也许我可以自己想出解决方案,但我无法将它拼凑起来。
【解决方案2】:

上面的代码相同,但在 C# 中,带有命名空间:

        // Creating a reader
        iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(src);

        // step 1
        Rectangle pageSize = reader.GetPageSize(1);
        Rectangle toMove = new Rectangle(100, 500, 200, 600);
        Document document = new Document(pageSize);

        // step 2
        iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, new FileStream(dest, FileMode.Create));

        // step 3
        document.Open();

        // step 4
        iTextSharp.text.pdf.PdfImportedPage page = writer.GetImportedPage(reader, 1);
        iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent;
        iTextSharp.text.pdf.PdfTemplate template1 = cb.CreateTemplate(pageSize.Width, pageSize.Height);

        template1.Rectangle(0, 0, pageSize.Width, pageSize.Height);
        template1.Rectangle(toMove.Left, toMove.Bottom, toMove.Width, toMove.Height);
        template1.EoClip();
        template1.NewPath();
        template1.AddTemplate(page, 0, 0);

        iTextSharp.text.pdf.PdfTemplate template2 = cb.CreateTemplate(pageSize.Width, pageSize.Height);

        template2.Rectangle(toMove.Left, toMove.Bottom, toMove.Width, toMove.Height);
        template2.Clip();
        template2.NewPath();
        template2.AddTemplate(page, 0, 0);
        cb.AddTemplate(template1, 0, 0);
        cb.AddTemplate(template2, -20, -2);

        // step 5
        document.Close();
        reader.Close();

【讨论】:

    猜你喜欢
    • 2014-03-04
    • 2017-05-10
    • 1970-01-01
    • 2014-05-03
    • 2011-04-28
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多