【问题标题】:itext7 stamp and redact annotation not workingitext7戳和编辑注释不起作用
【发布时间】:2018-08-17 01:30:59
【问题描述】:

代码如下。它改编自标准 itext 7 示例以添加 PdfRedactAnnotation。链接注释有效,但戳记和编辑无效。我正在使用的 PDF 链接为 here。任何人都知道为什么这不起作用?是关于 PDF 的吗?

我的最终目标是在部分文本上放置一些白色矩形,以便在打印时不会显示文本。

import java.io.File;
import java.nio.file.Paths;

import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfName;
import com.itextpdf.kernel.pdf.PdfNumber;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.action.PdfAction;
import com.itextpdf.kernel.pdf.annot.PdfAnnotation;
import com.itextpdf.kernel.pdf.annot.PdfLinkAnnotation;
import com.itextpdf.kernel.pdf.annot.PdfRedactAnnotation;
import com.itextpdf.kernel.pdf.annot.PdfStampAnnotation;

public class AddRotatedAnnotation {
    static final String SRC = Paths.get("calendar_2018-08-04_2018-08-19.pdf").toString();
    static final String DEST = Paths.get("calendar_clean.pdf").toString();


    public static void main(String[] args) throws Exception {
        File file = new File(DEST);
        file.getParentFile().mkdirs();
        new AddRotatedAnnotation().manipulatePdf(DEST);
    }

    protected void manipulatePdf(String dest) throws Exception {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(DEST));

        PdfAction action = PdfAction.createURI("http://pages.itextpdf.com/ebook-stackoverflow-questions.html");
        Rectangle linkLocation1 = new Rectangle(30, 770, 90, 30);
        PdfAnnotation link1 = new PdfLinkAnnotation(linkLocation1)
                .setHighlightMode(PdfAnnotation.HIGHLIGHT_INVERT)
                .setAction(action)
                .setColor(ColorConstants.RED.getColorValue());
        pdfDoc.getFirstPage().addAnnotation(link1);

        Rectangle linkLocation2 = new Rectangle(30, 670, 30, 90);
        PdfAnnotation link2 = new PdfRedactAnnotation(linkLocation2)
                .setColor(ColorConstants.BLACK.getColorValue());
        pdfDoc.getFirstPage().addAnnotation(link2);

        Rectangle linkLocation3 = new Rectangle(150, 770, 90, 30);
        PdfAnnotation stamp1 = new PdfStampAnnotation(linkLocation3)
                .setStampName(new PdfName("Confidential"))
                .setContents("Landscape").setColor(ColorConstants.BLACK.getColorValue());
        pdfDoc.getFirstPage().addAnnotation(stamp1);

        Rectangle linkLocation4 = new Rectangle(150, 670, 90, 90);
        PdfAnnotation stamp2 = new PdfStampAnnotation(linkLocation4)
                .setStampName(new PdfName("Confidential"))
                .setContents("Portrait")
                .put(PdfName.Rotate, new PdfNumber(90));
        pdfDoc.getFirstPage().addAnnotation(stamp2);

        Rectangle linkLocation5 = new Rectangle(250, 670, 90, 90);
        PdfAnnotation stamp3 = new PdfStampAnnotation(linkLocation5)
                .setStampName(new PdfName("Confidential"))
                .setContents("Portrait")
                .put(PdfName.Rotate, new PdfNumber(45));
        pdfDoc.getFirstPage().addAnnotation(stamp3);

        pdfDoc.close();
    }
}

【问题讨论】:

  • “但是戳记和编辑的不起作用。” - 它们在哪些方面不起作用?您的程序是否卡在该代码中?它会抛出一些异常吗?电脑会爆炸吗?
  • 戳记不可见,并且编辑不覆盖任何文本。

标签: java itext itext7


【解决方案1】:

通过运行 OP 的代码,问题显而易见:

  • 在 PDF 查看器中,注释基本上是透明的;取决于查看者,可以选择它们或显示它们的弹出窗口;
  • 在打印输出中完全没有注释。

这些问题可以单独修复:

  • 注释需要外观流才能正常显示和
  • 他们需要将各自的 PRINT 标志设置为在打印输出中可见。

我相应地增强了您的注释link2stamp1link2xstamp1x

Rectangle linkLocation2x = new Rectangle(150, 470, 30, 90);
PdfAnnotation link2x = new PdfRedactAnnotation(linkLocation2x)
        .setColor(ColorConstants.BLACK.getColorValue());
PdfFormXObject formN = new PdfFormXObject(linkLocation2x);
PdfCanvas canvasN = new PdfCanvas(formN, pdfDoc);
canvasN.setFillColorGray(1)
       .rectangle(linkLocation2x.getX(), linkLocation2x.getY(), linkLocation2x.getWidth(), linkLocation2x.getHeight())
       .fill();
link2x.setNormalAppearance(formN.getPdfObject());
link2x.setFlag(PdfAnnotation.PRINT);
pdfDoc.getFirstPage().addAnnotation(link2x);

Rectangle linkLocation3x = new Rectangle(150, 370, 90, 30);
PdfAnnotation stamp1x = new PdfStampAnnotation(linkLocation3x)
        .setStampName(new PdfName("Confidential"))
        .setContents("Landscape").setColor(ColorConstants.BLACK.getColorValue());
formN = new PdfFormXObject(linkLocation3x);
canvasN = new PdfCanvas(formN, pdfDoc);
canvasN.setFillColorGray(1)
       .rectangle(linkLocation3x.getX(), linkLocation3x.getY(), linkLocation3x.getWidth(), linkLocation3x.getHeight())
       .fill();
stamp1x.setNormalAppearance(formN.getPdfObject());
stamp1x.setFlag(PdfAnnotation.PRINT);
pdfDoc.getFirstPage().addAnnotation(stamp1x);

如果您这样做不仅是为了打印而且是为了分发电子 PDF,您应该添加编校注释然后运行编校,例如使用 iText 7 pdfSweep add-on,实际删除该信息,而不仅仅是覆盖它。

【讨论】:

  • 这覆盖了文本,但它显示为白色而不是黑色。虽然 link2x 确实涵盖了我想要的文本。出乎意料的是,我需要注释和注释的画布。我本来希望注释自己做到这一点。
  • “但它显示为白色而不是黑色” - 我使用白色填充该区域:canvasN.setFillColorGray(1)。对于黑色,请改用canvasN.setFillColorGray(0)
  • @Jon 我使用白色是因为在你的问题中你说 “我的最终目标是在部分文本上放置一些 white 矩形,这样文本就不会”打印时不显示。”
  • @Jon “我本来希望注释自己这样做。” - 问题在于 不清楚用户想要哪种注释外观编校注释本身并不是为了隐藏要编校的数据,它们是为了标记它以便一个实际的编校工具(例如pdfSweep)知道要删除哪些内容。标记数据外观可能会也可能不会隐藏它,它甚至可能会框住或以其他方式强调它......
猜你喜欢
  • 1970-01-01
  • 2013-08-21
  • 2014-08-14
  • 1970-01-01
  • 2020-05-06
  • 2021-09-28
  • 1970-01-01
  • 2013-09-20
  • 2020-10-09
相关资源
最近更新 更多