[英]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));
}
}
注意:由于pdfSweep的性质,源区域边界上的文本将从源及其副本中删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.