无法在java中处理和写入来自PDF响应的pdf文件

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

我正在尝试将 docx 转换为 pdf,微软图表已经提供了该功能,但问题是我收到了一个 PDF 响应,内容类型“application/pdf”作为来自微软图表的字符串/文本。我知道响应是正确的,因为 PDF 在 Postman 中正确可见,但是当我尝试用 java 代码手动将其写入文件时,我无法正确执行此操作。

我能够创建页数正确的 PDF 文件,但 pdf 全部是空白页。

响应正文有类似这样的文本:

%PDF-1.7
%����
1 0 obj
<</Type/Catalog/Pages 2 0 R/Lang(en) /StructTreeRoot 466 0 R/Outlines 420 0 R/MarkInfo<</Marked true>>/Metadata 3921 0 R/ViewerPreferences 3922 0 R>>
endobj
2 0 obj
<</Type/Pages/Count 135/Kids[ 3 0 R 15 0 R 19 0 R 25 0 R 26 0 R 29 0 R 31 0 R 32 0 R 33 0 R 36 0 R 37 0 R 38 0 R 40 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R 153 0 R 154 0 R 155 0 R 156 0 R 157 0 R 159 0 R 161 0 R 166 0 R 170 0 R 171 0 R 172 0 R] >>
endobj
3 0 obj
<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 9 0 R>>/ExtGState<</GS7 7 0 R/GS8 8 0 R>>/XObject<</Image11 11 0 R/Image13 13 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 4 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 0>>
endobj
4 0 obj
<</Filter/FlateDecode/Length 702>>
stream
x���Qo�0�ߑ��h��`� U����2-R�0���Mi�D�����~g�6�   +Mh"Y`|�w�;�=YU�]<����=��x~��•�=��{/�<��"wg�7����ķ�������-�Q�%h!����༞\%�����y�0�-��c���Иk4��1����|�a�`[,�`}vn[W�k����)��|>�̣�o�u��h+��5��p"D������N[�f�ˏ�/�2��

我的代码:


            response= rest.get(url){
                header "Authorization", "Bearer "+updateBulkPublishPdfDetailsData.sharepointAccessToken
            }
RestResponse resp=sharepointUploadSummaryResponse.getResponseEntity()
            if(resp.getHeaders().getContentType().toString()=="application/pdf"){
                String pdfString=resp.body;
                FileOutputStream out = new FileOutputStream(new File("C:\\Users\\faizanahemad.shaikh\\Downloads\\abcd.pdf"));
                out.write(pdfString.getBytes());
                out.flush();
                out.close();
            }

基本上我使用的是groovy grails,但是java解决方案可以工作,我也尝试了所有可用的解决方案,例如将其作为blob接收或直接将其作为字节数组接收或将其转换为输入流并写入它,但它们都不起作用,有趣的是我知道我收到了正确的回复,因为我可以从邮递员那里很好地下载它。

我还注意到,在邮递员中,从响应创建的文件的大小要大一些,例如: 我创建的文件大小为 1487 KB,但我从邮递员下载的文件有 1563 KB,邮递员和我的应用程序都收到相同大小的数据,两者的内容长度相同:1599780

回应:

我知道我在处理和写入文件时犯了一些错误

java pdf grails microsoft-graph-api microsoft-graph-files
1个回答
0
投票

我无法找到确切的解决方案,但由于我想通过 Microsoft Graph 将 docx 转换为 PDF,因此我能够使用 Microsoft Graph Java SDK 解决它。使用 Microsoft Graph SDK,我能够将转换后的 PDF 文件作为 InputStream 获取,并且能够完美获取所有数据。

//targetFormat is "pdf"
public static byte[] downloadConvertedFile(GraphServiceClient<Request> graphClient, String fileId, String targetFormat) throws IOException, ClientException {
        try {
            InputStream stream = graphClient
                    .customRequest("/drives/" + driveId + "/items/" + fileId + "/content", InputStream.class)
                    .buildRequest(new QueryOption("format", targetFormat))
                    .get()
            if (stream != null) {
                return IOUtils.toByteArray(stream)
            }
        }catch(Exception ex){
            throw new IOException("Failed to read file from response");
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.