定制 r2soft/toolkit 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

r2soft/toolkit

Composer 安装命令:

composer require r2soft/toolkit

包简介

Toolkit utilitário em PHP puro (ex.: URL→PDF via Chrome headless, helpers diversos).

README 文档

README

Biblioteca utilitária em PHP para gerar PDFs a partir de URLs usando Google Chrome/Chromium em modo headless e para mesclar múltiplos PDFs usando Ghostscript. Foco em simplicidade: sem exceptions; sempre retorna um objeto de resultado com sucesso/erro e metadados.

Principais recursos:

  • URL → PDF com fallback: tenta baixar PDF nativo (Content-Type: application/pdf) e, se não for, renderiza a página com Chrome headless.
  • Mescla de PDFs: junta vários PDFs em um único arquivo usando Ghostscript (ou pdfunite opcionalmente).
  • API simples via classes R2Soft\Toolkit\UrlToPdf e R2Soft\Toolkit\PdfMerge.
  • Scripts de teste/uso prático em tests/.

Requisitos

Ambiente mínimo:

  • PHP 7.4+ com extensão cURL
  • Sistema operacional Linux (recomendado) ou compatível
  • Google Chrome ou Chromium instalados (para gerar PDF a partir de HTML/URL)
  • Ghostscript (gs) instalado (para mesclar PDFs)

Opcional:

  • pdfunite (pacote poppler-utils) caso prefira usar esse engine de mescla em vez de Ghostscript

Pacotes em Debian/Ubuntu (exemplo):

  • Chrome: via repositório oficial do Google (veja Dockerfile para referência) ou instale chromium.
  • Ghostscript: apt-get install -y ghostscript
  • pdfunite (opcional): apt-get install -y poppler-utils

Observação: O Dockerfile incluído já prepara um ambiente com Chrome e Ghostscript prontos para uso.

Instalação

Via Composer (em um projeto seu):

  1. composer require r2soft/toolkit
  2. Inclua o autoload do Composer: require 'vendor/autoload.php';

Neste repositório (local):

  • composer install

Como funciona (visão geral)

  • UrlToPdf::make($url, $returnBase64, $options) → gera um PDF a partir da URL informada.

    • Primeiro tenta baixar diretamente um PDF (Content-Type application/pdf) respeitando headers/cookies opcionais.
    • Se não for PDF, chama o Google Chrome/Chromium em modo headless para imprimir a página em PDF.
    • Retorna UrlToPdfResult com:
      • success: bool
      • pdf: string (binário) ou base64, conforme parâmetro $returnBase64
      • error: string (mensagem de erro, quando falha)
      • meta: array (metadados como source: direct|chrome, status HTTP etc.)
  • PdfMerge::fromUrls($urls, $returnBase64, $options) → gera PDFs individuais a partir de cada URL e depois mescla em um único PDF usando Ghostscript (por padrão).

    • Também retorna UrlToPdfResult com o PDF final (binário ou base64) e metadados.

Uso rápido (PHP)

Gerar PDF de uma URL:

use R2Soft\Toolkit\UrlToPdf;

$res = UrlToPdf::make('https://example.com', false, [
    'chrome'          => '/usr/bin/google-chrome', // opcional; também pode usar CHROME_BIN
    'timeout'         => 60,                        // em segundos
    'chrome_scale'    => 1.0,                       // fator de escala do Chrome (opcional)
    'try_direct_pdf'  => true,                      // tenta Content-Type: application/pdf antes do Chrome
    // 'headers'      => ['Accept-Language' => 'pt-BR,pt;q=0.9'],
    // 'cookies'      => 'a=1; b=2',
]);

if ($res->success) {
    file_put_contents('saida.pdf', $res->pdf); // binário
} else {
    error_log('Falha: ' . $res->error);
}

Mesclar PDFs a partir de várias URLs:

use R2Soft\Toolkit\UrlToPdf;

$urls = [
  'https://example.com',
  'https://iana.org',
];

$res = UrlToPdf::mergeUrls($urls, false, [
    'chrome'         => '/usr/bin/google-chrome',
    'timeout'        => 60,
    'try_direct_pdf' => true,
]);

if ($res->success) {
    file_put_contents('mesclado.pdf', $res->pdf); // binário do PDF final
} else {
    error_log('Falha: ' . $res->error);
}

Opções suportadas (chaves do array $options)

  • chrome: string|null
    • Caminho para o binário do Chrome/Chromium. Se não informar, a biblioteca tenta achar automaticamente.
    • Também é possível definir via variável de ambiente CHROME_BIN.
  • timeout: int (padrão: 60)
    • Tempo máximo, em segundos, para cada operação (HTTP/Chrome).
  • chrome_scale: float|null
    • Fator de escala do Chrome (ex.: 1.25). Opcional.
  • headers: array<string,string>
    • Headers adicionais para a tentativa de PDF nativo (HTTP GET). O Accept padrão já privilegia PDF.
  • cookies: string|null
    • Cabeçalho Cookie enviado no HTTP GET (ex.: "a=1; b=2").
  • try_direct_pdf: bool (padrão: true)
    • Se true, tenta baixar PDF nativo antes de renderizar com Chrome.
  • cache_dir: string|null e cache_ttl: int
    • Se definidos, habilita cache simples de PDFs por URL por cache_ttl segundos.

