我继承了子类PDFStreamEngine
并重载了processTextPosition
,现在我可以像这样重构文本,PDFTextStripper
但是我不想处理透明文本,这通常是垃圾。
我怎么知道某些文本是否透明?
事实证明, 透明文本 实际上根本不是透明的,而只是被图像覆盖:在201103 SA的关键吸烟统计数据2010
FINAL.pdf中
,图像“
SA — 2004的关键吸烟统计数据”已被图像覆盖。显示TC标志。
下面显示了文本剥离程序类的概念证明,该类将忽略图像覆盖的文本。
public class VisibleTextStripper extends PDFTextStripper
{
public VisibleTextStripper() throws IOException
{
super();
registerOperatorProcessor("Do", new Invoke());
}
//
// Hiding operations
//
void hide(String name)
{
Matrix ctm = getGraphicsState().getCurrentTransformationMatrix();
float x = ctm.getXPosition();
float y = ctm.getYPosition();
float scaledWidth = ctm.getXScale();
float scaledHeight = ctm.getYScale();
for(List<TextPosition> characters : charactersByArticle)
{
Collection<TextPosition> toRemove = new ArrayList<TextPosition>();
for (TextPosition character : characters)
{
Matrix matrix = character.getTextPos();
float cx = matrix.getXPosition();
float cy = matrix.getYPosition();
float cw = character.getWidth();
float ch = character.getHeight();
if (overlaps(x, scaledWidth, cx, cw) && overlaps(y, scaledHeight, cy, cw))
{
System.out.printf("Hidden by '%s': X: %f; Y: %f; Width: %f; Height: %f; Char: '%s'\n", name, cx, cy, cw, ch, character.getCharacter());
toRemove.add(character);
}
}
characters.removeAll(toRemove);
}
}
private boolean overlaps(float start1, float width1, float start2, float width2)
{
if (width1 < 0)
{
start1 += width1;
width1 = -width1;
}
if (width2 < 0)
{
start2 += width2;
width2 = -width2;
}
if (start1 < start2)
{
return start1 + width1 >= start2;
}
else
{
return start2 + width2 >= start1;
}
}
//
// operator processors
//
public static class Invoke extends OperatorProcessor
{
/**
* Log instance.
*/
private static final Log LOG = LogFactory.getLog(Invoke.class);
/**
* process : Do : Paint the specified XObject (section 4.7).
* @param operator The operator that is being executed.
* @param arguments List
* @throws IOException If there is an error invoking the sub object.
*/
public void process(PDFOperator operator, List<COSBase> arguments) throws IOException
{
VisibleTextStripper drawer = (VisibleTextStripper)context;
COSName objectName = (COSName)arguments.get( 0 );
Map<String, PDXObject> xobjects = drawer.getResources().getXObjects();
PDXObject xobject = (PDXObject)xobjects.get( objectName.getName() );
if ( xobject == null )
{
LOG.warn("Can't find the XObject for '"+objectName.getName()+"'");
}
else if( xobject instanceof PDXObjectImage )
{
drawer.hide(objectName.getName());
}
else if(xobject instanceof PDXObjectForm)
{
PDXObjectForm form = (PDXObjectForm)xobject;
COSStream formContentstream = form.getCOSStream();
// if there is an optional form matrix, we have to map the form space to the user space
Matrix matrix = form.getMatrix();
if (matrix != null)
{
Matrix xobjectCTM = matrix.multiply( context.getGraphicsState().getCurrentTransformationMatrix());
context.getGraphicsState().setCurrentTransformationMatrix(xobjectCTM);
}
// find some optional resources, instead of using the current resources
PDResources pdResources = form.getResources();
context.processSubStream( context.getCurrentPage(), pdResources, formContentstream );
}
}
}
}
它适合您的示例文档。
支票
if (overlaps(x, scaledWidth, cx, cw) && overlaps(y, scaledHeight, cy, cw))
不幸的是,假设不涉及文本和图像的旋转(所有转换都汇总)。
对于通用解决方案,您必须将此测试更改为某种检查,以检查由Matrix ctm = getGraphicsState().getCurrentTransformationMatrix()
重叠转换的1x1正方形是否与由Matrix matrix = character.getTextPos()
固定宽度,高度cw = character.getWidth()
和的字符框重叠ch = character.getHeight()
。也许简单的重叠是不够的,您可能希望充分覆盖字符框。
此外,该测试忽略了图像遮罩,即图像的透明度。
问题内容: 我正在使用SQL Server,但没有足够的数据集来测试查询的性能。 我想分析查询,看看索引是否被利用。我该如何检查 问题答案: 在SQL Management Studio中,只需键入查询,然后按Control-L(显示查询执行计划)。在那里,您将能够查看是否正在使用任何索引。“表扫描”表示未使用索引。“索引扫描”是指使用索引。
问题内容: 如何使用Python和pywin32或wxPython以最简单的方式区分Windows XP和Windows Vista ? 本质上,如果当前操作系统是Vista,我需要一个将返回True的函数: 问题答案: Python具有可爱的“平台”模块来帮助您。 注意:如注释中所述,使用旧版本的python时可能不会返回正确的值。
问题内容: 我的问题很简单:如何使用来将文本放在PDF上居中? 我事先不知道字符串,我无法通过试用找到中间的字符串。字符串的宽度并不总是相同。 我需要: 一种可以使文本居中的方法,例如 一种可以给我像素宽度的字符串的方法。然后,我可以计算出中心,因为我知道PDF的尺寸。 欢迎任何帮助! 问题答案: 好的,我自己找到了答案。这是在页面上居中放置文本的方法:
问题内容: 我正在使用Selenium WebDriver,如何检查页面中是否存在某些文本?也许有人向我推荐了一些有用的资源,可供我阅读。谢谢 问题答案: 使用XPath,并不难。只需搜索包含给定文本的所有元素: 该官方文档也不是很支持的,像这样的任务,但它是基本的工具仍然。 该JavaDoc中也大,但它需要一些时间通过一切有用无用,并拿到。 要学习XPath,只需跟随Internet即可。该规范
问题内容: 运行keras脚本时,得到以下输出: 这是什么意思?我是否正在使用GPU或CPU版本的Tensorflow? 在安装keras之前,我正在使用Tensorflow的GPU版本。 还显示和没有什么像。 运行[此stackoverflow问题]中提到的命令,将得到以下信息: 问题答案: 您正在使用GPU版本。您可以列出可用的tensorflow设备(也请检查此问题): 编辑: 使用tens
当我运行keras脚本时,我得到以下输出: 这是什么意思?我是否使用GPU或CPU版本的tenstorflow? 在安装keras之前,我使用的是tensorflow的GPU版本。 另外显示了,与完全不同。 运行[this stackoverflow question]中提到的命令,可以得到以下结果: