2015-02-06 68 views
1

我的目标是移动PDF中的文本,该文本位于特定的矩形区域内。有一个在stackoverflow上的项目,这已经让我接近这个: iText or iTextSharp rudimentary text edititext或itextsharp - 在现有PDF中移动文本

但是,我会回来操纵PDF在一个非常基本的水平。是否有机会使用itext的更高级别的工具来改变文本的位置?恐怕没有简单的解决方案,但我很乐意提供一些建议。 PS:还要记住,我只想在矩形区域内移动文本,即匹配原始PDF区域的文本(块)应该在其x和y坐标中移动一些。我对PDF的创建方式没有影响,我可以接受一个只能模糊的解决方案。

+0

只是要清楚:你想要在矩形区域内移动文本。这是否意味着您知道该矩形的**坐标**,并且您想要看起来好像该矩形已被剪切并放置在另一个位置? – 2015-02-06 15:02:42

+0

不,不是图形效果。它可能会更加混乱。我有坐标,并且我发现“在”内的任何文本块都应该在x和y轴上移动给定数量的点。我发​​誓我上下读了你的书,但仍然无法将我的头围绕在工作流程中这个任务:) – 2015-02-06 19:10:37

+1

你说*不*但有什么区别? – mkl 2015-02-06 20:00:31

回答

1

我以为我理解你的问题,但你对我的反问题的回答是令人困惑的,所以让我给你一个解释你的问题的例子。

假设你有这样的文字: enter image description here

我也有一个矩形的坐标:new Rectangle(100, 500, 200, 600);和偏移:在矩形移动所有10个点的左侧和2点的底部,像这样:

enter image description here

这是很容易实现的。看看在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(); 
} 

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

+1

Geesh,这确实是我需要的解决方案。我的回应是基于这样一个假设,即实际的“剔除”效应确实更难以实现。但它也适合我的任务。非常感谢您提供解决方案和示例。我刚回到书中,也许我自己可以想出解决方案,但我无法将它拼凑在一起。 – 2015-02-07 16:07:50

相关问题