当前位置: 首页 > 知识库问答 >
问题:

如何在app engine-java上从GCS获取pdf文件

宗政子辰
2023-03-14

我正在google-app-Engine上运行一个应用程序。

尝试从google-cloud d-store上的pdf-file获取txt。

当我在本地运行代码时,它会成功,但当在appengine上运行时,它会在org上失败。pdfbox。例外情况。包装异常

这是我的代码:

import com.google.cloud.storage.*;
import org.pdfbox.pdfparser.PDFParser;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.util.PDFTextStripper;


public class Download {

    public static String perform(String bucket, String file) throws IOException {
        byte[] fileByte = download(bucket, file);
        String pdfFileTxt = pdf2txt(fileByte);
        return pdfFileTxt;

    }

    public static byte[] download(String bucketName, String fileId) throws IOException {
        Storage storage = StorageOptions.getDefaultInstance().getService();
        BlobId blobId = BlobId.of(bucketName, fileId);
        Blob blob = storage.get(blobId);
        return blob.getContent();
    }

    public static String pdf2txt(byte[] byteArr) throws IOException {
        InputStream stream = new ByteArrayInputStream(byteArr);
        PDFParser parser = new PDFParser(stream);
        parser.parse();
        PDDocument pdDoc = new PDDocument(parser.getDocument());
        return new PDFTextStripper().getText(pdDoc);
    }
}

代码在parser.parse();withorg.pdfbox.exceptions.WrappeIOException-没有添加其他消息:(

从存储器下载—实际上成功了。如果我记录数据,我会得到如下结果:

%PDF-1.3
%����
7 0 obj
<</Linearized 1/L 7945/O 9/E 3524/N 1/T 7656/H [ 451 137]>>
endobj

13 0 obj
<</DecodeParms<</Columns 4/Predictor 12>>/Filter/FlateDecode/ID[<4DC91A1875A6D707AEC203BB021C93A0><F6C92B368A8A13408457A1D395A37EB9>]/Index[7 21]/Info 6 0 R/Length 52/Prev 7657/Root 8 0 R/Size 28/Type/XRef/W[1 2 1]>>stream
h�bbd``b`� ��H0�  6G ��#�4�,#��Ɲ_  L��
endstream
endobj
startxref
0
%%EOF
...  more ...

现在有没有办法克服这个问题?可能使用不同的库?由于代码在appengine上运行,因此很难跟踪这些错误。

共有1个答案

安坚诚
2023-03-14

PdfBox不在GAE上运行。它使用不允许的java类。

作为一种解决方法,您可以下载一个经过修改的pdfbx jar。感谢icyerasor的回答和使用这些说明。

以下是完整的说明:

立即将此文件夹cd下载到项目目录中,并运行以下命令:

mkdir local-maven-repo

mvn deploy:deploy-file -DgroupId=org.apache.pdfbox -DartifactId=pdfbox -Dversion=1.8.0-SNAPSHOT -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=/your/path/to/download/directory/pdfbox-GAE/pdfbox-1.8.0-SNAPSHOT.jar 

mvn deploy:deploy-file -DgroupId=org.apache.pdfbox -DartifactId=fontbox -Dversion=1.8.0-SNAPSHOT -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=/your/path/to/download/directory/pdfbox-GAE/dependencies/fontbox-1.8.0-SNAPSHOT.jar

在项目添加下的pom中:

<repositories>
    <repository>
        <id>local-maven-repo</id>
        <url>file:///${project.basedir}/local-maven-repo</url>
    </repository>
</repositories>

现在在pom中编辑依赖项:

      <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging-api -->
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging-api</artifactId>
        <version>1.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging-adapters -->
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging-adapters</artifactId>
        <version>1.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>fontbox</artifactId>
        <version>1.8.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>1.8.0-SNAPSHOT</version>
    </dependency>

最后,工作代码:

import com.google.cloud.storage.*;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;

public class Download {

    public static String perform(String bucket, String file) throws Exception {
        byte[] fileByte = download(bucket, file);
        String pdfFileTxt = pdf2txt2(fileByte);
        return pdfFileTxt;
    }

    public static byte[] download(String bucketName, String fileId) throws IOException {
        Storage storage = StorageOptions.getDefaultInstance().getService();
        BlobId blobId = BlobId.of(bucketName, fileId);
        Blob blob = storage.get(blobId);
        return blob.getContent();
    }


    public static String pdf2txt2(byte[] byteArr) throws IOException {
        InputStream myInputStream = new ByteArrayInputStream(byteArr);
        PDDocument pddDoc = PDDocument.load(myInputStream);
        PDFTextStripper reader = new PDFTextStripper();
        String pageText = reader.getText(pddDoc);
        pddDoc.close();
        return pageText;
    }
}
 类似资料:
  • 我需要从网上下载PDF文件,例如 此链接。我必须使用流来做。使用图像,它的工作原理很好: 但是对于PDf,它不起作用。可能是什么问题?

  • 我有一些pdf文件,使用pdfbox我已经将它们转换为文本并存储到文本文件中,现在我要从文本文件中删除它们 超链接 我希望按如下方式逐行获取有效文本: 我们提出了一种从纯文本中提取的多词概念词进行本体学习的方法OntoGain。OntoGain遵循一个由不同处理层定义的本体学习过程。在普通术语提取的基础上,通过对提取的概念进行聚类,形成概念层次结构。然后,衍生术语“分类法”将丰富非分类关系。已经研

  • 我正在尝试简单地重命名应用引擎上的云存储文件。 在执行期间,它会返回以下错误: java.lang.NoClassDefFoundError:com/google/appengine/tools/cloudstorage/GcsFilename位于com.gaeaApplication.gaeaApplicationServlet.loadFile(gaeaApplicationservlet.j

  • 问题内容: 我需要从GCS存储桶中读取文件。我知道我必须使用GCS API /客户端库,但找不到任何与之相关的示例。 我一直在GCS文档中参考此链接: GCS客户端库。但是不能真正地削弱。如果有人可以提供一个真正有帮助的例子。谢谢。 问题答案: 好。如果您只是想从GCS中读取文件,而不是从PCollection中读取文件,而是从常规文件中读取文件,并且在使用GCS Java客户端库时遇到问题,还可

  • 我有一个简单的Spring Boot微服务,负责向/从Google Cloud Storage上传、检索和删除图像。我的服务中的get请求有以下代码: 这是我的控制器部分: 就在响应中获取图像而言,这一切都很好,但我的问题是,图像也会下载到项目的根目录中。许多图像将通过此服务上载,因此这是一个问题。我只想在响应中显示图像,而不需要下载它们。我试着玩代码,但没能让它按我想要的那样工作。

  • 在我的maven项目中,我有一个PDF文件,它位于文件夹中。我的函数从文件夹读取PDF文件,并根据用户的数据在文档中添加一些值。 此项目使用打包为文件,并在我的其他Spring Boot应用程序中用作依赖项。 在我的Spring启动项目中,我创建了将在PDF上执行一些工作的类的instace。一旦PDF文件上的所有工作都完成,并且当PDF文件保存在文件系统上时,它始终是空的(所有页面都是空白的)。