如何将原始pdf文件字符串转换为base64?

问题描述 投票:0回答:1

我正在尝试将基本的原始 pdf 文件字符串转换为 base64。 Base64 已正确生成,但当我将其解码为实际的 pdf 文件时,无法生成该文件。

我尝试了其他几种方法,也尝试了 Charset.UTF_8 但似乎没有任何效果。

我无法使用实际的 pdf 文件,因为我从另一个服务调用获取字符串,因此它将始终是原始 pdf 文件字符串

        public String get() throws CustomException, IOException {

            String testPDf = "%PDF-1.4\n" +
                "%âãÏÓ\n" +
                "1 0 obj\n" +
                "<< /Type /Catalog\n" +
                "   /Pages 2 0 R\n" +
                ">>\n" +
                "endobj\n" +
                "2 0 obj\n" +
                "<< /Type /Pages\n" +
                "   /Kids [3 0 R]\n" +
                "   /Count 1\n" +
                ">>\n" +
                "endobj\n" +
                "3 0 obj\n" +
                "<< /Type /Page\n" +
                "   /Parent 2 0 R\n" +
                "   /Resources << /Font << /F1 << /Type /Font\n" +
                "                                /Subtype /Type1\n" +
                "                                /BaseFont /Helvetica\n" +
                "                             >> >>\n" +
                "   /MediaBox [0 0 612 792]\n" +
                "   /Contents 4 0 R\n" +
                ">>\n" +
                "endobj\n" +
                "4 0 obj\n" +
                "<< /Length 55 >>\n" +
                "stream\n" +
                "BT\n" +
                "/F1 18 Tf\n" +
                "100 100 Td\n" +
                "(Hello, World!) Tj\n" +
                "ET\n" +
                "endstream\n" +
                "endobj\n" +
                "xref\n" +
                "0 5\n" +
                "0000000000 65535 f\n" +
                "0000000018 00000 n\n" +
                "0000000077 00000 n\n" +
                "0000000175 00000 n\n" +
                "0000000451 00000 n\n" +
                "trailer\n" +
                "<< /Size 5\n" +
                "   /Root 1 0 R\n" +
                ">>\n" +
                "startxref\n" +
                "561\n" +
                "%%EOF";

        testPDf = testPDf.replaceAll("\n", "");

        testPDf = toBase64(testPDf);

        return testPDf;
    }

    public static String toBase64(String str) throws UnsupportedEncodingException {

        byte[] bytes = str.getBytes("UTF-8");
        String encoded = Base64.getEncoder().encodeToString(bytes);
        return encoded;
    }

我正在使用在线转换器来测试生成的base64。

java pdf encoding base64
1个回答
0
投票

您的编码即将完成,但有一些小错误会导致立即失败。 如果代码正确运行,结果应该在页面下方生成文本,如此处所示。

但是您需要主要根据 EOL 进行一些调整。

读取 PDF 时,它从末尾开始,因此这些外部参照值至关重要,但这取决于使用以下任一方式构建文件的方式: 或者 因此起始指针之后的预期第一个位置值会有所不同。我使用 Windows,因此我的价值观包括 。所以可能性可能是 ...0016 (nix) 或 ...0017 (win)。

xref
0 5
0000000000 65535 f
0000000017 00000 n
0000000074 00000 n
0000000143 00000 n
0000000434 00000 n
trailer
<< /Size 5
   /Root 1 0 R
>>
startxref
539
%%EOF

现在的其他问题是 Windows 中的

...f
...n
将自动以 2 字节结尾,但对于 Linux 或 Mac,它们在返回之前需要额外的空格,例如
...f \n
并且在许多情况下所有回报都需要保留。

承受这一切。您仍然会得到一个空白页,还有两个原因,其中之一是资源代码堆栈没有通过匹配的括号正确关闭。应该有3对。

   /Resources << /Font << /F1 << /Type /Font
                                /Subtype /Type1
                                /BaseFont /Helvetica
                             >> >> >>

放置文本的第二个问题是编码顺序应该像这样重新排序

position TD /font tf (text) Tj

4 0 obj
<< /Length 49 >>
stream
BT
100 100 TD
/F1 18 Tf
(Hello, World!) Tj
ET
endstream
endobj
© www.soinside.com 2019 - 2024. All rights reserved.