当前位置: 首页 > 面试题库 >

iText 5.5.11-使用PdfCleanUpProcessor后粗体文本看起来模糊

吴凯
2023-03-14
问题内容

我需要从使用iText 5.5.11中的Jasper
Reports创建的现有pdf中删除一些内容,但是运行PdfCleanUpProcessor之后,所有粗体文本都变得模糊。

这是我正在使用的代码:

PdfReader reader = new PdfReader("input.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("output.pdf"));
List<PdfCleanUpLocation> cleanUpLocations = new ArrayList<PdfCleanUpLocation>();

cleanUpLocations.add(new PdfCleanUpLocation(1, new Rectangle(0f, 0f, 595f, 680f)));

PdfCleanUpProcessor cleaner = new PdfCleanUpProcessor(cleanUpLocations, stamper);
cleaner.cleanUp();

stamper.close();
reader.close();

正如这里已经讨论的那样,降级到itext-5.5.4可以解决问题,但是在我的情况下,由于其他原因,已经使用了itext-5.5.11,因此降级不是一种选择。

还有其他解决方案或解决方法吗?

这是清洁前后的pdf文件:之前
- 之后


问题答案:

通过比较文件 之前之后 ,可以清楚地看出,由于某种原因,PdfCleanUpProcessor错误地放弃了常规图形状态操作(至少
wJd )。

特别是在您的 之前 文档中, w 操作对于文本非常重要,因为使用了 穷人的粗体
变体,即,使用常规字体代替了实际的粗体字体,并且将文本呈现模式设置为不仅填充字形轮廓并沿其画一条线,使其外观大胆。

使用 w 操作将该行的宽度设置为0.23333 。作为该操作中缺少
文件,则使用默认的1宽度值。因此,沿轮廓线的线现在是以前的4倍,导致外观非常胖。

此问题已在提交d5abd23(日期为2015年5月4日)中引入,该提交(除其他事项外)将此区块添加到PdfCleanUpContentOperator.invoke

} else if (lineStyleOperators.contains(operatorStr)) {
    if ("w" == operatorStr) {
        cleanUpStrategy.getContext().setLineWidth(((PdfNumber) operands.get(0)).floatValue());
    } else if ("J" == operatorStr) {
        cleanUpStrategy.getContext().setLineCapStyle(((PdfNumber) operands.get(0)).intValue());
    } else if ("j" == operatorStr) {
        cleanUpStrategy.getContext().setLineJoinStyle(((PdfNumber) operands.get(0)).intValue());
    } else if ("M" == operatorStr) {
        cleanUpStrategy.getContext().setMiterLimit(((PdfNumber) operands.get(0)).floatValue());
    } else if ("d" == operatorStr) {
        cleanUpStrategy.getContext().setLineDashPattern(new LineDashPattern(((PdfArray) operands.get(0)),
                ((PdfNumber) operands.get(1)).floatValue()));
    }

    disableOutput = true;

这将导致全部lineStyleOperators丢弃,同时尝试将更改的值存储在清除策略上下文中。但是,当然==String在Java中使用进行比较通常是一个非常糟糕的主意,因此,从该版本开始,线型运算符在iText中已被删除。

实际上,这段代码是从iTextSharp移植过来的,在C#中==,该string类型的工作原理完全不同。尽管如此,即使在iTextSharp版本中,乍一看,似乎仅考虑了这些存储的值,如果笔划了路径,如果文本渲染包括沿轮廓笔划,则没有考虑。

稍后在提交9967627中(与上述提交在同一天),内部if..else if..else..已被删除,并带有注释 替换
为包中的PdfCleanUpGraphicsState现有内容,并向后者添加了缺少的参数GraphicsState``itext.pdf.parser
,仅disableOutput = true保留了剩余的参数。这(乍看起来)似乎已经解决了iText / Java和iTextSharp /
.Net之间的差异,但是,如果文本渲染包括沿轮廓笔划,则仍不考虑线型值。

作为解决方法,请考虑删除行

} else if (lineStyleOperators.contains(operatorStr)) {
    disableOutput = true;

来自PdfCleanUpContentOperator.invoke。现在,不再删除线型运算符,并且编辑后的PDF中的文本看起来像以前一样。不过,我尚未检查任何副作用,因此,即使考虑在生产中使用该替代方法,也请先测试大量文档。



 类似资料:
  • 我正在尝试在itext 5中使用TextField。我的字体名是“微軟正黑體英文是“Microsoft JhengHei”。我想用粗体和黑色的字体。 初始化字体(3是字体。BOLD|字体。ITALIC和BC是我的基本颜色) 我有一个文本字段变量,并将fontZh设置为setFont。 pdf结果只有字体样式、大小和颜色是正确的。但这种大胆和不自然是行不通的。

  • 问题内容: 我正在使用Apache pdfbox提取文本。我可以从pdf中提取文本,但我不知道该单词是否为粗体?(代码建议会很好!!!)这是从pdf提取纯文本的代码,可以正常工作。 问题答案: 的结果是纯文本。因此,将其提取后为时已晚。但是,您可以覆盖某些方法,只允许根据您的意愿格式化的文本通过。 在这种情况下,您必须覆盖 在您的替代中,您检查所讨论的文本是否满足您的要求(包含有关所讨论文本的很多

  • 我在Windows窗体、C#、.NET中有和。 我可以看到一个奇怪的行为:我将相同的字体设置为和,但相同的单词在那里看起来不同: 字体是Tahoma,10.25 pt。如您所见,顶部是一个,与相比,它看起来像是粗体样式。为什么会出现这种情况?我可以用此字体使我的和标签看起来相同吗?

  • 我想制作一个文本框,它看起来像上图中右边的那个。我尝试按照文档进行操作,并编写了以下代码。 上述代码输出上图左侧显示的文本框。在此方面的任何帮助都将不胜感激。

  • 在编辑文本中,用户应选择他们键入的内容是粗体、斜体还是正常。在我的情况下,当用户选择粗体时,整个编辑文本将更改为粗体,如果他再次选择斜体,则整个编辑文本将变为斜体。当用户选择粗体键入某些内容时,它应该是粗体的,当他选择斜体或正常时,他键入的单词应该是斜体或正常,而不是前一个粗体。此外,当我在编辑文本中打印输入时,即使以粗体显示,它也被正常打印。 我在底部有我的代码。 这是我将编辑文本设置为粗体或斜

  • 我使用Apache pdfbox来提取文本。我可以从pdf中提取文本,但我不知道如何知道这个词是否加粗???(代码建议很好!!!)下面是从pdf中提取纯文本的代码,效果很好。