首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自ByteArray响应的react-pdf?

来自ByteArray响应的react-pdf?
EN

Stack Overflow用户
提问于 2020-12-17 18:19:55
回答 2查看 1.1K关注 0票数 0

我正在尝试通过一个react typescript应用程序从我的java服务器请求一个PDF文件。然后尝试通过react-pdf显示此byte[]。

对服务器的请求如下所示:

代码语言:javascript
复制
const [invoice, setInvoice] = React.useState<any>()   

 const downloadPdf = (theInvoice: Invoice) => {
        store.app.cubaRest?.invokeService<any>('billing_InvoiceService', 'generateInvoiceDocument', { invoice: theInvoice })
            .then((response: any) => {
                console.log(response)
                let array= JSON.parse(response).content
                setInvoice(array)             
            }).finally(()=>{                
            })    
        }

代码语言:javascript
复制
 if (invoice) {
        console.log("there is invoice")
        return (
            <div>
                <Document
                    file={{ data: invoice }}
                    onLoadSuccess={onDocumentLoadSuccess}
                    onLoadError={console.error}
                >
                    <Page pageNumber={pageNumber} />
                </Document>
            </div>

来自上面的原始“响应”的控制台日志如下所示:

代码语言:javascript
复制
{"report":{"_entityName":"report$Report","id":"1dd6746f-3580-6e3c-3aa6-e3f5db0a290b","code":"default-invoice","roles":[],"defaultTemplate":{"id":"0de287de-1931-a375-d10f-70ae431a3ca7","content":"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBDcmVhdGVkIHdpdGggSmFzcGVyc29mdCBTdHVkaW8gdmVyc2lvbiA2LjE2LjAuZmluYWwgdXNpbmcgSmFzcGVyUmVwb3J0cyBMaWJyYXJ5IHZlcnNpb24gNi4xNi4wLTQ4NTc5ZDkwOWI3OTQzYjY0NjkwYzY1YzcxZTA3ZTBiODA5ODE5MjggIC0tPgo8amFzcGVyUmVwb3J0IHhtbG5zPSJodHRwOi8vamFzcGVycmVwb3J0cy5zb3VyY2Vmb3JnZS5uZXQvamFzcGVycmVwb3J0cyIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamFzcGVycmVwb3J0cy5z .......

当我从响应中设置状态时,页面只是继续重新渲染,pdf不显示。假设它正在对字节数组中的每个字节进行重新渲染。

不确定如何解决此问题。我也不确定我是否正确地向setInvoice发送了byte[]。或者byteArray的格式是否正确。

EN

回答 2

Stack Overflow用户

发布于 2020-12-17 19:07:43

是一个非常简单的解决方案。

而不是:

代码语言:javascript
复制
let array= JSON.parse(response).content
            setInvoice(array)    

执行以下操作:

代码语言:javascript
复制
setInvoice({data: JSON.parse(response).content});

代码语言:javascript
复制
 if (invoice) {
    return (
        <div>
            <Document
                file={invoice}
                onLoadSuccess={onDocumentLoadSuccess}
                onLoadError={console.error}
            >
                <Page pageNumber={pageNumber} />
            </Document>

        </div>
票数 0
EN

Stack Overflow用户

发布于 2021-06-08 22:43:21

下面是base64方法

1.给定pdf文件的base64字符串

代码语言:javascript
复制
const fileAsBase64 = || YOUR PDF FILE IN BASE64 AS STRING ||

字节数组2.将base64字符串转换为

代码语言:javascript
复制
export const base64ToArrayBuffer = (base64) => {
const binaryString = window.atob(base64); // Comment this if not using base64
const bytes = new Uint8Array(binaryString.length);
return bytes.map((byte, i) => binaryString.charCodeAt(i));
}

3.通过调用上述函数将byearray添加到组件

代码语言:javascript
复制
 <Document file={{ data :base64ToArrayBuffer(base64)}}/>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65338762

复制
相关文章

相似问题

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