首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用iText7设置高亮注释上的外观流

用iText7设置高亮注释上的外观流
EN

Stack Overflow用户
提问于 2018-12-07 14:00:27
回答 1查看 842关注 0票数 1

我有一个PDF查看器,如果它们没有外观流,就不会显示高光。我正在java中试用iText 7内核,尝试在PDF中添加高亮注释,但是这些注释没有外观流,因此我希望在将注释写入PDF文件时自己尝试添加它们。

我遇到了this的旧答案,但这是针对C#和iText 5的,我似乎不知道如何在iText 7中复制它,并取得成功的结果。

因此,我的问题是:如何在正在工作的iText 7核心中的突出显示注释上设置外观流?

我从代码中得到的最远的信息如下所示。我使用RegexBasedLocationExtrationStrategy类来查找pdf中所有搜索单词的位置。

代码语言:javascript
运行
复制
RegexBasedLocationExtractionStrategy evntlstnr = new RegexBasedLocationExtractionStrategy(pattern);
for (int pIdx = 0; pIdx < pdfDoc.getNumberOfPages(); ++pIdx) {
    final PdfPage page = pdfDoc.getPage(pIdx + 1);
    new PdfCanvasProcessor(evntlstnr).processPageContent(page);
    Collection<IPdfTextLocation> locations =  evntlstnr.getResultantLocations();
    for (IPdfTextLocation location : locations) {
        Rectangle rect = location.getRectangle();
        // Specify quad points in Z-like order
        // [0,1] x1,y1   [2,3] x2,y2
        // [4,5] x3,y3   [6,7] x4,y4
        float[] quads = new float[8];
        quads[0] = rect.getX();
        quads[1] = rect.getY() + rect.getHeight();
        quads[2] = rect.getX() + rect.getWidth();
        quads[3] = quads[1];
        quads[4] = quads[0];
        quads[5] = rect.getY();
        quads[6] = quads[2];
        quads[7] = quads[5];

        Color highlightColor = new DeviceRgb(0f, 0f, 1f);
        PdfTextMarkupAnnotation highlight = PdfTextMarkupAnnotation.createHighLight(rect, quads);
        highlight.setColor(highlightColor);


        Rectangle appearRect = new Rectangle(0f, 0f, rect.getWidth(), rect.getHeight());                            
        PdfFormXObject appearObj = new PdfFormXObject(appearRect);                                                        
        final PdfResources appearRes = appearObj.getResources();

        PdfExtGState extGState = new PdfExtGState();
        extGState.setBlendMode(PdfExtGState.BM_MULTIPLY);
        appearRes.addExtGState(extGState);
        appearObj.setBBox(new PdfArray(new float[] {0f, 0f, rect.getWidth(), rect.getHeight()}));

        PdfShading appearShading = new PdfShading.Axial(highlightColor.getColorSpace(), 0f, 0f, highlightColor.getColorValue(), 1f, 1f, highlightColor.getColorValue());                                                     
        appearRes.addShading(appearShading);

        appearRes.addColorSpace(highlightColor.getColorSpace());                            

        PdfAnnotationAppearance appearance = new PdfAnnotationAppearance(appearObj.getPdfObject());
        highlight.setNormalAppearance(appearance);
        highlight.setFlag(PdfAnnotation.PRINT);
        page.addAnnotation(highlight);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-10 12:04:13

利用塞缪尔的回答,我无意中找到了一个可行的答案。

我并不期望在PDF标准和这个框架(iText)中,但基于下面的工作示例,我的假设是,当查看器无法呈现注释(因为它们没有外观流)时,我试图为高亮显示编写的矩形是一个粗略的回退方法,用于“伪造”突出显示矩形。意识到这两个操作没有链接,我来看下面的工作示例。希望这对未来的其他人有所帮助。

代码语言:javascript
运行
复制
RegexBasedLocationExtractionStrategy evntlstnr = new RegexBasedLocationExtractionStrategy(pattern);
for (int pIdx = 0; pIdx < pdfDoc.getNumberOfPages(); ++pIdx) {
    final PdfPage page = pdfDoc.getPage(pIdx + 1);
    new PdfCanvasProcessor(evntlstnr).processPageContent(page);
    Collection<IPdfTextLocation> locations =  evntlstnr.getResultantLocations();
    for (IPdfTextLocation location : locations) {
        Rectangle rect = location.getRectangle();
        // Specify quad points in Z-like order
        // [0,1] x1,y1   [2,3] x2,y2
        // [4,5] x3,y3   [6,7] x4,y4
        float[] quads = new float[8];
        quads[0] = rect.getX();
        quads[1] = rect.getY() + rect.getHeight();
        quads[2] = rect.getX() + rect.getWidth();
        quads[3] = quads[1];
        quads[4] = quads[0];
        quads[5] = rect.getY();
        quads[6] = quads[2];
        quads[7] = quads[5];

        Color highlightColor = new DeviceRgb(1f, 1f, 0f);                                                                                                                           

        PdfTextMarkupAnnotation highlight = PdfTextMarkupAnnotation.createHighLight(rect, quads);
        highlight.setColor(highlightColor); 
        highlight.setFlag(PdfAnnotation.PRINT);
        page.addAnnotation(highlight);                            

        PdfCanvas canvas = new PdfCanvas(page);
        PdfExtGState extGState = new PdfExtGState();
        extGState.setBlendMode(PdfExtGState.BM_MULTIPLY);
        canvas.setExtGState(extGState);
        canvas.rectangle(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight());
        canvas.setFillColor(highlightColor);
        canvas.fill();                            
        canvas.release();                                                        
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53671074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档