考虑以下情况; 我有一个包含以下行的 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
。java
是斜体,具有 Nunito
字体。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],只要它能解决这个特定问题。