pythonpdfmergeconvertapi

Merging PDFs in python using convertapi


I'm trying to use the module convertapi to merge PDFs in Python3.8. I've tried multiple ways but I'm unable to figure out the origin of the returned error. Here is my function:

def merger(output_path, input_paths):

    dictFiles = {}
    for i,path in enumerate(input_paths):
        dictFiles[f'File[{i}]'] = path

    convertapi.api_secret = 'my-api-secret'
    result = convertapi.convert('merge', dictFiles, from_format = 'pdf')
    result.save_files(output_path)

And here is the error that is returned:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python\Python38\lib\site-packages\convertapi\client.py", line 46, in handle_response
    r.raise_for_status()
  File "C:\Python\Python38\lib\site-packages\requests\models.py", line 941, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: 
https://v2.convertapi.com/convert/pdf/to/merge?Secret=my-api-secret

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  ...
  File "D:\Desktop\merger.py", line 46, in merger
    result = convertapi.convert('merge', dictFiles, from_format = 'pdf')
  File "C:\Python\Python38\lib\site-packages\convertapi\api.py", line 7, in convert
    return task.run()
  File "C:\Python\Python38\lib\site-packages\convertapi\task.py", line 26, in run
    response = convertapi.client.post(path, params, timeout = timeout)
  File "C:\Python\Python38\lib\site-packages\convertapi\client.py", line 16, in post
    return self.handle_response(r)
  File "C:\Python\Python38\lib\site-packages\convertapi\client.py", line 49, in handle_response
    raise ApiError(r.json())
convertapi.exceptions.ApiError: Parameter validation error. Code: 4000. {'Files': ['Files array item 
count must be greater than 0.']}

I am suspecting the error to come from the fact that the dict is created before the merging because when entering directly the dictionary in the covertapi.convert(), I'm not getting the same error:

def merger(output_path, input_paths):
    convertapi.api_secret = 'my-api-secret'
    convertapi.convert('merge', {
        'Files[0]': 'path/to/file1.pdf',
        'Files[1]': 'path/to/file2.pdf'
    }, from_format = 'pdf').save_files(output_path)

Here a different error:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python\Python38\lib\site-packages\convertapi\client.py", line 46, in handle_response
    r.raise_for_status()
  File "C:\Python\Python38\lib\site-packages\requests\models.py", line 941, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 500 Server Error: Internal Server Error for url:         
https://v2.convertapi.com/convert/pdf/to/merge?Secret=my-api-secret

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  ...
  File "D:\Desktop\merger.py", line 50, in merger
    convertapi.convert('merge', {
  File "C:\Python\Python38\lib\site-packages\convertapi\api.py", line 7, in convert
    return task.run()
  File "C:\Python\Python38\lib\site-packages\convertapi\task.py", line 26, in run
    response = convertapi.client.post(path, params, timeout = timeout)
  File "C:\Python\Python38\lib\site-packages\convertapi\client.py", line 16, in post
    return self.handle_response(r)
  File "C:\Python\Python38\lib\site-packages\convertapi\client.py", line 49, in handle_response
    raise ApiError(r.json())
convertapi.exceptions.ApiError: Unable to download remote file. Code: 5007.

Note that here I'm note using PyPDF2 to merge files because I'm having some errors when the file contains some specific characters (mostly chinese characters).


Solution

  • If you will go to https://www.convertapi.com/pdf-to-merge and scroll down you easily will find snippet builder and amount all programming snippets you will find Python one.

    convertapi.api_secret = 'Your_secret'
    convertapi.convert('merge', {
        'Files[0]': '/path/to/dpa.pdf',
        'Files[1]': '/path/to/sample.pdf'
    }, from_format = 'pdf').save_files('/path/to/dir')
    

    And if you take some time to analyze snippet you will find that plural is used for Files array and not singular like in your code.

    def merger(output_path, input_paths):
    
        dictFiles = {}
        for i,path in enumerate(input_paths):
            dictFiles[f'File[{i}]'] = path
    
        convertapi.api_secret = 'my-api-secret'
        result = convertapi.convert('merge', dictFiles, from_format = 'pdf')
        result.save_files(output_path)
    
    convertapi.exceptions.ApiError: Parameter validation error. Code: 4000. {'Files': ['Files array item 
    count must be greater than 0.']}
    

    As for the second error, you didn't provide the code so I can't help you.