首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDF文档可以包含“不可访问”的内容吗?

PDF文档可以包含“不可访问”的内容吗?
EN

Stack Overflow用户
提问于 2018-04-05 10:37:29
回答 1查看 159关注 0票数 1

我正在研究Java库。

我试过了

org.apache.pdfbox

代码语言:javascript
复制
File file = new File("file.pdf");
PDDocument document = PDDocument.load(file);

// Instantiate PDFTextStripper class
PDFTextStripper pdfStripper = new PDFTextStripper();

// Retrieving text from PDF document
String text = pdfStripper.getText(document);
System.out.println(text);

// Closing the document
document.close();

com.itextpdf.text.pdf

代码语言:javascript
复制
public static final String SRC = "file.pdf";
public static final String DEST = "streams";

public static void main(final String[] args) throws IOException {
    File file = new File(DEST);
    new BruteForce().parse(SRC, DEST);
}

public void parse(final String src, final String dest) throws IOException {
    PdfReader reader = new PdfReader(src);
    PdfObject obj;
    for (int i = 1; i <= reader.getXrefSize(); i++) {
        obj = reader.getPdfObject(i);

        if ((obj != null) && obj.isStream()) {
            PRStream stream = (PRStream) obj;
            byte[] b;
            try {
                b = PdfReader.getStreamBytes(stream);
            } catch (UnsupportedPdfException e) {
                b = PdfReader.getStreamBytesRaw(stream);
            }
            FileOutputStream fos = new FileOutputStream(String.format(dest, i));
            fos.write(b);
            fos.flush();
            fos.close();
        } else {
            final PdfDictionary pdfDictionary = (PdfDictionary) obj;

            System.out.println("\t>>>>> " + pdfDictionary + "\t\t" + pdfDictionary.getKeys());

            final Set<PdfName> pdfNames = pdfDictionary.getKeys();

            for (final PdfName pdfName : pdfNames) {
                final PdfObject pdfObject = pdfDictionary.get(pdfName);
                final int type = pdfObject.type();
                switch (type) {
                case PdfObject.NULL:
                    System.out.println("\t NULL " + pdfObject);
                    break;
                case PdfObject.BOOLEAN:
                    System.out.println("\t BOOLEAN " + pdfObject);
                    break;
                case PdfObject.NUMBER:
                    System.out.println("\t NUMBER " + pdfObject);
                    break;
                case PdfObject.STRING:
                    System.out.println("\t STRING " + pdfObject);
                    break;
                case PdfObject.NAME:
                    System.out.println("\t NAME " + pdfObject);
                    break;
                case PdfObject.ARRAY:
                    System.out.println("\t ARRAY " + pdfObject);
                    break;
                case PdfObject.DICTIONARY:
                    System.out.println("\t DICTIONARY " + ((PdfDictionary)pdfObject).getKeys());
                    break;
                case PdfObject.STREAM:
                    System.out.println("\t STREAM " + pdfObject);
                    break;
                case PdfObject.INDIRECT:
                    System.out.println("\t INDIRECT " +pdfObject.getIndRef());
                    break;
                default:

                }
                System.out.println("\t\t--- " + pdfObject.type());
            }
        }
    }
}

com.snowtide.pdf

字符串pdfFilePath = "file.pdf";

代码语言:javascript
复制
    Document pdf = PDF.open(pdfFilePath);

    final List<Annotation> annotations = pdf.getAllAnnotations();
    for (final Annotation annotation : annotations) {
        System.out.println(annotation.pageNumber());
    }

    System.out.println(pdf.getAttributeMap());
    System.out.println(pdf.getAttributeKeys());
    System.out.println("=============================");

    StringBuilder text = new StringBuilder(1024);
    pdf.pipe(new OutputTarget(text));
    pdf.close();
    System.out.println(text);

我可以提取所有可见的PDF内容,包括链接,文本和图像,除了似乎是一个“水印”出现在每一页。

PDF文档可以包含“不可访问”的内容吗?

有没有办法从文件中提取所有的内容?

更新

认为“水印”是一个图像,我尝试了这个代码。

代码语言:javascript
复制
File fileW = new File("file.pdf");
PDDocument document = PDDocument.load(fileW);
PDPageTree list = document.getPages();
for (PDPage page : list) {
    PDResources pdResources = page.getResources();
    for (COSName c : pdResources.getXObjectNames()) {

        System.out.println("????? ::>>>" + c);

        PDXObject o = pdResources.getXObject(c);
        if (o instanceof org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) {
            File file = new File("Temp/" + System.nanoTime() + ".png");
            ImageIO.write(((org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) o).getImage(), "png", file);
        } else {

        }
    }
}

PDF确实包含作者的图像,但是这种方法不能达到“水印”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-05 15:47:20