Dependências externas em destaque

  • Google Chrome/Chromium: necessário para renderizar HTML→PDF quando a URL não retorna PDF nativo.
    • Pode apontar o binário via options['chrome'] ou variável de ambiente CHROME_BIN.
    • Em containers, normalmente em /usr/bin/google-chrome.
  • Ghostscript (gs): necessário para mesclar vários PDFs em um só.
    • Usado por padrão em PdfMerge::mergeFiles e em UrlToPdf::mergeUrls (indiretamente).
  • pdfunite (opcional): engine alternativo de mescla. Para usá-lo diretamente, chame PdfMerge::mergeFiles($paths, 'pdfunite').

Uso via scripts de teste (CLI)

O repositório inclui scripts simples em tests/ para facilitar testes rápidos:

1) Gerar um único PDF de uma URL:

php tests/url-to-pdf-test.php "https://example.com"
  • Saída padrão: tests/out.pdf
  • Define o Chrome com a variável de ambiente CHROME_BIN, se necessário:
CHROME_BIN=/usr/bin/google-chrome php tests/url-to-pdf-test.php "https://example.com"

2) Mesclar PDFs de várias URLs:

php tests/merge-urls-test.php --engine=gs https://example.com https://iana.org
  • Engines aceitas: gs (padrão) ou pdfunite
  • Saída padrão: tests/out-merged.pdf
  • Opção --base64 retorna o PDF final em base64 (o script já salva em binário para facilitar)

Execução com Docker

Você pode usar o docker-compose incluído, que já prepara um ambiente com Chrome e Ghostscript:

  • Build e subir serviço:
docker compose up -d --build
  • Instalar dependências do Composer (já é feito pelo command do compose) e executar os testes:
docker compose exec app bash -lc "php -v && composer install && php tests/url-to-pdf-test.php https://example.com && php tests/merge-urls-test.php https://example.com https://iana.org"
  • Os arquivos gerados (tests/out.pdf e tests/out-merged.pdf) ficam mapeados no diretório local.

Dicas para Chrome no Docker:

  • O projeto configura variáveis HOME/XDG_* para diretórios temporários e evita user-data-dir fixo para reduzir travas SingletonLock.
  • Flags usadas: --headless=new, --no-sandbox, --disable-dev-shm-usage, etc.

Solução de problemas (troubleshooting)

  • Chrome/Chromium não encontrado:
    • Defina CHROME_BIN com o caminho do binário (ex.: /usr/bin/google-chrome).
    • No Linux, verifique também google-chrome-stable, chromium ou chromium-browser.
  • Erro ao mesclar PDFs: "Ghostscript (gs) não encontrado":
    • Instale: apt-get install -y ghostscript.
    • Alternativa: use pdfunite (apt-get install -y poppler-utils) e chame o engine 'pdfunite'.
  • PDF muito pequeno ou inválido:
    • Verifique se a página requer autenticação ou precisa de headers/cookies específicos.
    • Ajuste 'timeout' e teste novamente.
  • Ambiente de container travando Chrome:
    • Garanta que as libs listadas no Dockerfile estão presentes (libnss3, libgbm1, libx11, etc.).
    • Use --no-sandbox e --disable-dev-shm-usage (o projeto já aplica).

Estrutura das classes principais

  • R2Soft\Toolkit\UrlToPdf

    • make($url, $returnBase64 = true, array $options = []): UrlToPdfResult
    • mergeUrls(array $urls, $returnBase64 = true, array $options = []): UrlToPdfResult (atalho para PdfMerge::fromUrls)
  • R2Soft\Toolkit\PdfMerge

    • fromUrls(array $urls, $returnBase64 = true, array $options = []): UrlToPdfResult
    • mergeFiles(array $pdfPaths, string $engine = 'gs'): UrlToPdfResult
  • R2Soft\Toolkit\UrlToPdfResult

    • success: bool
    • pdf: string|null (binário ou base64)
    • error: string
    • meta: array

Licença

MIT License (c) 2025 R2 Soft

r2soft/toolkit 适用场景与选型建议

r2soft/toolkit 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 43 次下载、GitHub Stars 达 0, 最近一次更新时间为 2025 年 09 月 26 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「toolkit」 「pdf」 「headless」 「chrome」 「html-to-pdf」 「r2soft」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 r2soft/toolkit 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 r2soft/toolkit 我们能提供哪些服务?
定制开发 / 二次开发

基于 r2soft/toolkit 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 43
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 13
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2025-09-26