W tym samouczku podaję przykład łączenia/łączenia wielu plików PDF w jeden plik PDF w Oracle przy użyciu pakietu PLPDF_TOOLKIT PL/SQL.
Załóżmy, że masz tabelę dla pracowników z polem BLOB i dla każdego pracownika tę tabelę zawierającą wiele dokumentów w formacie PDF i chcesz połączyć wszystkie te dokumenty pracownika w jeden dokument i zapisać go w polu BLOB innej tabeli.
Możesz sprawdzić moje poprzednie posty, jak zapisywać pliki PDF w kolumnie BLOB, poniżej znajduje się lista:
- Jak pobrać BLOB z pliku w PL/SQL?
- Jak zapisać BLOB jako plik w PL/SQL?
- Jak pobrać plik z BLOB w Oracle?
Z wyżej wymienionych postów dowiesz się, jak zapisać pojedynczy plik PDF i wyodrębnić dane BLOB zawierające pojedynczy plik PDF. Tutaj dowiesz się, jak połączyć wiele plików PDF w jeden plik PDF i przechowywać w BLOB.
Scal/połącz wiele plików PDF w jeden plik PDF za pomocą funkcji PLPDF_TOOLKIT.MERGE
Poniżej przedstawiono prostą strukturę tabeli pracowników, która zawiera wiele plików PDF (w wielu rekordach) przechowywanych w BLOB dla każdego pracownika. Z tej tabeli otrzymamy pliki do scalenia. W celu przetestowania utwórz tę tabelę i wstaw kilka rekordów (plików PDF) dla numeru pracownika 76465:
1. Utwórz tabelę źródłową
Create Table Emp_Docs ( empno number, blob_data blob );
2. Utwórz tabelę do przechowywania scalonych plików PDF
Teraz utwórz tabelę do przechowywania scalonych plików PDF dla pracownika:
Create Table Emp_Pdfs ( empno number, merged_pdf blob );
3. Utwórz program PL/SQL do scalania plików PDF
Następnie uruchom następujący kod PL/SQL, aby pobrać pliki PDF dla pracownika 76465, scal je w jeden plik PDF i zapisz go w tabeli Emp_Pdfs. Aby wykonać to zadanie, używam funkcji PLPDF_TOOLKIT.MERGE.
Declare
l_Blob1 BLOB;
l_Blob2 BLOB;
l_Blob3 BLOB;
CURSOR Cur_empDocs IS
SELECT blob_data,
Rownum Row_n
FROM emp_docs
WHERE empno = 76465;
n_Count INTEGER := 0;
BEGIN
FOR c IN Cur_empDocs LOOP
IF c.row_n = 1 THEN
Dbms_Lob.Createtemporary(Lob_Loc => l_Blob1,
Cache => TRUE,
Dur => Dbms_Lob.Call);
l_Blob1 := c.blob_data;
ELSE
Dbms_Lob.Createtemporary(Lob_Loc => l_Blob2,
Cache => TRUE,
Dur => Dbms_Lob.Call);
l_Blob2 := c.blob_data;
Dbms_Lob.Createtemporary(Lob_Loc => l_Blob3,
Cache => TRUE,
Dur => Dbms_Lob.Call);
l_Blob3 := Plpdf_Toolkit.Merge(l_Blob1,
l_Blob2);
l_Blob1 := l_Blob3;
END IF;
n_Count := n_Count + 1;
END LOOP;
IF n_Count > 0 THEN
insert into emp_pdfs (empno, merged_pdf) values (76465, l_blob1);
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
raise;
END; Na przykład, jeśli w 3 rekordach dla pracownika 76465 znajdują się 3 pliki PDF, zostaną one połączone w jeden plik PDF. Nawet jeśli dla pracownika istnieje tylko jeden dokument PDF, zachowa on jedyny.
Możesz wysłać zapytanie do tabeli Emp_Pdfs, aby zobaczyć wynik.
Zobacz też:
- Wyświetlaj zawartość BLOB (PDF, obrazy) w regionie na stronie Oracle Apex
- Jak utworzyć raport PDF za pomocą PL/SQL