繁体   English   中英

在具有iText7的页面上移动文本,保留字体,颜色,样式等,但更改文本大小

[英]Moving text on a page with iText7 retaining font, color, style, … but changing size of the text

我想使用iText7移动文本。 我有一个源边界框,它可以在页面上的某个地方,还有一个目标边界框,它具有固定的位置(包括宽度和高度)。 我将留在同一页面上。 源框和目标框可以重叠。 源边界框也可以大于目标框。 在这种情况下,我必须减小字体大小。 文本应保留字体,颜色等。

iText网站上有一个剪切和粘贴示例 但是,在结果pdf文件中,您可以选择新位置和旧位置的文本(仅使用普通的pdf阅读器进行尝试)。 我不希望在旧位置选择文本。

我以为,也许我可以选择文本,然后将其放在新位置,然后从旧位置删除它。 对于后者,我需要pdfSweep,但这没关系。 在新位置添加文本应该没有问题。 即使文本具有不同的字体,大小等。 iText网站上有很多示例。 我知道选择文本的唯一方法如本示例所示。 这仅给我文字。 但是要使用相同的字体,颜色等将其放置在目标位置,我也需要所有这些信息。 我知道,pdf并非用于编辑。 这在StackOverflow的答案中经常提到。 有没有办法用iText7做到这一点?

iText中没有高级API允许您移动页面内容,特别是不是某些矩形中的所有内容 原因之一可能是,总的来说,这不仅仅是移动。 PDF通常包含影响较大区域的结构,这种结构将不仅需要移动,而可以复制,并且每个副本都限于其区域。

不过,确实有可能将OP中已找到的OP与pdfSweep模块已经考虑过的剪切和粘贴示例结合在一起,以防止文本在旧位置被选中的解决方案例如:

public void moveCleanSection(PdfReader pdfReader, String targetFile, int page, Rectangle from, Rectangle to) throws IOException
{
    LicenseKey.loadLicenseFile("itextkey-multiple-products.xml");

    ByteArrayOutputStream interimMain = new ByteArrayOutputStream();
    ByteArrayOutputStream interimPage = new ByteArrayOutputStream();
    ByteArrayOutputStream interimSection = new ByteArrayOutputStream();

    try (   PdfDocument pdfMainDocument = new PdfDocument(pdfReader);
            PdfDocument pdfPageDocument = new PdfDocument(new PdfWriter(interimPage)) )
    {
        pdfMainDocument.setCloseReader(false);
        pdfMainDocument.copyPagesTo(page, page, pdfPageDocument);
    }

    try (   PdfDocument pdfMainDocument = new PdfDocument(pdfReader, new PdfWriter(interimMain));
            PdfDocument pdfSectionDocument = new PdfDocument(new PdfReader(new ByteArrayInputStream(interimPage.toByteArray())), 
            new PdfWriter(interimSection))  )
    {

        List<PdfCleanUpLocation> cleanUpLocations = new ArrayList<PdfCleanUpLocation>();
        cleanUpLocations.add(new PdfCleanUpLocation(page, from, null));
        cleanUpLocations.add(new PdfCleanUpLocation(page, to, null));

        PdfCleanUpTool cleaner = new PdfCleanUpTool(pdfMainDocument, cleanUpLocations);
        cleaner.cleanUp();

        cleanUpLocations = new ArrayList<PdfCleanUpLocation>();
        Rectangle mediaBox = pdfSectionDocument.getPage(1).getMediaBox();

        if (from.getTop() < mediaBox.getTop())
            cleanUpLocations.add(new PdfCleanUpLocation(1, new Rectangle(mediaBox.getLeft(), from.getTop(), mediaBox.getWidth(), mediaBox.getTop() - from.getTop()), null));
        if (from.getBottom() > mediaBox.getBottom())
            cleanUpLocations.add(new PdfCleanUpLocation(1, new Rectangle(mediaBox.getLeft(), mediaBox.getBottom(), mediaBox.getWidth(), from.getBottom() -  mediaBox.getBottom()), null));
        if (from.getLeft() > mediaBox.getLeft())
            cleanUpLocations.add(new PdfCleanUpLocation(1, new Rectangle(mediaBox.getLeft(), mediaBox.getBottom(), from.getLeft() - mediaBox.getLeft(), mediaBox.getHeight()), null));
        if (from.getRight() < mediaBox.getRight())
            cleanUpLocations.add(new PdfCleanUpLocation(1, new Rectangle(from.getRight(), mediaBox.getBottom(), mediaBox.getRight() - from.getRight(), mediaBox.getHeight()), null));

        cleaner = new PdfCleanUpTool(pdfSectionDocument, cleanUpLocations);
        cleaner.cleanUp();
    }

    try (   PdfDocument pdfSectionDocument = new PdfDocument(new PdfReader(new ByteArrayInputStream(interimSection.toByteArray())));
            PdfDocument pdfMainDocument = new PdfDocument(new PdfReader(new ByteArrayInputStream(interimMain.toByteArray())), new PdfWriter(targetFile)) )
    {
        float scale = Math.min(to.getHeight() / from.getHeight(), to.getWidth() / from.getWidth());
        pdfSectionDocument.getPage(1).setMediaBox(from);
        PdfFormXObject pageXObject = pdfSectionDocument.getFirstPage().copyAsFormXObject(pdfMainDocument);
        PdfPage pdfPage = pdfMainDocument.getPage(page);
        PdfCanvas pdfCanvas = new PdfCanvas(pdfPage);
        pdfCanvas.addXObject(pageXObject, scale, 0, 0, scale, (to.getLeft() - from.getLeft() * scale), (to.getBottom() - from.getBottom() * scale));
    }
}

(来自MoveSectionCleanly.java

注意:由于pdfSweep的性质,源区域边界上的文本将从源及其副本中删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM