【发布时间】:2018-02-15 05:37:56
【问题描述】:
我正在尝试使用 PDFBox 从 pdf 文件中提取带有坐标的文本。
我混合了一些在互联网上找到的方法/信息(stackoverflow 也是),但我的坐标问题似乎不正确。例如,当我尝试使用坐标在 tex 上绘制矩形时,矩形会在其他地方绘制。
这是我的代码(请不要评判风格,写得很快就是为了测试)
TextLine.java
import java.util.List;
import org.apache.pdfbox.text.TextPosition;
/**
*
* @author samue
*/
public class TextLine {
public List<TextPosition> textPositions = null;
public String text = "";
}
myStripper.java
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.TextPosition;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author samue
*/
public class myStripper extends PDFTextStripper {
public myStripper() throws IOException
{
}
@Override
protected void startPage(PDPage page) throws IOException
{
startOfLine = true;
super.startPage(page);
}
@Override
protected void writeLineSeparator() throws IOException
{
startOfLine = true;
super.writeLineSeparator();
}
@Override
public String getText(PDDocument doc) throws IOException
{
lines = new ArrayList<TextLine>();
return super.getText(doc);
}
@Override
protected void writeWordSeparator() throws IOException
{
TextLine tmpline = null;
tmpline = lines.get(lines.size() - 1);
tmpline.text += getWordSeparator();
super.writeWordSeparator();
}
@Override
protected void writeString(String text, List<TextPosition> textPositions) throws IOException
{
TextLine tmpline = null;
if (startOfLine) {
tmpline = new TextLine();
tmpline.text = text;
tmpline.textPositions = textPositions;
lines.add(tmpline);
} else {
tmpline = lines.get(lines.size() - 1);
tmpline.text += text;
tmpline.textPositions.addAll(textPositions);
}
if (startOfLine)
{
startOfLine = false;
}
super.writeString(text, textPositions);
}
boolean startOfLine = true;
public ArrayList<TextLine> lines = null;
}
AWT 按钮上的点击事件
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
try {
File file = new File("C:\\Users\\samue\\Desktop\\mwb_I_201711.pdf");
PDDocument doc = PDDocument.load(file);
myStripper stripper = new myStripper();
stripper.setStartPage(1); // fix it to first page just to test it
stripper.setEndPage(1);
stripper.getText(doc);
TextLine line = stripper.lines.get(1); // the line i want to paint on
float minx = -1;
float maxx = -1;
for (TextPosition pos: line.textPositions)
{
if (pos == null)
continue;
if (minx == -1 || pos.getTextMatrix().getTranslateX() < minx) {
minx = pos.getTextMatrix().getTranslateX();
}
if (maxx == -1 || pos.getTextMatrix().getTranslateX() > maxx) {
maxx = pos.getTextMatrix().getTranslateX();
}
}
TextPosition firstPosition = line.textPositions.get(0);
TextPosition lastPosition = line.textPositions.get(line.textPositions.size() - 1);
float x = minx;
float y = firstPosition.getTextMatrix().getTranslateY();
float w = (maxx - minx) + lastPosition.getWidth();
float h = lastPosition.getHeightDir();
PDPageContentStream contentStream = new PDPageContentStream(doc, doc.getPage(0), PDPageContentStream.AppendMode.APPEND, false);
contentStream.setNonStrokingColor(Color.RED);
contentStream.addRect(x, y, w, h);
contentStream.fill();
contentStream.close();
File fileout = new File("C:\\Users\\samue\\Desktop\\pdfbox.pdf");
doc.save(fileout);
doc.close();
} catch (Exception ex) {
}
}
有什么建议吗?我做错了什么?
【问题讨论】:
-
我还没看懂你的代码(现在必须去睡觉了)。请注意,在 PDF 中,y = 0 是底部,而不是顶部。这是一个示例,可能有助于理解如何使用文本提取坐标:svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/…
-
您是否尝试过将
PDPageContentStream构造函数与另一个布尔参数resetContext一起使用并将其设置为true? -
是的,我知道 0 是底部,这就是我使用 .getTextMatrix().getTranslateY() 而不是 getY() 或 getYDirAdj() 的原因。我尝试使用 resetContext 但没有帮助。现在我去看看那个源代码,我会更新的,谢谢
-
我刚刚测试了您的代码,它在示例 PDF 上确实可以正常工作(嗯,它只涵盖了从基线向上的文本,但这是意料之中的)。因此,矩形在在别处绘制的 PDF 中存在一些不同。如果您使用我在之前的评论中指出的
PDPageContentStream,我认为这将得到解决。但是,如果没有您观察到该问题的示例 PDF,我无法确定。因此,请分享一个示例 PDF。 -
我尝试了您链接中的代码。它正在工作,但是在 PNG 上绘制形状,而不是在流上绘制矩形。我正在尝试将形状转换为矩形,但我遇到了一些困难 ^^'' 无论如何 PDF 就是这个:download-a.akamaihd.net/files/media_mwb/b7/mwb_I_201711.pdf 我想是关于字体或字体转换的东西