Re: Decoding PDF data from a web service

Daniel Gross <[email protected]> Fri, 13 Mar 2026 21:02:32 +0100
Newsgroups gmane.comp.lang.as400.rpg
Message-ID <[email protected]>
This looks very cool - and pretty straight forward. 

As the QSYS2 functions are implemented in C/C++ mostly, I think it should be quite fast. But if you want to be sure, try running it a few times in a loop, and benchmark it. 

Cool that I could help you a little. 

Regards,
Daniel


> Am 13.03.2026 um 19:37 schrieb Greg Wilburn <[email protected]>:
> 
> Pretty slick... it can be done in a few lines of code:
> 
>  dcl-s  encoded_clob   sqltype(CLOB:1000000) ccsid(*utf8);
> 
>  encoded_clob_data = json.data.node.packingSlipPdfData;
> 
>  pdfFile = '/myfolder/packslips/mypackslip.pdf';
> 
>  Exec Sql
>    Call IFS_WRITE_BINARY(
>        path_name => :pdfFile,
>        line      => base64_decode(:encoded_clob),
>        overwrite => 'REPLACE'
>        );
> 
> Not sure what the overhead will be (this will run a few hundred times a day).  But it works great!
> 
> 
> 
> -----Original Message-----
> From: RPG400-L <[email protected]> On Behalf Of Daniel Gross
> Sent: Friday, March 13, 2026 2:07 PM
> To: [email protected]
> Subject: Re: Decoding PDF data from a web service
> 
> Greg,
> 
> seems like something simple - but I don't have access to a machine right now.
> 
> I can try over the weekend, and send you a resolution.
> 
> Regards,
> Daniel
> 
> 
>> Am 13.03.2026 um 18:45 schrieb Greg Wilburn <[email protected]>:
>> 
>> Daniel,
>> 
>> Thanks... actually, I tried that first (using AI example) to decode and write to the IFS.  I got an SQLSTATE of 22501 and gave up.
>> 
>> I tried your code below... it gives a SQL precompile error:
>> SQL0303: Position 32 Variable DECODED_CLOB not compatible or value too long.
>> 
>> I have it defined exactly as below (I'm on v7r5)
>> 
>> TIA,
>> Greg
>> 
>> 
>> 
>> -----Original Message-----
>> From: RPG400-L <[email protected]> On Behalf Of Daniel Gross
>> Sent: Friday, March 13, 2026 12:39 PM
>> To: [email protected]
>> Cc: [email protected]
>> Subject: Re: Decoding PDF data from a web service
>> 
>> Hi Greg,
>> 
>> I know I sound like a broken record here on the mailing list - but have you tried it with SQL? If the string gets decoded by the online decoder, it might be possible, that there is a problem with the decoding procedure.
>> 
>> As the strings are quite large, you will average to use CLOBs, as SQL only supports VARCHAR up to a length of 32739 bytes.
>> 
>> So it might be an an idea to try:
>> 
>>  dcl-s encoded_clob sqltype(clob:1000000) ccsid(*utf8) inz;
>>  dcl-s decoded_clob sqltype(clob:1000000) ccsid(*utf8) inz;
>> 
>>  encoded_clob_data = json.data.node.packingSlipPdfData;
>>  encoded_clob_len = %len(json.data.node.packingSlipPdfData);
>> 
>>  exec sql set :decoded_clob = base64_decode(:encoded_clob);
>> 
>>  base64decoded = %subst(decoded_clob_data:1:decoded_clob_len);
>> 
>> Or you can even use SQL to write the decoded data directly to your IFS file.
>> 
>> HTH
>> Daniel
>> 
>> 
>>>> Am 13.03.2026 um 17:19 schrieb Greg Wilburn <[email protected]>:
>>> 
>>> I have done this quite a few times before, so I'm not sure why I'm struggling so much with this...
>>> 
>>> I'm getting a json document from a server that contains a base64 encoded string representing a packing slip... I'm able to copy the data from the webservice response file (JSON) on the IFS, and paste that into an online decoder.  That works.
>>> 
>>> But when I try to do he same in my program, I'm getting an error:
>>> " Unable to decode character at position 1. (Char=x'4A') "
>>> 
>>> Using the online decoder, indicating UTF8, it will decode.  Using the same decoder, selecting autodetect, it decodes differently indicating windows 1252?
>>> 
>>> Just wondering if anyone can spot any glaring errors in my code.  I've been looking at it all morning.  UGH.
>>> 
>>> // definitions
>>> 
>>> dcl-s  base64encoded  varchar(1000000) ccsid(*utf8) inz;
>>> dcl-s  base64decoded  char(1000000) inz;
>>> dcl-s  fd             int(10);
>>> 
>>> dcl-s  pdfFile        varchar(128) inz;
>>> dcl-s  pdfData        varchar(1000000) ccsid(*utf8) inz;
>>> 
>>> 
>>> // Decode Packslip Data
>>> base64Encoded = json.data.node.packingSlipPdfData;
>>> len = base64_decode( %addr(base64Encoded:*data)
>>>                   : %len(%trim(base64Encoded))
>>>                   : %addr(base64Decoded)
>>>                   : %size(base64Decoded)
>>>                   );
>>> pdfData = %subst(base64decoded:1:len);
>>> pdfFile = fldr + '/packslips/' + inCom + '_' + inOrd + '.pdf';
>>> 
>>> flag = o_wronly + o_creat + o_ccsid + o_excl;
>>> mode = s_irusr + s_iwusr + s_iroth + s_iwoth;
>>> fd = open(pdfFile:flag:mode:1208:0);           // PDF is UTF8
>>> rc = write( fd
>>>          : %addr(pdfData:*data)
>>>          : %len(pdfData));
>>> 
>>> [Logo]<https://protect.checkpoint.com/v2/r01/___https://www.totalbizfulfillment.com/___.YzJ1OnRvdGFsYml6ZnVsZmlsbG1lbnQxOmM6bzo1MWJhM2VhODNlZmFmNmFiNjIyOGYwMDI0MGQ2MDU1Yjo3OmUxNGQ6Yjg2YTA5NWMzZmRmNjE5NmY0MmEzMTFiNDgwMmQzYTA1NjA2OTQyZjAwODRlZjg5ZDFhMTQyZGJkMTgwMTJjMDpwOlQ6Rg>    Greg Wilburn
>>> Director of IT
>>> 301.895.3792 ext. 1231
>>> 301.895.3895 direct
>>> [email protected]<mailto:[email protected]>
>>> 1 Corporate Dr
>>> Grantsville, MD 21536
>>> https://protect.checkpoint.com/v2/r01/___www.totalbizfulfillment.com___.YzJ1OnRvdGFsYml6ZnVsZmlsbG1lbnQxOmM6bzo1MWJhM2VhODNlZmFmNmFiNjIyOGYwMDI0MGQ2MDU1Yjo3OjMzOTQ6YTY1MjdhMDY5ZDNkYzJlYmUyNjAyMThmYTAzMTY3N2FiMWIwM2EzMDY3NmQ3OTA1NDdmOWM0ODA1NTg4MDM3ZjpwOlQ6Rg<https://protect.checkpoint.com/v2/r01/___http://www.totalbizfulfillment.com___.YzJ1OnRvdGFsYml6ZnVsZmlsbG1lbnQxOmM6bzo1MWJhM2VhODNlZmFmNmFiNjIyOGYwMDI0MGQ2MDU1Yjo3OjVkYWU6MWMwMDE5ZmNiZDY5MzhmMWMyYzgwNmQyZDZhMDFmZDRhNjQ2OWNmYjc0ZDE4NDc0MWVjZGRmZmQyYmM3OTBkNDpwOlQ6Rg>
>>> --
>>> This is the RPG programming on IBM i (RPG400-L) mailing list
>>> To post a message email: [email protected]
>>> To subscribe, unsubscribe, or change list options,
>>> visit: https://protect.checkpoint.com/v2/r01/___https://lists.midrange.com/mailman/listinfo/rpg400-l___.YzJ1OnRvdGFsYml6ZnVsZmlsbG1lbnQxOmM6bzo1MWJhM2VhODNlZmFmNmFiNjIyOGYwMDI0MGQ2MDU1Yjo3Ojc0OTk6ZDUxNWM2YTdkOWRlNjY1N2I4MWJiYzliZGQ3NDFiMmRhN2YwYjBlOThkYTUzMDI0N2E5NTI0NDAwM2Y3NTU3ODpwOlQ6Rg
>>> or email: [email protected]
>>> Before posting, please take a moment to review the archives
>>> at https://protect.checkpoint.com/v2/r01/___https://archive.midrange.com/rpg400-l___.YzJ1OnRvdGFsYml6ZnVsZmlsbG1lbnQxOmM6bzo1MWJhM2VhODNlZmFmNmFiNjIyOGYwMDI0MGQ2MDU1Yjo3OjFiNjY6MDZhYWFiZDYwNDM3YmQxMjY2ZmQ1NmVkZTZmYWM3ODg5NjY3YmE1ZjRiZTg5ZTE2MjM0Y2M0Y2E2MDE0ZTQ0MjpwOlQ6Rg.
>>> 
>>> Please contact [email protected] for any subscription related questions.
>>> 
>> --
>> This is the RPG programming on IBM i (RPG400-L) mailing list
>> To post a message email: [email protected]
>> To subscribe, unsubscribe, or change list options,
>> visit: https://protect.checkpoint.com/v2/r01/___https://lists.midrange.com/mailman/listinfo/rpg400-l___.YzJ1OnRvdGFsYml6ZnVsZmlsbG1lbnQxOmM6bzo1MWJhM2VhODNlZmFmNmFiNjIyOGYwMDI0MGQ2MDU1Yjo3OjdiZWQ6NDZkNzI3OTQ2OWFhYjQ4MDBkMDg0OTE1MTMzNmZmYTc5YTJkZmJlNjU0MGUwOTY1ZjYyZGQ3YWFlOTFjNzBhODpwOlQ6Rg
>> or email: [email protected]
>> Before posting, please take a moment to review the archives
>> at https://protect.checkpoint.com/v2/r01/___https://archive.midrange.com/rpg400-l___.YzJ1OnRvdGFsYml6ZnVsZmlsbG1lbnQxOmM6bzo1MWJhM2VhODNlZmFmNmFiNjIyOGYwMDI0MGQ2MDU1Yjo3OjNhZmY6OTU0OGZkNjQzMzg3M2U2MTljNTk3NTFlYzQ2NDIzZGU0MDlkMzJjNGI4NTVmMWQ5MDAzODc1MzU3NDA0ZWU0NjpwOlQ6Rg.
>> 
>> Please contact [email protected] for any subscription related questions.
>> 
>> Greg Wilburn
>> Director of IT
>> 301.895.3792 ext. 1231
>> --
>> This is the RPG programming on IBM i (RPG400-L) mailing list
>> To post a message email: [email protected]
>> To subscribe, unsubscribe, or change list options,
>> visit: https://protect.checkpoint.com/v2/r01/___https://lists.midrange.com/mailman/listinfo/rpg400-l___.YzJ1OnRvdGFsYml6ZnVsZmlsbG1lbnQxOmM6bzoyYTJlZmQwMTMyZDE4MWM2YWM0ZGY5ODU0YTZjNWY3ODo3Ojc4ZDE6OWIwMGI4YTIzMTMzNTM4ZThjZDlkMjUyNWVjOTk0ZDJlYTE1YWIyMGU5NjA1YTRiMTgzNDFhZTQ1NmI4NTNlMzpwOlQ6Rg
>> or email: [email protected]
>> Before posting, please take a moment to review the archives
>> at https://protect.checkpoint.com/v2/r01/___https://archive.midrange.com/rpg400-l___.YzJ1OnRvdGFsYml6ZnVsZmlsbG1lbnQxOmM6bzoyYTJlZmQwMTMyZDE4MWM2YWM0ZGY5ODU0YTZjNWY3ODo3OjU4Njc6YjRlMjk5YmNhNjAyZjQ3MjkwNjc3ZTJmY2NmMjA1MThiYjUxYjJlNmY0ZDE4ZDE4Yzk1Y2M1MGZkMDNmYWQ5ODpwOlQ6Rg.
>> 
>> Please contact [email protected] for any subscription related questions.
>> 
> --
> This is the RPG programming on IBM i (RPG400-L) mailing list
> To post a message email: [email protected]
> To subscribe, unsubscribe, or change list options,
> visit: https://protect.checkpoint.com/v2/r01/___https://lists.midrange.com/mailman/listinfo/rpg400-l___.YzJ1OnRvdGFsYml6ZnVsZmlsbG1lbnQxOmM6bzoyYTJlZmQwMTMyZDE4MWM2YWM0ZGY5ODU0YTZjNWY3ODo3OmMxZDE6NDBjZTYzNmUzYzM3ZWU3ZDIwZTgwYThhNDU2NTQ2Y2ZmMmRjMzliNjE4MDQ3YjhkNDEwOTAxZjU4NDMyZjMyMDpwOlQ6Rg
> or email: [email protected]
> Before posting, please take a moment to review the archives
> at https://protect.checkpoint.com/v2/r01/___https://archive.midrange.com/rpg400-l___.YzJ1OnRvdGFsYml6ZnVsZmlsbG1lbnQxOmM6bzoyYTJlZmQwMTMyZDE4MWM2YWM0ZGY5ODU0YTZjNWY3ODo3Ojc1NmE6NjAwZWQ0NDBkNjU0OTM3NTlkMGYyMzIyOWE1NTZiODY1ZDVmOWZmYmNhMzE3MDlmYjVjM2RkYmFlMjliN2Q2YTpwOlQ6Rg.
> 
> Please contact [email protected] for any subscription related questions.
> 
> Greg Wilburn
> Director of IT
> 301.895.3792 ext. 1231
> --
> This is the RPG programming on IBM i (RPG400-L) mailing list
> To post a message email: [email protected]
> To subscribe, unsubscribe, or change list options,
> visit: https://lists.midrange.com/mailman/listinfo/rpg400-l
> or email: [email protected]
> Before posting, please take a moment to review the archives
> at https://archive.midrange.com/rpg400-l.
> 
> Please contact [email protected] for any subscription related questions.
> 
-- 
This is the RPG programming on IBM i (RPG400-L) mailing list
To post a message email: [email protected]
To subscribe, unsubscribe, or change list options,
visit: https://lists.midrange.com/mailman/listinfo/rpg400-l
or email: [email protected]
Before posting, please take a moment to review the archives
at https://archive.midrange.com/rpg400-l.

Please contact [email protected] for any subscription related questions.