替换 pdf 中的给定字符串,保持原始样式

问题描述 投票:0回答:1

考虑以下情况; 我有一个包含以下行的 pdf -

line 1: I love to **write** code
line 2: I love to write *java* code
line 3: I love to write java code that replaces some texts(underline) in pdf.

在第 1 行,

write
为粗体,字体为
Arial

在第 2 行,
java
是斜体,具有
Nunito
字体。
在第 3 行,
texts
带有下划线,字体为
Times New Roman

我正在尝试的是替换

write
check

java
perl

texts
words

保持每个字体和样式完全相同。我一直在尝试使用
Itext7
java
库来实现这一目标,并浏览了 SO、博客和书籍上的大量资源,但没有一个满足我的确切要求。

到目前为止,我可以用相同的字体替换 pdf 中的给定单词(如果 pdf 仅包含一种字体)。虽然提取的字体大小与原始大小不同,但我必须手动放置它。

public static void main(String[] args) throws IOException {

     PdfReader reader = new PdfReader(SOURCE);
     PdfWriter writer = new PdfWriter(DESTINATION);
     PdfDocument pdfDocument = new PdfDocument(reader, writer);

     TextPropertiesExtractionStrategy extractionStrategy = new TextPropertiesExtractionStrategy();
            new PdfCanvasProcessor(extractionStrategy).processPageContent(pdfDocument.getPage(1));
     System.out.println("Font Name: " + extractionStrategy.getFontName());
     System.out.println("Font Size: " + extractionStrategy.getFontSize());
     System.out.println("Text Color: " + extractionStrategy.getTextColor().getColorSpace().toString());

}

private static class TextPropertiesExtractionStrategy implements ITextExtractionStrategy {
        private String fontName;
        private float fontSize;
        private Color textColor;
        private PdfFont font;

        @Override
        public void eventOccurred(IEventData data, EventType type) {
            if (data instanceof TextRenderInfo) {
                TextRenderInfo textRenderInfo = (TextRenderInfo) data;

                // Get font information
                font = textRenderInfo.getFont();
                fontName = font.getFontProgram().getFontNames().getFontName();
                fontSize = textRenderInfo.getFontSize();

                // Get text color information
                textColor = textRenderInfo.getFillColor();
            }
        }

        @Override
        public Set<EventType> getSupportedEvents() {
            return null;
        }

        @Override
        public String getResultantText() {
            return null;
        }

        public String getFontName() {
            return fontName;
        }

        public float getFontSize() {
            return fontSize;
        }

        public PdfFont getFont() {
            return font;
        }

        public Color getTextColor() {
            return textColor;
        }
    }

我对任何其他开源库或语言都持开放态度,例如 python [我也尝试过 MuPdf],只要它能解决这个特定问题。

java pdf itext itext7
1个回答
0
投票

忽略语言 PDF 的构建方式通常不适合组件的本机编辑。编辑器需要基本上替换现有条目并编写新内容。进行第一个更改,其中

w r it e
需要更改为
check
。 “应该很容易”,它不是嵌入字体,并且是相同数量的二进制数字(字节),可能会出现什么问题?

因此,字体位置完全被比例字体的字符宽度改变所打乱,因此编辑需要将整个文本块视为全新的。

好吧,让我们更改块样式,然后我们立即明白为什么您不能简单地替换样式字体中的字母,因为它们不会放置在正确的间距处。

因此,更改 PDF 文本的最有效方法是使用平视 GUI 文字处理器,其中这些中断和其他中断都可以通过人类判断来补偿。

© www.soinside.com 2019 - 2024. All rights reserved.