OP提供的示例文档的页面内容流从第2页开始具有以下结构:

  1. 文本标题行“www.电泳-journal.com al.com Page电泳”: BT /F1 9.12 Tf 1 0 0 1 72.024 798.46 Tm /GS7 gs 0 g 0 G/GS7 TJ ET .BT 1 0 0 1 441.53 798.46 Tm (E)6(l)-10(e)-2(c)23(t)-10(r)-8(o)26(pho)26(r)-8(e)23(s)-5(i)15(s) TJ和BT 1 0 0 1 497.47 798.46 Tm和BT 1 0 0 1 72.024 787.9 Tm () TJ ET 使用普通的iText或PDFBox文本提取可以很容易地提取该文本。
  2. 文本多行页脚“收到:.所有权利保留。 BT 1 0 1 72.024 109.7 Tm (R)9(e)-2(c)23(e)-2(i)-10(v)26(e)-2(d:)41( ) TJ ET .BT 1 0 1 1 72.024 47.76 Tm (T)6(hi)-10(s)21( S )-12(a)23(r)-8(t)15(i)-10(c)23(l)-10(e)23( )13(i)-10(s)21( R )-12(由)53( )-12(c)-2(o)26(p)-25(y)53(r)-8(i)-10(g)26(ht)-10(.)-12( )-12(A)38(l)-10(l)15( R)-8(I)-10(G)26(Ht)15(S)-5(R)-8(E)23(S)-5(E)-2(R)-8(V)26(E)-2(D)26()TJ和BT 1 0 0 1 278.52 47.76 Tm () TJ和BT 1 0 0 1 72.024 37.2 Tm () TJ ET 使用普通的iText或PDFBox文本提取也可以很容易地提取该文本。
  3. 一组PDF路径创建和填充操作,使用自定义图形状态,在页面左侧形成透明的“接受的文章”: /GS8 gs 0 g 39.605 266.51 m 39.605 261.29而外仲裁248.99 248.09 c 249.94 247.41 50.704 247.08 51.649 247.08 c 52.413 247.08 53.058 247.38 53.609 247.97 c 54.191 248.54 54.548 249.82 54.729 251.77 c 55.18 251.77 55.624 251.77 56.075 251.77 c频次为244.44 49.809 244.47 46.247 245.67 c 32.719 250.33 19.255.25 5.7645 259.91 c 5.7645 260.26 5.7645 260.61 5.7645 260.95 c19.43种姓19.43 33.014 270.43 33.014 275.05 c 277.24 278.15 c acute280.36 54.729 282 c 55.18 282 55.624 282 56.075 282 c 56.075 271.35 56.075 266.003 c 55.624 266.03 55.18 266.03 266.03 266.03 c 54.623 267.64 54.303 268.75 53753 c 53.202 269.88 53.202 270.15 53.202 270.15 c c 270.15 48.97 250268.95 c专属268.15 268.15 267.31 39.605 266.51 c h 36.92 265.67 m 30.284 263.43 23.086 261.81 c 23.686 258.81 c 23.686 256.5 25.284 254.07 36.92 251.77 c 36.92 36.92 261.0436.92 c h f* . 35.361 630.34 m 35.361 630.31 631.32 637.63 633.29 c 635.27 51.18 637.63 51.18 640.31 c 51.18 643.67 643.67 645 c 48.156 646.3 46.141 647.43 43.236 648.31 c 43.48 648.62 43.962 649.24 c 47.261 648.83 c 47.261 648.8350.253 647.57 50.253 645.6 c 50.253 643.62数字表638.05 c遇阻634.76 52.413 629.63 c 49.302 627.3 45.158 626.1 39.899 626.1 c 34.203 626.1 29.802 627.33 629.71 c 23.405 632.07 21.834 635.12 21.834 638.73 c 21.834 641.8 23.048 644.3425.496 646.28 c 25.496 648.22 03649.24 649.24 c 642.94专属636.64 c h 33.258 m 33.258 634.56 33.258 638.78 33.258 643 c 31.117 642.91 29.633 642.7 28.763 642.37 c 27.417 641.87 26.341 641.14 25.571 640.16 c 24.801 639.19 24.801 638.1324.406 637.06 c 24.406 635.42 25.158 633.91 26.729 632.64 c 26.729 631.34而异630.34 c h f* (我引用的说明画出了首字母“A”和最后的“e”。) 不能使用普通的iText或PDFBox文本提取来提取这种书写,因为它既不是使用文本指令绘制的,也不是用ActualText条目标记的。(可以使用自定义的iText或PDFBox文本提取来识别后者。) 但是您可以将此写入提取为路径创建和绘制命令的序列,它由使用iText ExtRenderListener接口的实现或PDFBox PDFGraphicsStreamEngine的子类组成。
  4. 文章的实际文本内容,不透明,使用文本绘图说明。 BT /F2 10.08 Tf 1 0 1 72.024 760.78 Tm /GS7 gs 0 g (H)-7(I)8(G)16(H)-7( H)-10 6(M)-7(U)8(LTI) TJ和BT 1 0 0 1 212.98 760.78 Tm (-) TJ和BT 1 0216.1 1 216.1 760.78 Tm (O)-7(R)8(G)-7(A)8(N)32( )-130(M)15(ETA)32(BO)-6(LO)16(M)-7(I)8(C)8(S)8( )-130(I)8(N)8( N )-106(TH)-6(E)24( )-130(A)8(P)16(P)16(/)-716(S)8(1 )-106(M)-7(O)-7(U)8(S)8(E)24( M )-130(M)15(O)-7(D)8(EL)24( O )-106(O)-7(F)16( ) TJ ET 使用普通的iText或PDFBox文本提取也可以很容易地提取该文本。

因此,关于任择议定书的问题,

我可以提取所有可见的PDF内容,包括链接,文本和图像,除了似乎是一个“水印”出现在每一页。 PDF文档可以包含“不可访问”的内容吗?

该内容不是“不可触及的”,它仅仅不是使用文本绘图指令绘制的文本,而是像任意形状一样绘制的文本。

有没有办法从PDF文件中提取所有内容?

您可以提取该内容,不只是作为文本,而是作为路径创建和绘图指令的集合。每当您怀疑这样的指令实际绘制字母形状时,您可以尝试通过将这些路径呈现为位图并应用OCR来确定文本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49670286

复制
相关文章

相似问题

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