我正在尝试将基本的原始 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。
您的编码即将完成,但有一些小错误会导致立即失败。 如果代码正确运行,结果应该在页面下方生成文本,如此处所示。
但是您需要主要根据 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